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 über KEY _ CREATE _ SUB _ KEY-Zugriff auf einen Registrierungsschlüssel verfügen, um einen Unterschlüssel unter dem Schlüssel zu erstellen. Die DACL eines Registrierungsschlüssels kann ACEs enthalten, die dieses Zugriffsrecht zulassen oder verweigern. Auf ähnliche Weise unterstützt NTFS die Zugriffsrechte FILE _ ADD FILE und FILE ADD _ _ _ SUBDIRECTORY, 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 (Directory Service, DS). DS-Objekte können jedoch unterschiedliche Objekttypen enthalten, sodass das System eine präzisere Steuerungsgranularität unterstützt. Sie können objektspezifische ACEs verwenden, um das Recht zum Erstellen eines angegebenen Typs von untergeordneten Objekten zuzulassen oder zu verweigern. Sie können einem Benutzer das Erstellen eines untergeordneten Objekttyps gestatten und gleichzeitig verhindern, dass der Benutzer andere Typen von untergeordneten Objekten erstellt.

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 untergeordnetem Objekt. Der grfAccessPermissions-Member der EXPLICIT _ ACCESS-Struktur ist auf ADS _ RIGHT _ DS CREATE CHILD _ _ festgelegt, um anzugeben, dass der ACE die Erstellung des untergeordneten Objekts steuert. Der ObjectsPresent-Member der OBJECTS AND _ _ SID-Struktur ist auf ACE _ OBJECT TYPE PRESENT _ _ festgelegt, um anzugeben, dass der ObjectTypeGuid-Member eine gültige GUID enthält. Die GUID identifiziert einen Typ von untergeordnetem Objekt, 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);