如何查看是否取消选中文件或文件夹的“包括可继承权限”

本文关键字:包括 可继承 权限 文件夹 是否 何查看 取消 文件 中文 | 更新日期: 2023-09-27 18:30:27

我正在用 C# 编写一个小实用程序来确保指定的文件夹及其所有内容具有适当的访问权限(我想授予Authenticated Users组完全访问权限)。以下代码似乎可以正常工作,以更新顶级文件夹的ACL(访问控制列表):

SecurityIdentifier allUsers = new SecurityIdentifier(WellKnownSidType.AuthenticatedUserSid, null);
InheritanceFlags iFlags = InheritanceFlags.ContainerInherit | InheritanceFlags.ObjectInherit;
FileSystemAccessRule newRule = new FileSystemAccessRule(allUsers,
    FileSystemRights.FullControl, iFlags,
    PropagationFlags.None, AccessControlType.Allow);
DirectoryInfo info = new DirectoryInfo(folderPath);
DirectorySecurity security = info.GetAccessControl();
security.AddAccessRule(newRule);
info.SetAccessControl(security);

但是,我注意到此新访问规则不会传播到具有"包括可继承权限..."的子文件夹选项在其安全属性中未选中。这才有意义。因此,我想做的是为任何此类子文件夹重新打开安全权限继承。

我的挖掘发现了ObjectSecurity.SetAccessRuleProtection方法,它应该是我需要的一半。但是,在已经继承其父级 DACL 的对象上盲目使用上述方法似乎很草率。因此,我想确定哪些对象关闭了其权限继承,但我似乎找不到返回此信息的相应方法或属性。有吗?我在这里错过了什么吗?

如何查看是否取消选中文件或文件夹的“包括可继承权限”

我记得使用过这样的东西:

DirectoryInfo d = new DirectoryInfo(@"e:'test1");
DirectorySecurity acl = d.GetAccessControl();
if (acl.GetAccessRules(false, true, typeof(System.Security.Principal.SecurityIdentifier)).Count >0)
    // -- has inherited permissions
else
    // -- has no inherited permissions

我也试图找到一种方法来检查这一点,但我找不到任何方法(即使在C++)。所以我最终使用了上面的代码。它就像一个魅力。

C# 的 DirectorySecurity 类现在似乎包含 AreAccessRulesProtected 属性,该属性在disabled继承时返回true,在enabled继承时返回false

因此,您可以简单地使用:

DirectorySecurity dirSecurity = Directory.GetAccessControl(pathToDir);
var isInheritanceEnabled = !dirSecurity.AreAccessRulesProtected

感谢@Wizou在这里的评论提醒!

似乎有一种管理的方法可以做到这一点:

DirectorySecurity ds = System.IO.Directory.GetAccessControl(@"C:'test");
byte[] rawBytes = ds.GetSecurityDescriptorBinaryForm();
RawSecurityDescriptor rsd = new RawSecurityDescriptor(rawBytes, 0);
if ((rsd.ControlFlags & ControlFlags.DiscretionaryAclProtected) == 
                        ControlFlags.DiscretionaryAclProtected)
{
    // "Include inheritable permissions from this object's parent" is unchecked
}
else
{
    // "Include inheritable permissons from this object's parent" is checked
}