C # - Windows ACL - Применение унаследованных разрешений - PullRequest
6 голосов
/ 11 сентября 2009

У меня были проблемы с программным назначением разрешений для папок / записей реестра. Мне удалось назначить права наследования, используя следующий код:

FileSystemAccessRule rule = new FileSystemAccessRule(LOGON_USER_NAME, FileSystemRights.FullControl, InheritanceFlags.ContainerInherit | InheritanceFlags.ObjectInherit, PropagationFlags.InheritOnly, AccessControlType.Allow);

DirectorySecurity security = new DirectorySecurity(); 
security.SetAccessRule(rule);

Directory.CreateDirectory(dir);
Directory.SetAccessControl(dir, security);

Это правильно устанавливает мои права доступа ко всем дочерним папкам, которые я создаю как администратор. Однако он не устанавливает разрешения для самой папки dir. Я немного поигрался с наследием и распространением, но не испытывал радости.

Например, у меня есть:

dir = %programfiles%\Test

Если я создал папку в тесте (%programfiles%\Test\SubFolder), у меня есть полные права доступа, назначенные для моего пользователя, но у меня нет полных разрешений для %programfiles%\Test. Это действительно раздражает, так как я хотел бы дать моему пользователю полные полномочия делать что-либо и с каталогом Test.

У меня похожие проблемы с разрешениями реестра, но я считаю, что если я смогу их решить, то смогу решить обе нерешенные проблемы.

Кто-нибудь знает, как это можно решить?

Привет
Трис

Ответы [ 2 ]

14 голосов
/ 07 октября 2009

Для папки:

FileSystemAccessRule rule = new FileSystemAccessRule(LOGON_USER_NAME, 
    FileSystemRights.FullControl, AccessControlType.Allow);

Для подпапок и файлов:

FileSystemAccessRule rule = new FileSystemAccessRule(LOGON_USER_NAME,
    FileSystemRights.FullControl, InheritanceFlags.ContainerInherit |  
    InheritanceFlags.ObjectInherit, PropagationFlags.InheritOnly, 
    AccessControlType.Allow);

обе строки должны быть в вашем проекте. тогда вы получите acls, которые относятся к этой папке, подпапкам и файлам

9 голосов
/ 11 апреля 2012

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

FileSystemAccessRule rule = new FileSystemAccessRule(LOGON_USER_NAME,
    FileSystemRights.FullControl,
    InheritanceFlags.ContainerInherit | InheritanceFlags.ObjectInherit,
    PropagationFlags.None, 
    AccessControlType.Allow);

Параметр PropagationFlags.InheritOnly, используемый OP в их исходном коде, запрещает применение правила доступа к самому объекту.

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

Directory.CreateDirectory(dir, security);
...