如何查看文件或文件夹是不是未选中“包含可继承权限”?

Posted

技术标签:

【中文标题】如何查看文件或文件夹是不是未选中“包含可继承权限”?【英文标题】:How to see whether "include inheritable permissions" is unchecked for a file or folder?如何查看文件或文件夹是否未选中“包含可继承权限”? 【发布时间】:2012-04-22 08:44:00 【问题描述】:

我正在用 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 的对象盲目地使用上述方法似乎很草率。因此,我想确定哪些对象的权限继承已关闭,但我似乎找不到返回此信息的相应方法或属性。有吗?我在这里遗漏了什么吗?

【问题讨论】:

如果父文件夹已经设置了它为什么重要?重新设置它不应该引起任何悲伤。 @M.Babcock – 出于实际原因,强制更新不需要更新的文件或文件夹似乎既浪费又低效。在我的具体情况下,只有少数子文件夹 继承访问权限,但在这些相同的文件夹中 有数百甚至数千个文件。出于性能原因,我宁愿更新这些对象中的少数而不是全部。 虽然不是重复的,但它是***.com/questions/6574196/…的倒数 【参考方案1】:

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

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

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

感谢@Wizou 的评论提醒!

【讨论】:

我也这么认为,但在某些情况下,AreAccessRulesProtected 标志无法正常工作。我正在调试我的程序,当 dirSecurity.AreAccessRulesProtected 为 false 并且 dirSecurity.GetAccessRules(true, true, typeof(NTAccount))[0].isInherited 为 true 时,我遇到了情况!在窗口中我可以清楚地看到启用了继承,并且只有继承的权限。【参考方案2】:

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

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

【讨论】:

看来你的代码可以换成ds.AreAccessRulesProtected【参考方案3】:

我记得用过这样的东西:

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++ 中)。所以我最终使用了上面的代码。它就像一个魅力。

【讨论】:

似乎 MS 疏忽了没有提供更直接的方法来检查这一点,但这正是我想要的。 :) 您的示例仅显示if threre is something inheriteddoes not show if inheriting is switched on。当父文件夹仅将权限传播到父文件夹(而不是子文件夹或文件)或 acl 损坏时,这是一个区别。在这两种情况下,您都会收到no inheritance even when it is turned on

以上是关于如何查看文件或文件夹是不是未选中“包含可继承权限”?的主要内容,如果未能解决你的问题,请参考以下文章

如何将菜单项更改为选中或未选中?

jQuery查看是不是选中了任何复选框

如何在 *.framework 包中省略或签名未签名的文件

Laravel 4,如何测试复选框是不是被选中?

如何在pycharm中快速删除一行

我如何确定是不是选中了复选框以执行某些操作,然后未选中执行其他操作? [复制]