无法删除目录ACE

时间:2014-03-19 18:17:38

标签: c# .net acl

我正在使用C#和.NET 4编写一个类库,它通过网络与共享服务器上的文件系统进行交互。我正在尝试调整文件夹的一些权限,我完全有能力添加ACE,但我很难删除它们。

这是我到目前为止的代码:

//get ACEs for the working folder.
DirectorySecurity disec = m_diWork.GetAccessControl();

//find out if the account we want to remove is inherited from a parent folder.
bool bIsAccountInherited = disec.GetAccessRules(false, true, typeof(NTAccount)).Cast<AuthorizationRule>().Any(ar => ar.IdentityReference.Value.Equals(act.Value, StringComparison.CurrentCultureIgnoreCase));
if (bIsAccountInherited)
{
    //if so, remove inheritance of ACEs but preserve existing ones.
    disec.SetAccessRuleProtection(true, true);
}

//remove all access to this account.
disec.PurgeAccessRules(act);

//commit changes to working folder.
m_diWork.SetAccessControl(disec);

变量act的类型为NTAccount,指的是域用户。

代码运行时没有异常或任何明显的问题,目标文件夹的权限正确地更改为非继承。但是,根本不会删除任何ACE。

我尝试了几种不同的方法调用组合,也使用了RemoveAccessRuleAll(),但无济于事。我究竟做错了什么?感谢。

1 个答案:

答案 0 :(得分:1)

问题在于您尝试删除不允许的继承访问权限。这是因为它不足以调用 SetAccessRuleProtection(true,true)。只有在您之后调用 SetAccessControl 时,更改才会生效。换句话说,您无法删除访问权限的继承并在一次性修改它们。它必须分两个阶段完成,即:

  1. disec.SetAccessRuleProtection(true,true);
  2. m_diWork.SetAccessControl(disec);
  3. disec = m_diWork.GetAccessControl()
  4. disec.PurgeAccessRules(行为);
  5. m_diWork.SetAccessControl(disec);
  6. 这并不明显, PurgeAccessRules 无法解决删除访问权限方面的问题。