Partager via


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
SEF_DACL_AUTO_INHERIT
0x01
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.
SEF_SACL_AUTO_INHERIT
0x02
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.
SEF_DEFAULT_DESCRIPTOR_FOR_OBJECT
0x04
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é.
SEF_AVOID_PRIVILEGE_CHECK
0x08
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.
SEF_AVOID_OWNER_CHECK
0x10
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.
SEF_DEFAULT_OWNER_FROM_PARENT
0x20
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.
SEF_DEFAULT_GROUP_FROM_PARENT
0x40
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.
SEF_MACL_NO_WRITE_UP
0x100
Un principal dont le niveau obligatoire est inférieur à celui de l’objet ne peut pas écrire dans l’objet .
SEF_MACL_NO_READ_UP
0x200
Un principal dont le niveau obligatoire est inférieur à celui de l’objet ne peut pas lire l’objet.
SEF_MACL_NO_EXECUTE_UP
0x400
Un principal dont le niveau obligatoire est inférieur à celui de l’objet ne peut pas exécuter l’objet .
SEF_AVOID_OWNER_RESTRICTION
0x1000
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
ERROR_INVALID_PRIMARY_GROUP
La fonction ne peut pas récupérer un groupe principal pour le nouveau descripteur de sécurité.
ERROR_INVALID_OWNER
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é.
ERROR_NO_TOKEN
La fonction a reçu null au lieu d’un jeton pour la validation du propriétaire ou la vérification des privilèges .
ERROR_PRIVILEGE_NOT_HELD
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.
Si AutoInheritFlags spécifie le bit SEF_SACL_AUTO_INHERIT, la fonction applique des règles similaires à la nouvelle SACL.

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
Les ACÉ avec l’un de ces éléments mappables entraînent les deux ACÉ suivants dans NewDescriptor :
  • 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
Si AutoInheritFlags ne spécifie pas le bit SEF_AVOID_OWNER_CHECK, la vérification de la validité du propriétaire est effectuée conformément aux règles suivantes. Le propriétaire dans le NewDescriptor résultant doit être un SID légalement formé, et doit correspondre à TokenUser dans Token ou doit correspondre à un groupe dans TokenGroups dans Token. Attributs sur le groupe :
  • Doit inclure SE_GROUP_OWNER
  • Ne doit pas inclure SE_GROUP_USE_FOR_DENY_ONLY
Les appelants qui n’ont pas accès au jeton du client qui définira finalement le propriétaire peuvent choisir d’ignorer la vérification de la validation du propriétaire.

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

Voir aussi

CreatePrivateObjectSecurityEx

DestroyPrivateObjectSecurity

GENERIC_MAPPING

GUID

SECURITY_DESCRIPTOR

SECURITY_DESCRIPTOR_CONTROL

SECURITY_IMPERSONATION_LEVEL