以下のコードは、さまざまなACEの変更と追加と取り消しのために働いています。ACLにあるACEを削除しようとすると機能しませんが、このACEは継承されます。REVOKE_ACCESS:継承されたACEを '取り消し'する方法
継承されていないACEの取り消しのためのSetEntriesInAcl()
は、ACL ACEカウントを減らし、次のように取り消しを行い、ACEがなくなったSetNamedSecurityInfo()
を返します。
ACEが継承されても、これらのAPIの両方がSUCCESS
を返したにもかかわらず、ACEが削除/取り消されなかった場合、ACL ACEの数は変わりません。
私もDeleteAce()
をやってコード化されてきたが、そのDACLはSetNamedSecurityInfo()
で使用されるとき、再びRCはSUCCESS
(ノーリターンコード)で、ACEは、私が扱っていたフォルダのために残っている - 明確に削除する方法についてのトリックがあります継承されたACE。
Btw、問題の同じフォルダSUBINACLコマンドラインツールは、この継承ACEを問題なく取り消します。現時点では
if(EqualSid(pSid_for_ace, pSid) )
{ /* ACE SID matched edit SID */
if(cmd_se_edit == SE_REM)
{ /* remove */
rem_lst[ ace_idx ] = x;
exp_ace[ ace_idx ].grfAccessPermissions = dwAccessRights;
exp_ace[ ace_idx ].grfAccessMode = REVOKE_ACCESS;
exp_ace[ ace_idx ].grfInheritance = dwInheritance;
exp_ace[ ace_idx ].Trustee.TrusteeForm = TRUSTEE_IS_SID;
exp_ace[ ace_idx ].Trustee.TrusteeType = TRUSTEE_IS_WELL_KNOWN_GROUP;
exp_ace[ ace_idx ].Trustee.ptstrName = pSid;
if(ace_idx < (REMMAX-1)) ++ace_idx;
} /* remove */
} /* ACE SID matched edit SID */
pBA = (BYTE *)p_aceHdr;
ace_sz = p_aceHdr->AceSize;
p_aceHdr = (PACE_HEADER)&pBA[ ace_sz ];
} /* loop through ACEs */
// Create a new ACL that merges the new ACE
// into the existing DACL.
if(ace_idx)
{ /* ACEs to remove */
dwRes = SetEntriesInAcl(ace_idx, &exp_ace[0],
pDacl, &pNewDacl);
if(ERROR_SUCCESS != dwRes)
{
printf("SetEntriesInAcl Error %u\n", dwRes);
goto Cleanup2;
}
// Attach the new ACL as the object's DACL.
dwRes = SetNamedSecurityInfo( ObjName,
ObjectType,
DACL_SECURITY_INFORMATION,
NULL,
NULL,
pNewDacl,
NULL);
if(ERROR_SUCCESS != dwRes)
{
rc3 = GetLastError();
printf("SetNamedSecurityInfo Error %u\n", dwRes);
goto Cleanup2;
}
} /* ACEs to remove */
アクセス許可のマスクと継承の設定は、MSガイダンスごとに取り消されるACEと同じです(唯一のガイダンスです)。 - 上記のコードでこのACEを設定すると、設定したものと一致する新しいACEが作成されます。元の継承されたACEが残っています。このテストではACLが1増加しました。このテストACEの取り消しは正しく機能しました。元のACEが継承されました。 – kevinwaite
継承されたACEを削除すると、ACLの規則が破損します。高水準のAPIはこれを行うことはできません。低レベルのAPIはありますが、そうしないでください。代わりに、対象オブジェクトの継承をオフにして、保持したいACEをコピーするか、代わりに拒否エントリを使用することを検討してください。 –
ありがとうHarry - プログラムで(APIを介して)**どのように私のターゲットオブジェクトの継承をオフにするのですか? - 私はこれを行うことができませんでした。(grrr).....継承が解除されたら - 私はACEをコピーする方法を知っています - あなたのコメントで、私が残したいACEをコピーすると言う - ?一度そこに「フォルダーの」セキュリティ記述子に戻す方法 - 私はそれを行うためのいくつかのAPIを知っています - 私はあなたの思考/洞察に興味があります....ありがとう、再びKevin Waiteに関して – kevinwaite