C++ でのオブジェクトの ACL の変更
次の例では、オブジェクトの随意アクセス制御リスト (DACL) にアクセス制御エントリ (ACE) を追加します。
AccessMode パラメーターは、新しい ACE の種類と、指定されたトラスティの既存の ACE と新しい ACE を組み合わせる方法を決定します。 AccessMode パラメーターで、GRANT_ACCESS、SET_ACCESS、DENY_ACCESS、またはREVOKE_ACCESSフラグを使用します。 これらのフラグの詳細については、「 ACCESS_MODE」を参照してください。
同様のコードを使用して、 システム アクセス制御リスト (SACL) を操作できます。 GetNamedSecurityInfo 関数と SetNamedSecurityInfo 関数でSACL_SECURITY_INFORMATIONを指定して、オブジェクトの SACL を取得および設定します。 AccessMode パラメーターで、SET_AUDIT_SUCCESS、SET_AUDIT_FAILURE、およびREVOKE_ACCESSフラグを使用します。 これらのフラグの詳細については、「 ACCESS_MODE」を参照してください。
このコードを使用して、 ディレクトリ サービス オブジェクト の DACL にオブジェクト固有の ACE を追加します。 オブジェクト固有の ACE で GUID を指定するには、 TrusteeForm パラメーターを TRUSTEE_IS_OBJECTS_AND_NAME または TRUSTEE_IS_OBJECTS_AND_SID に設定し、 pszTrustee パラメーターを OBJECTS_AND_NAME または OBJECTS_AND_SID 構造体へのポインターに設定します。
この例では、 GetNamedSecurityInfo 関数を使用して既存の DACL を取得します。 次に 、ace に 関する情報をEXPLICIT_ACCESS構造体に入力し、 SetEntriesInAcl 関数を使用して、新しい ACE を DACL 内の既存の ACE とマージします。 最後に、 SetNamedSecurityInfo 関数を呼び出して、新しい DACL を オブジェクトの セキュリティ記述子 にアタッチします。
#include <windows.h>
#include <stdio.h>
DWORD AddAceToObjectsSecurityDescriptor (
LPTSTR pszObjName, // name of object
SE_OBJECT_TYPE ObjectType, // type of object
LPTSTR pszTrustee, // trustee for new ACE
TRUSTEE_FORM TrusteeForm, // format of trustee structure
DWORD dwAccessRights, // access mask for new ACE
ACCESS_MODE AccessMode, // type of ACE
DWORD dwInheritance // inheritance flags for new ACE
)
{
DWORD dwRes = 0;
PACL pOldDACL = NULL, pNewDACL = NULL;
PSECURITY_DESCRIPTOR pSD = NULL;
EXPLICIT_ACCESS ea;
if (NULL == pszObjName)
return ERROR_INVALID_PARAMETER;
// Get a pointer to the existing DACL.
dwRes = GetNamedSecurityInfo(pszObjName, ObjectType,
DACL_SECURITY_INFORMATION,
NULL, NULL, &pOldDACL, NULL, &pSD);
if (ERROR_SUCCESS != dwRes) {
printf( "GetNamedSecurityInfo Error %u\n", dwRes );
goto Cleanup;
}
// Initialize an EXPLICIT_ACCESS structure for the new ACE.
ZeroMemory(&ea, sizeof(EXPLICIT_ACCESS));
ea.grfAccessPermissions = dwAccessRights;
ea.grfAccessMode = AccessMode;
ea.grfInheritance= dwInheritance;
ea.Trustee.TrusteeForm = TrusteeForm;
ea.Trustee.ptstrName = pszTrustee;
// Create a new ACL that merges the new ACE
// into the existing DACL.
dwRes = SetEntriesInAcl(1, &ea, pOldDACL, &pNewDACL);
if (ERROR_SUCCESS != dwRes) {
printf( "SetEntriesInAcl Error %u\n", dwRes );
goto Cleanup;
}
// Attach the new ACL as the object's DACL.
dwRes = SetNamedSecurityInfo(pszObjName, ObjectType,
DACL_SECURITY_INFORMATION,
NULL, NULL, pNewDACL, NULL);
if (ERROR_SUCCESS != dwRes) {
printf( "SetNamedSecurityInfo Error %u\n", dwRes );
goto Cleanup;
}
Cleanup:
if(pSD != NULL)
LocalFree((HLOCAL) pSD);
if(pNewDACL != NULL)
LocalFree((HLOCAL) pNewDACL);
return dwRes;
}