微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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的表格)

哪些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类 – 如何指定本地主机?

找出当前用户用户名 – 当多个用户login时

沙盒AppDomain中的线程安全性

钩从窗口事件从AC#Windows服务应用程序不起作用

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

propagationFlags == PropagationFlags.None

Isntead,我倾向于使用

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

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

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

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

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐