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

时间:2013-11-29 12:02:34

标签: c# .net windows permissions acl

我正在编写一个应用程序,用于搜索文件夹中的权限并返回详细信息,例如权限(例如完全控制,读取),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权限资源管理器。

Apply To Table

(来自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 Apply To Window 当我使用我的应用程序查询同一个文件夹时,我得到:

  • 身份: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之间是否存在差异。

1 个答案:

答案 0 :(得分:0)

所有这些对我来说都是正确的。我会尝试的一件事是,多年来,我学会了不用

来检查标志

propagationFlags == PropagationFlags.None

Isntead,我倾向于使用

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

如果新版本的API出现在比特字段上,则会使我的代码更具弹性。

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

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

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