Partager via


CreatePrivateObjectSecurityEx, fonction (securitybaseapi.h)

La fonction CreatePrivateObjectSecurityEx alloue et initialise un descripteur de sécurité auto-relatif pour un nouvel objet privé créé par le gestionnaire de ressources appelant cette fonction.

Syntaxe

BOOL CreatePrivateObjectSecurityEx(
  [in, optional] PSECURITY_DESCRIPTOR ParentDescriptor,
  [in, optional] PSECURITY_DESCRIPTOR CreatorDescriptor,
  [out]          PSECURITY_DESCRIPTOR *NewDescriptor,
  [in, optional] GUID                 *ObjectType,
  [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é du 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 qui reçoit 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
Fonction DestroyPrivateObjectSecurity .

[in, optional] ObjectType

Pointeur vers une structure GUID qui identifie le type d’objet associé à NewDescriptor. Si l’objet n’a pas de GUID, définissez ObjectType sur NULL.

[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_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 Remarques ci-dessous. Si l’indicateur SEF_AVOID_PRIVILEGE_CHECK est également défini, le paramètre Token peut avoir la valeur NULL.
SEF_AVOID_OWNER_RESTRICTION
0x1000
Toutes les restrictions spécifiées par parentDescriptor qui limiteraient la capacité de l’appelant à spécifier une liste de contrôle d’accès (DACL) dans le CreatorDescriptor sont ignorées.
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 avoir la valeur 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_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 AIC explicites spécifiés dans la liste DACL de CreatorDescriptor. Si cet indicateur n’est pas défini, la nouvelle liste de contrôle d’accès n’hérite pas d’ACA.
SEF_DEFAULT_DESCRIPTOR_FOR_OBJECT
0x04
CreatorDescriptor est le descripteur par défaut pour le type d’objet spécifié par ObjectType. Par conséquent, CreatorDescriptor est ignoré si ParentDescriptor a des ACÉ spécifiques à un objet pour le type d’objet spécifié par le paramètre ObjectType . Si aucun de ces AE n’est hérité, CreatorDescriptor est géré comme si cet indicateur n’était pas spécifié.
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_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 est 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’a pas la valeur NULL, le propriétaire NewDescriptor est défini sur le propriétaire à partir de CreatorDescriptor.
SEF_MACL_NO_EXECUTE_UP
0x400
Lorsque cet indicateur est défini, l’étiquette ACE obligatoire dans CreatorDescriptor n’est pas utilisée pour créer une étiquette ACE obligatoire dans NewDescriptor. Au lieu de cela, une nouvelle SYSTEM_MANDATORY_LABEL_ACE avec un masque d’accès de SYSTEM_MANDATORY_LABEL_NO_EXECUTE_UP et le SID du SID d’intégrité du jeton est ajouté à NewDescriptor.
SEF_MACL_NO_READ_UP
0x200
Lorsque cet indicateur est défini, l’étiquette ACE obligatoire dans CreatorDescriptor n’est pas utilisée pour créer une étiquette ACE obligatoire dans NewDescriptor. Au lieu de cela, une nouvelle SYSTEM_MANDATORY_LABEL_ACE avec un masque d’accès de SYSTEM_MANDATORY_LABEL_NO_READ_UP et le SID du SID d’intégrité du jeton est ajouté à NewDescriptor.
SEF_MACL_NO_WRITE_UP
0x100
Lorsque cet indicateur est défini, l’étiquette ACE obligatoire dans CreatorDescriptor n’est pas utilisée pour créer une étiquette ACE obligatoire dans NewDescriptor. Au lieu de cela, une nouvelle SYSTEM_MANDATORY_LABEL_ACE avec un masque d’accès de SYSTEM_MANDATORY_LABEL_NO_WRITE_UP et le SID du SID d’intégrité du jeton est ajouté à NewDescriptor.
SEF_SACL_AUTO_INHERIT
0x02
La nouvelle liste de contrôle d’accès système (SACL) contient des AÉC héritées de la SACL de ParentDescriptor, ainsi que tous les AIC explicites spécifiés dans la SACL de CreatorDescriptor. Si cet indicateur n’est pas défini, la nouvelle liste SACL n’hérite pas des ACA.

[in, optional] Token

Handle du jeton d’accès pour le processus client au nom duquel l’objet est en cours de création. 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 LACL. La 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 TOKEN_QUERY accès.

Si toutes les conditions suivantes sont remplies, le handle doit être ouvert pour TOKEN_DUPLICATE accès en plus de TOKEN_QUERY accès.

  • Le handle de jeton fait référence à un jeton principal.
  • Le descripteur de sécurité du jeton contient un ou plusieurs AE 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 de GENERIC_MAPPING qui spécifie le mappage de chaque droit générique vers 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. Pour obtenir des informations détaillées sur l’erreur, appelez GetLastError. Certains des codes d’erreur étendus et leurs significations sont répertoriés dans le tableau suivant.

Code de retour Description
ERROR_INVALID_OWNER
La fonction ne peut pas récupérer un propriétaire pour le nouveau descripteur de sécurité ou le SID ne peut pas être affecté en tant que propriétaire. Cela se produit lors de la validation du SID du propriétaire par rapport au jeton transmis.
ERROR_INVALID_PRIMARY_GROUP
La fonction ne peut pas récupérer un groupe principal pour le nouveau descripteur de sécurité.
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 de contrôle d’accès partagé est en cours de définition, SEF_AVOID_PRIVILEGE_CHECK n’a pas été transmise et le jeton transmis n’a pas SE_SECURITY_NAME activé.

Remarques

La fonction CreatePrivateObjectSecurity est identique à l’appel de la fonction CreatePrivateObjectSecurityEx avec ObjectType défini sur NULL et AutoInheritFlags défini sur zéro.

Le paramètre AutoInheritFlags est distinct des bits de même nom 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 SEF_DACL_AUTO_INHERIT bit, la fonction applique les règles suivantes à la liste de contrôle d’accès d’accès (DACL) dans le nouveau descripteur de sécurité :

  • L’indicateur SE_DACL_AUTO_INHERITED est défini dans le membre Contrôle du nouveau descripteur de sécurité.
  • La liste de contrôle d’accès du nouveau descripteur de sécurité hérite des AE du parentDescriptor , que CreatorDescriptor soit le descripteur de sécurité par défaut ou ait été explicitement spécifié par le créateur. La nouvelle liste de contrôle d’accès (DACL) est une combinaison des dll DACL parent et créateur telles que définies par les règles d’héritage.
  • Les AE hérités sont marqués comme INHERITED_ACE.
Si AutoInheritFlags spécifie le SEF_SACL_AUTO_INHERIT bit, la fonction applique des règles similaires à la nouvelle liste SACL.

Pour les DACL et les SACL, certains types d’ACÉ dans ParentDescriptor et CreatorDescriptor seront manipulés et éventuellement remplacés par deux ACÉ dans NewDescriptor. Plus précisément, un ACE pouvant être hérité qui contient au moins un des éléments mappables suivants peut entraîner deux AE dans le descripteur de sécurité de sortie. Les éléments Mappable sont les suivants :

  • Droits d’accès génériques dans le ACCESS_MASK
  • SID propriétaire du créateur ou SID du groupe de créateurs en tant qu’identificateur d’objet ACE
Les AÉC avec l’un des éléments mappables mentionnés précédemment entraînent les 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 hérités sont vides de sens sur les objets non-contenus.
    • 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 il n’est pas héritable 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, notamment :
    • 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 SEF_AVOID_OWNER_CHECK bit, la vérification de la validité du propriétaire est effectuée. Le propriétaire du NewDescriptor résultant doit être un SID légalement formé, et doit correspondre à l’utilisateur token dans Jeton ou correspondre à un groupe dans tokenGroups dans Jeton où les attributs du groupe doivent inclure SE_GROUP_OWNER et 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 validation du propriétaire.

Pour créer un descripteur de sécurité pour un nouvel objet, appelez CreatePrivateObjectSecurityEx 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.

Si le descripteur de sécurité CreatorDescriptor contient une liste SACL, le jeton 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

Fonctions client/serveur Access Control

Vue d’ensemble des Access Control client/serveur

CreatePrivateObjectSecurity

DestroyPrivateObjectSecurity

GENERIC_MAPPING

GUID

GetTokenInformation

OpenProcessToken

SECURITY_DESCRIPTOR

SECURITY_DESCRIPTOR_CONTROL

SECURITY_IMPERSONATION_LEVEL

SetPrivateObjectSecurityEx