установить права доступа к файлам для c: \ program files \ company \ app \ file для всех пользователей

2

У меня есть специальная программа установки, которая отлично работает, но она запрашивает у пользователя разрешение администратора каждый раз при обновлении приложения. Я создаю службу Windows, которая пропускает эту часть, но служба Windows предоставляет только файлы системных и администраторов для этого файла, и пользователь не может выполнять новые обновления.

Чтобы исправить это, я пытаюсь (после того, как файл загрузится/установится в нужное место (изнутри службы Windows он имеет учетную запись ServiceAccount.LocalSystem),

FileSecurity access = file.GetAccessControl();
SecurityIdentifier everyone = new SecurityIdentifier(WellKnownSidType.WorldSid, null);
access.AddAccessRule(new FileSystemAccessRule(everyone, FileSystemRights.ReadAndExecute, AccessControlType.Allow));

но настройка не вступает в силу. Что мне делать?

  • 0
    .. but it asks the user for admin permission every time it updates an application. - Разве это не должно?
  • 0
    По-старому да, но если вы загружаете через службу, которая уже работает от имени администратора, то нет. Если вы используете Google Chrome, он никогда не запрашивает разрешения на обновление. Проверьте свои службы для Google Update Service обновлений Google, которая обновляет Google Chrome, не обращая внимания на запросы о повышенных разрешениях на обновление.
Показать ещё 1 комментарий
Теги:
windows-services

2 ответа

4
Лучший ответ

Я понял это. Мне просто нужно было позвонить,

file.SetAccessControl(access);

после вышесказанного. По-видимому file.GetAccessControl передает копию управления доступом, а не тот, который управляет разрешениями файла для файла, пока вы не вызовете файл .SetAccessControl с измененными разрешениями.

Еще одно предостережение, которое я обнаружил с другим файлом, созданным службой в c:\ProgramData,

  • заключается в том, что набор должен произойти после того, как файл был записан. Применение набора к файлу заранее неэффективно.
3

Недавно я столкнулся с проблемой загрузки файлов из сети и хотел иметь возможность воссоздать ошибку в тесте и столкнулся с той же проблемой.

Я придумал следующий небольшой класс, чтобы помочь ему в этом, так как API для этого материала довольно ужасен и наполнен небольшими ловушками:

public class PermissionController
{
    private readonly string _file;
    private readonly FileSecurity _accessControl;
    private readonly SecurityIdentifier _id;
    private readonly List<FileSystemAccessRule> _permissionsDenied;

    public PermissionController(string file)
    {
        _file = file;
        _accessControl = File.GetAccessControl(_file);
        _id = WindowsIdentity.GetCurrent().Owner;
        _permissionsDenied = new List<FileSystemAccessRule>();
    }

    public void Allow(params FileSystemRights[] rights)
    {
        foreach (var right in rights)
            AddRule(Rule(right, AccessControlType.Allow));
    }

    public void Deny(params FileSystemRights[] rights)
    {
        foreach (var right in rights)
        {
            var rule = Rule(right, AccessControlType.Deny);
            AddRule(rule);
            _permissionsDenied.Add(rule);
        }
    }

    private void AddRule(FileSystemAccessRule rule)
    {
        _accessControl.AddAccessRule(rule);
    }

    private FileSystemAccessRule Rule(FileSystemRights right, AccessControlType type)
    {
        return new FileSystemAccessRule(_id, right, type);
    }

    public void RemoveDeniedPermissions()
    {
        foreach (var rule in _permissionsDenied)
            _accessControl.RemoveAccessRule(rule);

        Apply();
    }

    public void Apply()
    {
        File.SetAccessControl(_file,_accessControl);
    }
}

Вызывающий код выглядит так:

        _permissionController = new PermissionController(_file);
        _permissionController.Allow(FileSystemRights.Read, FileSystemRights.Write);
        _permissionController.Deny(FileSystemRights.FullControl,
                                   FileSystemRights.Modify,
                                   FileSystemRights.ReadAndExecute);
        _permissionController.Apply();

где _file - это полный путь.

Вам нужно быть осторожным, чтобы позвонить

File.SetAccessControl после добавления/удаления правил, поскольку в противном случае эффект не будет.

Если я неправильно понял API, вам нужно добавить правило на разрешение, потому что перечисление FileSystemRights не использует флаги.

Вам также нужно быть немного осторожным, так как разрешение права, которое вы отрицаете, не эквивалентно удалению правила, которое отрицает это право. Кажется, что запрещенные права переопределяют допустимые.

Вы можете просмотреть результаты, посмотрев вкладку безопасности свойств файла в проводнике Windows.

  • 0
    Это хорошо - я не могу использовать _id = WindowsIdentity.GetCurrent().Owner; потому что у службы нет владельца или, по крайней мере, нет пользователя. Спасибо за подсказку о необходимости удалить Denies, я не знал об этом.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню