CreatePrivateObjectSecurityWithMultipleInheritance, fonction (securitybaseapi.h)
La fonction CreatePrivateObjectSecurityWithMultipleInheritance alloue et initialise un descripteur de sécurité auto-relatif pour un nouvel objet privé créé par le gestionnaire de ressources appelant cette fonction. Cette fonction prend en charge les objets privés (tels que les objets service d’annuaire avec des classes auxiliaires attachées) composés de plusieurs types d’objets ou classes.
Syntaxe
BOOL CreatePrivateObjectSecurityWithMultipleInheritance(
[in, optional] PSECURITY_DESCRIPTOR ParentDescriptor,
[in, optional] PSECURITY_DESCRIPTOR CreatorDescriptor,
[out] PSECURITY_DESCRIPTOR *NewDescriptor,
[in, optional] GUID **ObjectTypes,
[in] ULONG GuidCount,
[in] BOOL IsContainerObject,
[in] ULONG AutoInheritFlags,
[in, optional] HANDLE Token,
[in] PGENERIC_MAPPING GenericMapping
);
Paramètres
[in, optional] ParentDescriptor
Pointeur vers le descripteur de sécurité pour le conteneur parent de l’objet . S’il n’existe aucun conteneur parent, ce paramètre a la valeur NULL.
[in, optional] CreatorDescriptor
Pointeur vers un descripteur de sécurité fourni par le créateur de l’objet. Si le créateur de l’objet ne transmet pas explicitement les informations de sécurité pour le nouvel objet, ce paramètre peut être NULL. Ce paramètre peut également pointer vers un descripteur de sécurité par défaut.
[out] NewDescriptor
Pointeur vers une variable pour recevoir un pointeur vers le descripteur de sécurité auto-relatif nouvellement alloué. Une fois que vous avez terminé d’utiliser le descripteur de sécurité, libérez-le en appelant le
DestroyPrivateObjectSecurity, fonction.
[in, optional] ObjectTypes
Tableau de pointeurs vers des structures GUID qui identifient les types d’objets ou les classes de l’objet associé à NewDescriptor. Pour les objets Active Directory, ce tableau contient des pointeurs vers les GUID de classe de la classe structurale de l’objet et toutes les classes auxiliaires attachées. Définissez ObjectTypes sur NULL si l’objet n’a pas de GUID.
[in] GuidCount
Nombre de GUID présents dans le paramètre ObjectTypes .
[in] IsContainerObject
Spécifie si le nouvel objet peut contenir d’autres objets. La valeur TRUE indique que le nouvel objet est un conteneur. La valeur FALSE indique que le nouvel objet n’est pas un conteneur.
[in] AutoInheritFlags
Ensemble d’indicateurs de bits qui contrôlent la façon dont les entrées de contrôle d’accès (ACÉ) sont héritées de ParentDescriptor. Ce paramètre peut être une combinaison des valeurs suivantes.
Valeur | Signification |
---|---|
|
La nouvelle liste de contrôle d’accès discrétionnaire (DACL) contient des ACÉ hérités de la liste DACL de ParentDescriptor, ainsi que tous les ACL explicites spécifiés dans le DACL de CreatorDescriptor. Si cet indicateur n’est pas défini, le nouveau DACL n’hérite pas des ACL. |
|
La nouvelle liste de contrôle d’accès système (SACL) contient des ACÉ hérités de la SACL de ParentDescriptor, ainsi que toutes les ACL explicites spécifiées dans la SACL de CreatorDescriptor. Si cet indicateur n’est pas défini, la nouvelle liste SACL n’hérite pas des ACL. |
|
CreatorDescriptor est le descripteur par défaut pour les types d’objets spécifiés par ObjectTypes. Par conséquent, CreatorDescriptor est ignoré si ParentDescriptor a des ACÉ spécifiques aux objets pour les types d’objets spécifiés par le paramètre ObjectTypes . Si aucun de ces AE n’est hérité, CreatorDescriptor est géré comme si cet indicateur n’était pas spécifié. |
|
La fonction n’effectue pas de vérification des privilèges. Si l’indicateur SEF_AVOID_OWNER_CHECK est également défini, le paramètre Token peut être NULL. Cet indicateur est utile lors de l’implémentation de l’héritage automatique pour éviter de vérifier les privilèges sur chaque enfant mis à jour. |
|
La fonction n’case activée pas la validité du propriétaire dans le NewDescriptor résultant, comme décrit dans la section Notes. Si l’indicateur SEF_AVOID_PRIVILEGE_CHECK est également défini, le paramètre Token peut être NULL. |
|
Par défaut, le propriétaire de NewDescriptor est le propriétaire de ParentDescriptor. S’il n’est pas défini, le propriétaire de NewDescriptor utilise par défaut le propriétaire du jeton spécifié par le paramètre Token . Le propriétaire du jeton est spécifié dans le jeton lui-même. Dans les deux cas, si le paramètre CreatorDescriptor n’est pas NULL, le propriétaire NewDescriptor est défini sur le propriétaire à partir de CreatorDescriptor. |
|
Le groupe de NewDescriptor est défini par défaut sur le groupe de ParentDescriptor. S’il n’est pas défini, le groupe de NewDescriptor est défini par défaut sur le groupe du jeton spécifié par le paramètre Token . Le groupe du jeton est spécifié dans le jeton lui-même. Dans les deux cas, si le paramètre CreatorDescriptor n’est pas NULL, le groupe NewDescriptor est défini sur le groupe à partir de CreatorDescriptor. |
|
Un principal dont le niveau obligatoire est inférieur à celui de l’objet ne peut pas écrire dans l’objet . |
|
Un principal dont le niveau obligatoire est inférieur à celui de l’objet ne peut pas lire l’objet. |
|
Un principal dont le niveau obligatoire est inférieur à celui de l’objet ne peut pas exécuter l’objet . |
|
Toutes les restrictions spécifiées par le paramètre ParentDescriptor qui limiteraient la capacité de l’appelant à spécifier une liste dacl dans CreatorDescriptor sont ignorées. |
[in, optional] Token
Handle du jeton d’accès pour le processus client pour le compte duquel l’objet est créé. S’il s’agit d’un jeton d’emprunt d’identité, il doit être au niveau SecurityIdentification ou supérieur. Pour obtenir une description complète du niveau d’emprunt d’identité SecurityIdentification, consultez le SECURITY_IMPERSONATION_LEVEL type énuméré.
Le jeton client contient des informations de sécurité par défaut, telles que le propriétaire par défaut, le groupe principal et LE DACL. Cette fonction utilise ces valeurs par défaut si les informations ne se situent pas dans les descripteurs de sécurité d’entrée. Le jeton doit être ouvert pour un accès TOKEN_QUERY .
Si toutes les conditions suivantes sont remplies, le handle doit être ouvert pour l’accès TOKEN_DUPLICATE en plus de l’accès TOKEN_QUERY .
- Le handle de jeton fait référence à un jeton principal.
- Le descripteur de sécurité du jeton contient un ou plusieurs ACL avec le SID OwnerRights .
- Un descripteur de sécurité est spécifié pour le paramètre CreatorDescriptor .
- L’appelant de cette fonction ne définit pas l’indicateur SEF_AVOID_OWNER_RESTRICTION dans le paramètre AutoInheritFlags .
[in] GenericMapping
Pointeur vers une structure GENERIC_MAPPING qui spécifie le mappage de chaque droit générique à des droits spécifiques pour l’objet.
Valeur retournée
Si la fonction réussit, la fonction retourne une valeur différente de zéro.
Si la fonction échoue, elle retourne zéro. Appelez GetLastError pour obtenir des informations d’erreur étendues. Certains codes d’erreur étendus et leurs significations sont répertoriés dans le tableau suivant.
Code de retour | Description |
---|---|
|
La fonction ne peut pas récupérer un groupe principal pour le nouveau descripteur de sécurité. |
|
La fonction ne peut pas récupérer un propriétaire pour le nouveau descripteur de sécurité ou l’identificateur de sécurité (SID) ne peut pas être attribué en tant que propriétaire. Cela se produit lors de la validation du SID du propriétaire par rapport au jeton passé. |
|
La fonction a reçu null au lieu d’un jeton pour la validation du propriétaire ou la vérification des privilèges . |
|
Une liste SACL est définie, SEF_AVOID_PRIVILEGE_CHECK n’a pas été passée et le jeton transmis n’a pas SE_SECURITY_NAME activé. |
Remarques
La fonction CreatePrivateObjectSecurityEx est identique à l’appel de la fonction CreatePrivateObjectSecurityWithMultipleInheritance avec un GUID unique dans ObjectTypes.
Les AutoInheritFlags sont distincts des bits nommés de la même façon dans le membre Control de la structure SECURITY_DESCRIPTOR . Pour obtenir une explication des bits de contrôle, consultez SECURITY_DESCRIPTOR_CONTROL.
Si AutoInheritFlags spécifie le bit SEF_DACL_AUTO_INHERIT, la fonction applique les règles suivantes au dacl dans le nouveau descripteur de sécurité :
- L’indicateur SE_DACL_AUTO_INHERITED est défini dans le membre Control du nouveau descripteur de sécurité.
- La liste DACL du nouveau descripteur de sécurité hérite des ACÉ de ParentDescriptor , que CreatorDescriptor soit le descripteur de sécurité par défaut ou ait été explicitement spécifié par le créateur. Le nouveau DACL est une combinaison des DLL parent et créateur telles que définies par les règles d’héritage. Plus précisément, toutes les ACL dans ParentDescriptor qui peuvent être héritées à tous les objets enfants ou à toute classe d’objet répertoriée dans ObjectTypes seront appliquées au nouveau DACL.
- Les ACL hérités sont marqués comme INHERITED_ACE.
Pour les DACL et les SACL, certains types d’ACL dans ParentDescriptor et CreatorDescriptor seront manipulés et éventuellement remplacés par deux ACL dans NewDescriptor. Plus précisément, une ace pouvant être héritée qui contient au moins l’un des éléments mappables suivants peut entraîner deux acees dans le descripteur de sécurité de sortie. Les éléments mappables sont les suivants :
- Droits d’accès génériques dans le ACCESS_MASK
- SID du propriétaire du créateur ou SID du groupe de créateurs en tant qu’identificateur d’objet ACE
- Ace qui est une copie de l’original, mais avec l’indicateur INHERIT_ONLY défini. Toutefois, cette ace ne sera pas créée si l’une des deux conditions suivantes existe :
- Le paramètre IsContainerObject est FALSE. Les ACO pouvant être héritées n’ont aucun sens sur les objets non porteurs.
- L’ACE d’origine contient l’indicateur NO_PROPAGATE_INHERIT. L’ACE d’origine est destiné à être hérité en tant qu’ACE efficace sur les enfants, mais ne peut pas être hérité en dessous de ces enfants.
- Ace efficace dans lequel le bit INHERITED_ACE est activé et les éléments génériques sont mappés à des éléments spécifiques :
- Les droits d’accès génériques sont remplacés par les droits d’accès standard et spécifiques correspondants indiqués dans l’entrée GenericMapping.
- Le SID du propriétaire du créateur est remplacé par le propriétaire dans le NewDescriptor résultant
- Le SID du groupe créateur est remplacé par le groupe dans le NewDescriptor résultant
- Doit inclure SE_GROUP_OWNER
- Ne doit pas inclure SE_GROUP_USE_FOR_DENY_ONLY
Pour créer un descripteur de sécurité pour un nouvel objet, appelez CreatePrivateObjectSecurityWithMultipleInheritance avec ParentDescriptor défini sur le descripteur de sécurité du conteneur parent et CreatorDescriptor défini sur le descripteur de sécurité proposé par le créateur de l’objet.
Pour vérifier le descripteur de sécurité actuel sur un objet, appelez CreatePrivateObjectSecurityWithMultipleInheritance avec ParentDescriptor défini sur le descripteur de sécurité du conteneur parent et CreatorDescriptor défini sur le descripteur de sécurité actuel de l’objet. Cet appel garantit que les AE sont correctement hérités des descripteurs de sécurité parent à enfant.
Si le descripteur de sécurité CreatorDescriptor contient une SACL, token doit avoir le privilège SE_SECURITY_NAME activé ou l’appelant doit spécifier l’indicateur SEF_AVOID_PRIVILEGE_CHECK dans AutoInheritFlags.
Configuration requise
Condition requise | Valeur |
---|---|
Client minimal pris en charge | Windows XP [applications de bureau uniquement] |
Serveur minimal pris en charge | Windows Server 2003 [applications de bureau uniquement] |
Plateforme cible | Windows |
En-tête | securitybaseapi.h (inclure Windows.h) |
Bibliothèque | Advapi32.lib |
DLL | Advapi32.dll |