Ä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;
}