Невозможно изменить Perl ACL в C # в каталоге CommonAppDataPath - PullRequest
1 голос
/ 17 сентября 2009

Поэтому я пытаюсь изменить разрешения для группы BUILTIN \ Users, чтобы, по крайней мере, иметь право доступа для изменения файловой системы. К сожалению, мои попытки использовать приведенный ниже код дают неизменный ACL.

            SecurityIdentifier usersSecurityIdentifier = ntAccount.Translate(typeof(SecurityIdentifier)) as SecurityIdentifier;
            DirectorySecurity directorySecurity = Directory.GetAccessControl(source.FullName);
            FileSystemAccessRule accessRule 
                = new FileSystemAccessRule(@"BUILTIN\Users", FileSystemRights.FullControl, AccessControlType.Allow);

            directorySecurity.ModifyAccessRule(AccessControlModification.Add,
                accessRule,
                out modified);

            Console.WriteLine(modified);

Измененные отчеты имеют значение true в каждом случае, но разрешения не обновляются при просмотре их в свойствах папки.

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

Я пытаюсь изменить доступ к закрытому каталогу в Environment.SpecialFolders.CommonApplicationData, владельцем которого является учетная запись администратора. Я также пытаюсь изменить ACL как администратор.

Кто-нибудь знает, что не так с приведенным выше кодом или какие-либо ресурсы, которые могут привести меня к правильному способу настройки ACL с использованием нативных классов .NET?

1 Ответ

3 голосов
/ 19 сентября 2009

Я понял это с помощью друга, который работает в Microsoft. На самом деле процесс, который я использовал для установки ACL, был точным. Я неправильно интерпретировал результаты. По сути, это не проблема при настройке ACL для каталога таким образом, если вы пытаетесь внести изменения в качестве администратора.

Точные разрешения для папки были доступны для просмотра (в Vista):

  1. Щелкните правой кнопкой мыши нужную папку и выберите свойства
  2. Выберите вкладку Безопасность
  3. Нажмите Дополнительно
  4. Нажмите Редактировать
  5. Выберите объект, для которого вы хотите просмотреть разрешения, и нажмите «Изменить».

Это та часть, которую мне не хватало. Путь CommonApplicationData уже имеет разрешения, установленные для сущности BUILTIN \ Users. Так что после того, как я запустил свой код, я фактически получил две сущности. Один говорит «Читай и выполняй», а другой - «Специальные разрешения». Когда я редактирую сущность со специальными разрешениями, я фактически вижу, что у BUILTIN \ Users есть доступ к каталогу.

Я действительно искал, чтобы BUILTIN \ Users имел доступ к каталогу и всем его дочерним папкам и объектам. Вот фрагмент кода из того, что я в итоге использовал. Я смог подтвердить, что мой код работал как через тестовый набор, так и вручную, проверяя списки ACL для файлов и каталогов.

DirectorySecurity directorySecurity = Directory.GetAccessControl(Environment.GetFolderPath(Environment.SpecialFolder.CommonApplicationData));
FileSystemAccessRule accessRule
    = new FileSystemAccessRule(@"BUILTIN\Users", FileSystemRights.FullControl, 
        InheritanceFlags.ObjectInherit | InheritanceFlags.ContainerInherit, 
        PropagationFlags.None, 
        AccessControlType.Allow);

bool modified=false;
directorySecurity.ModifyAccessRule(AccessControlModification.Add,
    accessRule,
    out modified);

if (modified)
{
    source.Create(directorySecurity);
}
else
{
    source.Create();
}
...