Contrôle de la création d’objets enfants en C++
Vous pouvez utiliser la liste DACL d’un objet conteneur pour contrôler qui est autorisé à créer des objets enfants dans le conteneur. Cela peut être important, car le créateur d’un objet est généralement affecté en tant que propriétaire de l’objet, et le propriétaire d’un objet peut contrôler l’accès à l’objet.
Les différents types d’objets conteneur disposent de droits d’accès spécifiques qui contrôlent la possibilité de créer des objets enfants. Par exemple, un thread doit avoir KEY_CREATE_SUB_KEY accès à une clé de Registre pour créer une sous-clé sous la clé. La liste de contrôle d’accès d’une clé de Registre peut contenir des AIC qui autorisent ou refusent ce droit d’accès. De même, NTFS prend en charge les droits d’accès FILE_ADD_FILE et FILE_ADD_SUBDIRECTORY pour contrôler la possibilité de créer des fichiers ou des répertoires dans un répertoire.
Le droit d’accès ADS_RIGHT_DS_CREATE_CHILD contrôle la création d’objets enfants dans un objet de service d’annuaire (DS). Toutefois, les objets DS pouvant contenir différents types d’objets, le système prend en charge une granularité de contrôle plus fine. Vous pouvez utiliser des AE spécifiques à un objet pour autoriser ou refuser le droit de créer un type spécifié d’objet enfant. Vous pouvez autoriser un utilisateur à créer un type d’objet enfant tout en empêchant l’utilisateur de créer d’autres types d’objets enfants.
L’exemple suivant utilise la fonction SetEntriesInAcl pour ajouter un ACE spécifique à un objet à une liste de contrôle d’accès. L’ACE accorde l’autorisation de créer un type spécifié d’objet enfant. Le membre grfAccessPermissions de la structure EXPLICIT_ACCESS est défini sur ADS_RIGHT_DS_CREATE_CHILD pour indiquer que l’ACE contrôle la création de l’objet enfant. Le membre ObjectsPresent de la structure OBJECTS_AND_SID est défini sur ACE_OBJECT_TYPE_PRESENT pour indiquer que le membre ObjectTypeGuid contient un GUID valide. Le GUID identifie un type d’objet enfant dont la création est contrôlée.
Dans l’exemple suivant, pOldDACL doit être un pointeur valide vers une structure ACL existante. Pour plus d’informations sur la création d’une structure ACL pour un objet, consultez Création d’un descripteur de sécurité pour un nouvel objet en 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);