Ändern der ACLs eines Objekts in C++
Im folgenden Beispiel wird der diskretionären Zugriffssteuerungsliste (DACL) eines Objekts ein Zugriffssteuerungseintrag (Access Control Entry, ACE) hinzugefügt.
Der AccessMode-Parameter bestimmt den Typ des neuen ACE und die Kombination des neuen ACE mit allen vorhandenen ACEs für den angegebenen Treuhänder. Verwenden Sie die Flags GRANT_ACCESS, SET_ACCESS, DENY_ACCESS oder REVOKE_ACCESS im AccessMode-Parameter . Informationen zu diesen Flags finden Sie unter ACCESS_MODE.
Ähnlicher Code kann für die Arbeit mit einer Systemzugriffssteuerungsliste (SACL) verwendet werden. Geben Sie SACL_SECURITY_INFORMATION in den Funktionen GetNamedSecurityInfo und SetNamedSecurityInfo an, um die SACL für das Objekt abzurufen und festzulegen. Verwenden Sie die Flags SET_AUDIT_SUCCESS, SET_AUDIT_FAILURE und REVOKE_ACCESS im AccessMode-Parameter . Informationen zu diesen Flags finden Sie unter ACCESS_MODE.
Verwenden Sie diesen Code, um der DACL eines Verzeichnisdienstobjekts ein objektspezifisches ACE hinzuzufügen. Um die GUIDs in einem objektspezifischen ACE anzugeben, legen Sie den TrusteeForm-Parameter auf TRUSTEE_IS_OBJECTS_AND_NAME oder TRUSTEE_IS_OBJECTS_AND_SID fest, und legen Sie den pszTrustee-Parameter als Zeiger auf eine OBJECTS_AND_NAME - oder OBJECTS_AND_SID-Struktur fest.
In diesem Beispiel wird die GetNamedSecurityInfo-Funktion verwendet, um die vorhandene DACL abzurufen. Anschließend füllt es eine EXPLICIT_ACCESS-Struktur mit Informationen zu einem ACE und verwendet die SetEntriesInAcl-Funktion , um den neuen ACE mit allen vorhandenen ACEs in der DACL zusammenzuführen. Schließlich ruft das Beispiel die SetNamedSecurityInfo-Funktion auf, um die neue DACL an die Sicherheitsbeschreibung des -Objekts anzufügen.
#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;
}