C # Получить «Применить к» информацию из «Дополнительные параметры безопасности» для каталога

Я пишу приложение, которое используется для поиска по папкам для их разрешений и возврата данных, таких как права (например, полный доступ, чтение), AccessControlType (например, «Разрешить», «Запретить») и «Применить к информации» (например, «Эта папка, подпапки и файлы») ,

Большая часть этой информации я могу получить с помощью метода GetAccessControl (DirectorySecurity) DirectoryInfo. Однако я не могу точно получить информацию о приложении «Применить к каталогу». После долгих исследований я столкнулся с этим вопросом и ответом StackOverflow. Как изменить поле «Применяется к» в параметрах папок (программно) (.NET), что привело меня к этой всеобъемлющей странице http://msmvps.com/blogs/p3net/pages/access- control-in-net.aspx, но используя правила, которые оба указывают, я не получаю одинаковые права Применить к таким же, как в проводнике Windows.

Применить к таблице

(Таблица из http://msmvps.com/blogs/p3net/pages/access-control-in-net.aspx )

Это код, который я использую, чтобы попытаться преобразовать комбинацию InheritanceFlags и PropogationFlags:

private ApplyToType GetApplyToType(InheritanceFlags inheritanceFlags, PropagationFlags propagationFlags) { if (propagationFlags == PropagationFlags.None && inheritanceFlags == InheritanceFlags.None) return ApplyToType.ThisFolderOnly; if (propagationFlags == PropagationFlags.None && inheritanceFlags == InheritanceFlags.ContainerInherit) return ApplyToType.ThisFolderAndSubfolders; if (propagationFlags == PropagationFlags.None && inheritanceFlags == InheritanceFlags.ObjectInherit) return ApplyToType.ThisFolderAndFiles; if (propagationFlags == PropagationFlags.None && inheritanceFlags == (InheritanceFlags.ContainerInherit | InheritanceFlags.ObjectInherit)) return ApplyToType.ThisFolderSubfoldersAndFiles; if (propagationFlags == PropagationFlags.InheritOnly && inheritanceFlags == InheritanceFlags.ContainerInherit) return ApplyToType.SubfoldersOnly; if (propagationFlags == PropagationFlags.InheritOnly && inheritanceFlags == InheritanceFlags.ObjectInherit) return ApplyToType.FilesOnly; if (propagationFlags == PropagationFlags.InheritOnly && inheritanceFlags == (InheritanceFlags.ContainerInherit | InheritanceFlags.ObjectInherit)) return ApplyToType.SubfoldersAndFilesOnly; return ApplyToType.AndreDoesntKnow; } 

И следующий код используется для запроса каталогов:

 var directory = new DirectoryInfo(directoryPath); var accessControl = directory.GetAccessControl(AccessControlSections.Access); var rules = accessControl.GetAccessRules(includeExplicit, includeInherited, targetType); foreach (FileSystemAccessRule rule in rules) { var applyToType = GetApplyToType(rule.InheritanceFlags, rule.PropagationFlags); Console.WriteLine(string.Format("Identity:{0}, Rights:{1}, AccessType:{2}, ApplyTo:{3}", rule.IdentityReference, rule.FileSystemRights, rule.AccessControlType, applyToType)); } 

Однако, когда я смотрю эти разрешения в проводнике Windows, я вижу следующее:

Windows Exlplorer Применить к окну И когда я использую свое приложение для запроса одной и той же папки, я получаю:

  • Identity: BUILTIN \ Administrators, Права: FullControl, AccessType: Allow, ApplyTo: ThisFolderOnly

  • Идентификатор: BUILTIN \ Администраторы, Права: 268435456, AccessType: Разрешить, ApplyTo: ПодпапкиAndFilesOnly

  • Идентификация: NT AUTHORITY \ SYSTEM, Права: FullControl, AccessType: Разрешить, ApplyTo: ThisFolderOnly

  • Идентификация: NT AUTHORITY \ SYSTEM, Права: 268435456, AccessType: Разрешить, ApplyTo: ПодпапкиAndFilesOnly

  • Identity: BUILTIN \ Users, Rights: ReadAndExecute, Synchronize, AccessType: Allow, ApplyTo: ThisFolderSubfoldersAndFiles

  • Identity: NT AUTHORITY \ Authenticated Users, Rights: Modify, Synchronize, AccessType: Allow, ApplyTo: ThisFolderOnly

  • Identity: NT AUTHORITY \ Authenticated Users, Права: -536805376, AccessType: Разрешить, ApplyTo: ПодпапкиAndFilesOnly

Как вы можете видеть, используя правила с этих других сайтов, мой производный ApplyTo не соответствует проводнику Windows ApplyTo.

Есть ли еще больше, чем это? Что я делаю неправильно? Что еще мне нужно, чтобы разрешить те же правила ApplyTo, что и отчеты Windows Explorer?

Я должен также упомянуть, что эти результаты были получены с моего ПК разработки под управлением Windows 7 x64. Согласно нашим пользователям, в рабочей среде (Windows XP x86) они соблюдают правильное поведение. Я не знаю достаточно о разрешениях Windows, чтобы узнать, есть ли различия между ними между Windows 7 x64 и Window XP x86.

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

propagationFlags == PropagationFlags.None

Иснтед, я склонен использовать

(propagationFlags & PropagationFlags.None) == PropagationFlags.None

Это делает мой код более устойчивым, если появятся новые флаги в битовых полях, когда появятся новые версии API.

Этот принцип применяется даже при более сложных выражениях, таких как

(inheritanceFlags & (InheritanceFlags.ContainerInherit | InheritanceFlags.ObjectInherit)) == (InheritanceFlags.ContainerInherit | InheritanceFlags.ObjectInherit)

Это единственное, что я попробую сразу.