我正在写一个应用程序,用于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的表格)
哪些Windows的程序或服务可能会改变文件的LastAccessed属性?
获取当前在Windows任务栏中可见的应用程序(或窗口)列表
修整string并将其转换为小写字符的最快方法
技术防止多个login到同一台计算机
找出键盘布局何时更改
这是我用来尝试和转换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理器中查看这些权限时,我看到以下内容:
身份: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之间是否存在差异。
如何debugging挂起的WPF应用程序?
C# – ScheduledTasks类 – 如何指定本地主机?
沙盒AppDomain中的线程安全性
钩从窗口事件从AC#Windows服务应用程序不起作用
所有这些对我来说都是正确的。 我想尝试的一件事是,多年来,我已经学会了不要只检查标志
propagationFlags == PropagationFlags.None
Isntead,我倾向于使用
(propagationFlags & PropagationFlags.None) == PropagationFlags.None
这使得我的代码更具弹性,如果在API字段的新版本出现时在位字段上显示新的标志。
这个原则适用于更复杂的表达式,比如
(inheritanceFlags & (InheritanceFlags.ContainerInherit | InheritanceFlags.ObjectInherit)) == (InheritanceFlags.ContainerInherit | InheritanceFlags.ObjectInherit)
这是我马上要尝试的一件事。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。