Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
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;
}