установить права доступа к файлам для c: \ program files \ company \ app \ file для всех пользователей - PullRequest
2 голосов
/ 10 ноября 2011

У меня есть специальная программа установки, которая работала нормально, но она запрашивает у пользователя разрешение администратора каждый раз, когда обновляет приложение. Я создаю службу 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));

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

Ответы [ 2 ]

4 голосов
/ 10 ноября 2011

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

file.SetAccessControl(access);

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

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

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

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

Я придумал следующий небольшой класс, чтобы помочь с этим, так как 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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...