Steuern der Erstellung untergeordneter Objekte in C++

Sie können die DACL eines Containerobjekts verwenden, um zu steuern, wer untergeordnete Objekte innerhalb des Containers erstellen darf. Dies kann wichtig sein, da der Ersteller eines Objekts in der Regel als Besitzer des Objekts zugewiesen wird und der Besitzer eines Objekts den Zugriff auf das Objekt steuern kann.

Die verschiedenen Typen von Containerobjekten verfügen über bestimmte Zugriffsrechte, die die Fähigkeit steuern, untergeordnete Objekte zu erstellen. Beispielsweise muss ein Thread KEY_CREATE_SUB_KEY Zugriff auf einen Registrierungsschlüssel haben, um einen Unterschlüssel unter dem Schlüssel zu erstellen. Die DACL eines Registrierungsschlüssels kann ACEs enthalten, die dieses Zugriffsrecht zulassen oder verweigern. Ebenso unterstützt NTFS die FILE_ADD_FILE- und FILE_ADD_SUBDIRECTORY-Zugriffsrechte, um die Möglichkeit zum Erstellen von Dateien oder Verzeichnissen in einem Verzeichnis zu steuern.

Das ADS_RIGHT_DS_CREATE_CHILD Zugriffsrecht steuert die Erstellung untergeordneter Objekte in einem Verzeichnisdienstobjekt (DS). DS-Objekte können jedoch verschiedene Objekttypen enthalten, sodass das System eine präzisere Granularität der Steuerung unterstützt. Sie können objektspezifische ACEs verwenden, um das Recht zum Erstellen eines angegebenen typs untergeordneten Objekts zuzulassen oder zu verweigern. Sie können einem Benutzer erlauben, einen Typ von untergeordneten Objekten zu erstellen, während der Benutzer daran gehindert wird, andere Typen von untergeordneten Objekten zu erstellen.

Im folgenden Beispiel wird die SetEntriesInAcl-Funktion verwendet, um einer ACL einen objektspezifischen ACE hinzuzufügen. Der ACE erteilt die Berechtigung zum Erstellen eines angegebenen Typs von untergeordneten Objekten. Der grfAccessPermissions-Member der EXPLICIT_ACCESS-Struktur wird auf ADS_RIGHT_DS_CREATE_CHILD festgelegt, um anzugeben, dass der ACE die Erstellung untergeordneter Objekte steuert. Das ObjectsPresent-Element der OBJECTS_AND_SID-Struktur ist auf ACE_OBJECT_TYPE_PRESENT festgelegt, um anzugeben, dass das ObjectTypeGuid-Element eine gültige GUID enthält. Die GUID identifiziert einen Typ von untergeordneten Objekten, dessen Erstellung gesteuert wird.

Im folgenden Beispiel muss pOldDACL ein gültiger Zeiger auf eine vorhandene ACL-Struktur sein. Informationen zum Erstellen einer ACL-Struktur für ein Objekt finden Sie unter Erstellen eines Sicherheitsdeskriptors für ein neues Objekt in C++.

DWORD dwRes;
PACL pOldDACL = NULL;
PACL pNewDACL = NULL;
GUID guidChildObjectType = GUID_NULL;   // GUID of object to control creation of
PSID pTrusteeSID = NULL;           // trustee for new ACE
EXPLICIT_ACCESS ea;
OBJECTS_AND_SID ObjectsAndSID;

// pOldDACL must be a valid pointer to an existing ACL structure.

// guidChildObjectType must be the GUID of an object type 
// that is a possible child of the object associated with pOldDACL.
 
// Initialize an OBJECTS_AND_SID structure with object type GUIDs and 
// the SID of the trustee for the new ACE. 

ZeroMemory(&ObjectsAndSID, sizeof(OBJECTS_AND_SID));
ObjectsAndSID.ObjectsPresent = ACE_OBJECT_TYPE_PRESENT;
ObjectsAndSID.ObjectTypeGuid = guidChildObjectType;
ObjectsAndSID.InheritedObjectTypeGuid  = GUID_NULL;
ObjectsAndSID.pSid = (SID *)pTrusteeSID;

// Initialize an EXPLICIT_ACCESS structure for the new ACE. 

ZeroMemory(&ea, sizeof(EXPLICIT_ACCESS));
ea.grfAccessPermissions = ADS_RIGHT_DS_CREATE_CHILD;
ea.grfAccessMode = GRANT_ACCESS;
ea.grfInheritance= NO_INHERITANCE;
ea.Trustee.TrusteeForm = TRUSTEE_IS_OBJECTS_AND_SID;
ea.Trustee.ptstrName = (LPTSTR) &ObjectsAndSID;

// Create a new ACL that merges the new ACE
// into the existing DACL.

dwRes = SetEntriesInAcl(1, &ea, pOldDACL, &pNewDACL);