如何在不替换现有规则的情况下添加ACL规则?

时间:2013-06-11 03:18:18

标签: c# acl

我想添加一些新的ACL规则和现有规则。我目前正在使用SetAccessRule,期望添加新规则也会保留旧规则。根据{{​​3}},

  

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

但是,实际上,我发现添加新规则实际上会覆盖以前的所有规则(属于同一个用户/ 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);

如何在保留现有规则的同时添加新规则?并且,文档是否不正确,我是否误解,或者我的代码是否错误?

1 个答案:

答案 0 :(得分:1)

尝试使用DirectorySecurity.AddAccessRule方法代替追加/添加权限或替换,请参阅此MSDN link了解详情

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