Udostępnij przez


Kontrolowanie tworzenia obiektów podrzędnych w języku C++

Możesz użyć listy kontroli dostępu (DACL) obiektu kontenera, aby kontrolować, kto jest uprawniony do tworzenia obiektów podrzędnych w kontenerze. Może to być ważne, ponieważ twórca obiektu jest zwykle przypisywany jako właściciel obiektu, a właściciel obiektu może kontrolować dostęp do obiektu.

Różne typy obiektów kontenera mają określone prawa dostępu, które determinują możliwość tworzenia obiektów podrzędnych. Na przykład wątek musi mieć dostęp KEY_CREATE_SUB_KEY do klucza rejestru, aby utworzyć podklucz w kluczu. Lista DACL klucza rejestru może zawierać elementy ACL, które zezwalają na dostęp lub odmawiają tego prawa dostępu. Podobnie system NTFS obsługuje prawa dostępu FILE_ADD_FILE i FILE_ADD_SUBDIRECTORY do kontrolowania możliwości tworzenia plików lub katalogów w danym katalogu.

Prawo dostępu ADS_RIGHT_DS_CREATE_CHILD kontroluje tworzenie obiektów podrzędnych w obiekcie usługi Active Directory (DS). Jednak obiekty DS mogą zawierać różne typy obiektów, więc system obsługuje dokładnszy stopień szczegółowości kontroli. Można użyć obiektowych specyficznych ACEs , aby zezwolić lub odmówić prawa do utworzenia określonego typu obiektu podrzędnego. Możesz zezwolić użytkownikowi na utworzenie jednego typu obiektu podrzędnego, jednocześnie uniemożliwiając użytkownikowi tworzenie innych typów obiektów podrzędnych.

W poniższym przykładzie użyto funkcji SetEntriesInAcl, aby dodać ACE specyficzną dla obiektu do listy ACL. ACE przyznaje uprawnienie do tworzenia określonego typu obiektu podrzędnego. grfAccessPermissions składowej struktury EXPLICIT_ACCESS jest ustawiona na ADS_RIGHT_DS_CREATE_CHILD, aby wskazać, że usługa ACE kontroluje tworzenie obiektu podrzędnego. Członek ObjectsPresent w strukturze OBJECTS_AND_SID ma wartość ACE_OBJECT_TYPE_PRESENT, co wskazuje, że członek ObjectTypeGuid zawiera prawidłowy GUID. Identyfikator GUID identyfikuje typ obiektu podrzędnego, którego tworzenie jest kontrolowane.

W poniższym przykładzie pOldDACL musi być prawidłowym wskaźnikiem do istniejącej struktury ACL . Aby uzyskać informacje na temat tworzenia struktury ACL dla obiektu, zobacz Creating a Security Descriptor for a New Object 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);