ディレクトリ (およびそのサブディレクトリ) の既存の ACL を変更して、組み込みの Users グループの書き込みアクセスを削除しようとしています。ディレクトリは、親ディレクトリからこの特定の権利を継承しています。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 を使用すると、これは簡単なことです (残念ながら、私にはオプションではありません)。これを行う方法についてのアイデアはありますか?