2009-09-11 2 views
6

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

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. Это очень раздражает, так как я хотел бы предоставить моим пользователям полные разрешения на то, чтобы делать все с помощью тестового каталога.

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

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

С уважением
Трис

+0

ПОДПАПКИ является дочерним объектом испытаний, так он наследует правила Test в , А не наоборот. Вы пытались создать ACL на Test? –

ответ

14

Для папки:

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, которые применяются к этой папке, вложенным папкам и файлам

+0

хороший, спасибо! –

7

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

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

Параметр PropagationFlags.InheritOnly используется ОР в их исходном коде, что предотвращает правило доступа от применения к самому объекту.

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

Directory.CreateDirectory(dir, security); 

 Смежные вопросы

  • Нет связанных вопросов^_^