我正在编写一个应用程序,用于搜索文件夹中的权限并返回详细信息,例如权限(例如完全控制,读取),AccessControlType(例如允许,拒绝)和应用到信息(例如,此文件夹,子文件夹)和文件)。
我可以使用DirectoryInfo的GetAccessControl(DirectorySecurity)方法获取大部分此类信息。但是,我无法准确获取目录的“应用于”信息。经过大量研究后,我遇到了这个StackOverflow Q& A How to change the "Applies To" field under folder auditing options programatically (.NET),它引导我进入了这个全面的页面http://msmvps.com/blogs/p3net/pages/access-control-in-net.aspx,但是使用了两者都指定的规则,我没有像在Windows中那样获得相同的Apply To权限资源管理器。
(来自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资源管理器中查看这些权限时,我会看到以下内容:
当我使用我的应用程序查询同一个文件夹时,我得到:
身份:BUILTIN \ Administrators,权限:FullControl, AccessType:允许,ApplyTo: ThisFolderOnly
Identity:BUILTIN \ Administrators,Rights:268435456,AccessType:Allow, ApplyTo:的 SubfoldersAndFilesOnly
身份:NT AUTHORITY \ SYSTEM,权限:FullControl,AccessType:允许, ApplyTo:的 ThisFolderOnly
身份:NT AUTHORITY \ SYSTEM,权利:268435456,AccessType:允许, ApplyTo:的 SubfoldersAndFilesOnly
身份:BUILTIN \ Users,权限:ReadAndExecute,Synchronize, AccessType:允许,ApplyTo: ThisFolderSubfoldersAndFiles
身份:NT AUTHORITY \ Authenticated Users,Rights:Modify, 同步,AccessType:允许,ApplyTo: ThisFolderOnly
身份:NT AUTHORITY \ Authenticated Users,Rights:-536805376, AccessType:允许,ApplyTo:子文件夹和文件仅
如您所见,使用这些其他网站的规则,我的派生ApplyTo与Windows资源管理器ApplyTo不匹配。
还有更多吗?我究竟做错了什么?我还需要解决Windows资源管理器报告的相同ApplyTo规则吗?
我还应该提到这些结果来自我的运行Windows 7 x64的开发PC。根据我们的用户,在他们的工作环境(Windows XP x86)中,他们会观察到正确的行为。我不太了解Windows权限,知道Windows 7 x64和Window XP x86之间是否存在差异。
答案 0 :(得分:0)
所有这些对我来说都是正确的。我会尝试的一件事是,多年来,我学会了不用
来检查标志 propagationFlags == PropagationFlags.None
Isntead,我倾向于使用
(propagationFlags & PropagationFlags.None) == PropagationFlags.None
如果新版本的API出现在比特字段上,则会使我的代码更具弹性。
这个原则适用于更复杂的表达式,例如
(inheritanceFlags & (InheritanceFlags.ContainerInherit | InheritanceFlags.ObjectInherit)) == (InheritanceFlags.ContainerInherit | InheritanceFlags.ObjectInherit)
这是我马上尝试的一件事。