C#从“高级安全设置”获取“应用于”信息的目录

我正在写一个应用程序,用于search文件夹的权限,并返回权限(例如完全控制,读取),访问控制types(如允许,拒绝)和应用信息(如本文件夹,子文件夹和文件) 。

我能够使用DirectoryInfo的GetAccessControl(DirectorySecurity)方法获取大部分这些信息。 但是,我无法准确获取目录的“应用到”信息。 经过大量的研究,我遇到了这个StackOverflow问题如何更改文件夹审计选项下的“适用于”字段以编程方式(.NET) ,这导致我这个全面的页面http://msmvps.com/blogs/p3net/pages/access- control-in-net.aspx,但是使用两者都指定的规则,我没有像在Windows资源pipe理器中那样获得相同的“应用到”权限。

应用于表格

(来自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资源pipe理器中查看这些权限时,我看到以下内容:

Windows Exlplorer适用于窗口 而当我用我的应用程序来查询相同的文件夹,我得到:

  • 身份:BUILTIN \ Administrators,权限:FullControl,AccessType:允许,ApplyTo: ThisFolderOnly

  • 身份:BUILTIN \ Administrators,权限:268435456,AccessType:允许,ApplyTo: SubfoldersAndFilesOnly

  • 身份:NT AUTHORITY \ SYSTEM,权限:完全控制,访问types:允许,应用到: ThisFolderOnly

  • 身份:NT AUTHORITY \ SYSTEM,权限:268435456,AccessType:允许,ApplyTo: SubfoldersAndFilesOnly

  • Identity:BUILTIN \ Users,权限:ReadAndExecute,同步,AccessType:允许,ApplyTo: ThisFolderSubfoldersAndFiles

  • 身份:NT AUTHORITY \ Authenticated Users,权限:修改,同步,AccessType:允许,ApplyTo: ThisFolderOnly

  • 身份:NT AUTHORITY \ Authenticated Users,权限:-536805376,AccessType:Allow,ApplyTo: SubfoldersAndFilesOnly

正如你所看到的,使用来自这些其他站点的规则,我的派生的ApplyTo与Windows资源pipe理器ApplyTo不匹配。

还有比这更多的吗? 我究竟做错了什么? 还有什么我需要解决Windows资源pipe理器报告相同的应用程序规则?

我也应该提到,这些结果来自我的开发PC,运行Windows 7 x64。 根据我们的用户,在他们的工作环境(Windows XP x86)上,他们观察到了正确的行为。 我对Windows权限知之甚less,不知道Windows 7 x64和Windows XP x86之间是否存在差异。

Solutions Collecting From Web of "C#从“高级安全设置”获取“应用于”信息的目录"

所有这些对我来说都是正确的。 我想尝试的一件事是,多年来,我已经学会了不要只检查标志

propagationFlags == PropagationFlags.None

Isntead,我倾向于使用

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

这使得我的代码更具弹性,如果在API字段的新版本出现时在位字段上显示新的标志。

这个原则适用于更复杂的表达式,比如

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

这是我马上要尝试的一件事。