Modifica degli elenchi di controllo di accesso di un oggetto in C++
Nell'esempio seguente viene aggiunta una voce di controllo di accesso (ACE) all'elenco di controllo di accesso discrezionale (DACL) di un oggetto .
Il parametro AccessMode determina il tipo di nuova ACE e il modo in cui la nuova ACE viene combinata con eventuali ACE esistenti per il trustee specificato. Usare i flag GRANT_ACCESS, SET_ACCESS, DENY_ACCESS o REVOKE_ACCESS nel parametro AccessMode. Per informazioni su questi indicatori, vedere ACCESS_MODE.
È possibile usare codice simile per usare un elenco di controllo di accesso di sistema (SACL). Specificare SACL_SECURITY_INFORMATION nelle funzioni GetNamedSecurityInfo e SetNamedSecurityInfo per ottenere e impostare il SACL per l'oggetto. Usare i flag SET_AUDIT_SUCCESS, SET_AUDIT_FAILURE e REVOKE_ACCESS nel parametro AccessMode. Per informazioni su questi flag, vedere ACCESS_MODE.
Usare questo codice per aggiungere un ACE specifico dell'oggetto al DACL di un oggetto del servizio directory. Per specificare i GUID in un ace specifico dell'oggetto, impostare il parametro TrusteeForm su TRUSTEE_IS_OBJECTS_AND_NAME o TRUSTEE_IS_OBJECTS_AND_SID e impostare il parametro pszTrustee come puntatore a una struttura OBJECTS_AND_NAME o OBJECTS_AND_SID.
In questo esempio viene usata la funzioneGetNamedSecurityInfoper ottenere la DACL esistente. Riempie quindi una struttura di EXPLICIT_ACCESS con informazioni su un ACE e usa la funzione SetEntriesInAcl per unire il nuovo ACE con i DACL esistenti nel DACL. Infine, nell'esempio viene chiamata la funzionesetNamedSecurityInfoper collegare il nuovo DACL al descrittore di sicurezza dell'oggetto.
#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;
}