Partager via


Modification des listes de contrôle d’accès d’un objet en C++

L’exemple suivant ajoute une entrée de contrôle d’accès (ACE) à la liste de contrôle d’accès discrétionnaire (DACL) d’un objet.

Le paramètre AccessMode détermine le type de nouvelle ACE et la façon dont le nouvel ACE est combiné avec tous les ACÉ existants pour le fiduciaire spécifié. Utilisez les indicateurs GRANT_ACCESS, SET_ACCESS, DENY_ACCESS ou REVOKE_ACCESS dans le paramètre AccessMode . Pour plus d’informations sur ces indicateurs, consultez ACCESS_MODE.

Un code similaire peut être utilisé pour utiliser une liste de contrôle d’accès système (SACL). Spécifiez SACL_SECURITY_INFORMATION dans les fonctions GetNamedSecurityInfo et SetNamedSecurityInfo pour obtenir et définir la liste SACL de l’objet. Utilisez les indicateurs SET_AUDIT_SUCCESS, SET_AUDIT_FAILURE et REVOKE_ACCESS dans le paramètre AccessMode . Pour plus d’informations sur ces indicateurs, consultez ACCESS_MODE.

Utilisez ce code pour ajouter un ACE spécifique à l’objet à la liste de contrôle d’accès d’un objet de service d’annuaire. Pour spécifier les GUID dans un ACE spécifique à un objet, définissez le paramètre TrusteeForm sur TRUSTEE_IS_OBJECTS_AND_NAME ou TRUSTEE_IS_OBJECTS_AND_SID et définissez le paramètre pszTrustee comme pointeur vers une structure OBJECTS_AND_NAME ou OBJECTS_AND_SID .

Cet exemple utilise la fonction GetNamedSecurityInfo pour obtenir la liste DACL existante. Ensuite, il remplit une structure de EXPLICIT_ACCESS avec des informations sur un ACE et utilise la fonction SetEntriesInAcl pour fusionner le nouvel ACE avec n’importe quel AAC existant dans la LISTE de contrôle d’accès. Enfin, l’exemple appelle la fonction SetNamedSecurityInfo pour attacher la nouvelle liste DACL au descripteur de sécurité de l’objet.

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