【问题标题】:Remove All Directory Permissions删除所有目录权限
【发布时间】:2010-11-29 13:04:47
【问题描述】:

在 C# (2.0) 中,如何删除对目录的所有权限,以便限制访问。我将为有限的一组用户添加访问权限。

【问题讨论】:

    标签: c# .net security permissions


    【解决方案1】:

    免责声明:我意识到这已经得到了回答和接受,我真的很想将其作为对已接受答案的评论发布,但是无法格式化 cmets 迫使我将其发布为答案(从技术上讲,它是)....

    我也想做同样的事情,但发现了你的问题。 Stu 的回答帮助我想出了这个解决方案。 (请注意,我只对删除显式安全感兴趣)。

    private static DirectorySecurity RemoveExplicitSecurity(DirectorySecurity directorySecurity)
    {
        AuthorizationRuleCollection rules = directorySecurity.GetAccessRules(true, false, typeof(System.Security.Principal.NTAccount));
        foreach (FileSystemAccessRule rule in rules)
            directorySecurity.RemoveAccessRule(rule);
        return directorySecurity;
    }
    

    这显然是这样使用的:

    DirectoryInfo directoryInfo = new DirectoryInfo(path);
    DirectorySecurity directorySecurity = directoryInfo.GetAccessControl();
    directorySecurity = RemoveExplicitSecurity(directorySecurity);
    Directory.SetAccessControl(path, directorySecurity);
    

    【讨论】:

    • 一个完全有效的附加答案!
    • 很好的解决方案,但我认为您应该将其称为 RemoveEXPLICIT 不是隐式的,因为您在这里删除了显式规则。
    • 这应该被标记为正确答案。无需免责声明。
    • 只是想添加以供将来参考,这是一个很好的标准解决方案,但不足以处理某些权限。 GetAccessRules 返回的权限列表在传回 RemoveAccessRule 时并不总是有效的。这发生在FileSystemRights 枚举中不存在访问级别的值,更多信息在这里 - *.com/questions/9694834/…
    【解决方案2】:

    System.IO.Directory.GetAccessControl() 然后编辑返回的 FileSecurity 对象。

    【讨论】:

    • 几乎一样^^我现在改了。
    【解决方案3】:

    查看System.Security.AccessControl 命名空间中的类,尤其是DirectorySecurity.RemoveAccessRule 方法。

    此外,如果您删除所有权限,那么您将无法再添加任何权限 :-)

    【讨论】:

    • 我发现这个工具对检查我的代码是否正常工作很有用。它向您显示在文件夹层次结构中设置的目录权限。即仅在设置权限的地方,而不是继承 - youtube.com/watch?v=aZLIioUl-5k
    【解决方案4】:

    这里有一组来自 CodeProject 的关于 Windows ACL 编程的精彩文章:

    The Windows Access Control Model

    系列中的Part 3 展示了.NET 特定的方法。

    【讨论】: