4

ディレクトリ (およびそのサブディレクトリ) の既存の 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 を使用すると、これは簡単なことです (残念ながら、私にはオプションではありません)。これを行う方法についてのアイデアはありますか?

4

1 に答える 1

7

継承された ACE を削除するには、SetNamedSecurityInfoDACL_SECURITY_INFORMATION | PROTECTED_DACL_SECURITY_INFORMATIONを呼び出して、SecurityInfo パラメーターに 渡します。

このPROTECTED_DACL_SECURITY_INFORMATIONフラグは、親からの継承可能な ACE が、指定した ACL に追加されないようにします。

他の継承されたアクセス許可をコピーする必要はなく、使用する特定の ACL を指定するだけでよい場合は、より簡単になります。他の継承されたアクセス許可をコピーする必要がある場合は、既存のコードに read-compare-add ループを保持する必要がありますが、これらは明示的なアクセス許可であるため、INHERITED_ACE フラグもクリアする必要があります。

于 2012-04-29T21:54:08.310 に答える