4

我正在尝试修改目录(及其子目录)上的现有 ACL,以删除内置用户组的写访问权限。该目录从其父目录继承此特定权限。我尝试使用 AtlSetDacl() 设置新的 ACL,但这并没有清除继承的写权限。分段:

ATL::CDacl dacl;
ATL::AtlGetDacl(directoryName.c_str(), SE_FILE_OBJECT, &dacl);
UINT aceCount = dacl.GetAceCount();
ATL::CDacl newDacl;
for (UINT i = 0; i < aceCount; ++i)
{
   ATL::CSid sid;
   ACCESS_MASK mask = 0;
   BYTE flags = 0;
   dacl.GetAclEntry(i,
                    &sid,
                    &mask,
                    (BYTE*) 0,
                    &flags);
   if (sid != Sids::Users())
       newDacl.AddAllowedAce(sid, mask, flags);
}
newDacl.AddAllowedAce(Sids::Users(),FILE_LIST_DIRECTORY | FILE_READ_EA | FILE_EXECUTE | FILE_READ_ATTRIBUTES, CONTAINER_INHERIT_ACE | OBJECT_INHERIT_ACE);
AtlSetDacl(directoryName.c_str(), SE_FILE_OBJECT, newDacl);

我还尝试过 SetNamedSecurityInfo() 和相关 API 来擦除现有 ACL 并创建一个新 ACL,但这里也没有运气。看起来这应该不是那么难。使用 cacls.exe 这是小菜一碟(不幸的是,这不是我的选择)。关于如何做到这一点的任何想法?

4

1 回答 1

7

要删除继承的 ACE,请调用SetNamedSecurityInfo并传递DACL_SECURITY_INFORMATION | PROTECTED_DACL_SECURITY_INFORMATIONSecurityInfo 参数。

PROTECTED_DACL_SECURITY_INFORMATION标志防止来自父级的可继承 ACE 添加到您指定的 ACL。

如果您不需要复制其他继承的权限,而只需指定要使用的特定 ACL,那会更简单。如果您确实需要复制其他继承的权限,则需要在现有代码中保留 read-compare-add 循环,但您还应该清除 INHERITED_ACE 标志,因为这些现在是显式权限。

于 2012-04-29T21:54:08.310 回答