我正在尝试修改目录(及其子目录)上的现有 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 这是小菜一碟(不幸的是,这不是我的选择)。关于如何做到这一点的任何想法?