【问题标题】:How do I add ACL rules without replacing existing ones?如何在不替换现有规则的情况下添加 ACL 规则?
【发布时间】:2013-06-11 03:18:17
【问题描述】:

我想在现有规则的基础上添加一些新的 ACL 规则。我目前正在使用SetAccessRule,希望添加新规则也会保留旧规则。根据documentation for SetAccessRule

SetAccessRule 方法添加指定的访问控制列表 (ACL) 规则或覆盖任何与规则参数的 FileSystemRights 值匹配的相同 ACL 规则。例如,如果 rule 参数指定了 Read 值,并且 SetAccessRule 方法找到了一个相同的 ACL 规则,该规则指定了 Read 值,则相同的规则将被覆盖。如果 SetAccessRule 方法找到了一个相同的 ACL 规则,该规则指定了 Write 值,则不会覆盖相同的规则。

但是,在实践中,我发现添加新规则实际上会覆盖任何以前的规则(属于同一用户/SID?)。这似乎与文档所说的相矛盾。

我目前的意图是分配读取和写入权限,但在单独的调用中。不幸的是,后一个权限会覆盖第一个权限。在下面的示例代码中,结果是仅分配了读取权限。如果我注释掉该块,则只分配写权限。这可以通过额外的if 条件来解决,以分配这两个权限,但它仍然会覆盖目录上的任何现有权限,这是不希望的。

DirectoryInfo directory = new DirectoryInfo(abspath);
DirectorySecurity security = directory.GetAccessControl();
security.SetAccessRuleProtection(false, true);

if (perm.Contains("write"))
{
    security.SetAccessRule(new FileSystemAccessRule(user, FileSystemRights.Write, InheritanceFlags.ContainerInherit | InheritanceFlags.ObjectInherit, PropagationFlags.None, AccessControlType.Allow));
}

if (perm.Contains("read"))
{
    security.SetAccessRule(new FileSystemAccessRule(user, FileSystemRights.ReadAndExecute | FileSystemRights.Traverse, InheritanceFlags.ContainerInherit | InheritanceFlags.ObjectInherit, PropagationFlags.None, AccessControlType.Allow));
}

directory.SetAccessControl(security);

在保留现有规则的同时,我应该如何处理添加新规则?而且,文档是否不正确,我是否误解了它,还是我的代码不正确?

【问题讨论】:

    标签: c# acl


    【解决方案1】:

    尝试使用DirectorySecurity.AddAccessRule 方法代替附加/添加权限或替换,请参阅此MSDN link 了解更多信息

    security.AddAccessRule(new FileSystemAccessRule(user, FileSystemRights.Write, InheritanceFlags.ContainerInherit | InheritanceFlags.ObjectInherit, PropagationFlags.None, AccessControlType.Allow));
    

    【讨论】:

    • 嗯...我不知道我是怎么错过的。谢谢!不过,我仍然想知道 SetAccessRule 文档。
    • @Bob 更有可能是不坏的文档,名称 Set 躲避不附加的专有设置(至少在我的脑海中:),有时您必须将 MSDN 文档与一粒盐
    • 值得注意的是,AddAccessRule 向 ACL 中添加了新项目,与修改现有的 ModifyAccessRule 相对。结果列表将以不同方式应用。
    猜你喜欢
    • 2016-08-29
    • 2013-04-23
    • 2019-05-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-25
    • 2011-11-17
    相关资源
    最近更新 更多