Partager via


Fonction NtDuplicateToken (ntifs.h)

La fonction NtDuplicateToken crée un handle pour un nouveau jeton d’accès qui duplique un jeton existant. Cette fonction peut créer un jeton principal ou un jeton d’emprunt d’identité.

Syntaxe

__kernel_entry NTSYSCALLAPI NTSTATUS NtDuplicateToken(
  [in]  HANDLE             ExistingTokenHandle,
  [in]  ACCESS_MASK        DesiredAccess,
  [in]  POBJECT_ATTRIBUTES ObjectAttributes,
  [in]  BOOLEAN            EffectiveOnly,
  [in]  TOKEN_TYPE         TokenType,
  [out] PHANDLE            NewTokenHandle
);

Paramètres

[in] ExistingTokenHandle

Handle à un jeton d’accès existant qui a été ouvert avec le droit d’accès TOKEN_DUPLICATE. Ce paramètre est obligatoire et ne peut pas être NULL.

[in] DesiredAccess

Masque de bits qui spécifie les droits d’accès demandés pour le nouveau jeton. NtDuplicateToken compare les droits d’accès demandés à la liste de contrôle d’accès discrétionnaire (DACL) du jeton existant pour déterminer quels droits sont accordés ou refusés au nouveau jeton. Pour demander les mêmes droits d’accès que le jeton existant, spécifiez zéro. Pour demander tous les droits d’accès valides pour l’appelant, spécifiez MAXIMUM_ALLOWED. Ce paramètre est facultatif et peut être égal à zéro, MAXIMUM_ALLOWED ou une combinaison au niveau du bit OU d’une ou plusieurs des valeurs suivantes :

Valeur Signification
Suppression Obligatoire pour supprimer l’objet.
READ_CONTROL Obligatoire pour lire les informations DACL et de propriété de l’objet. Pour accéder à la liste de contrôle d’accès système (SACL), consultez ACCESS_SYSTEM_SECURITY plus loin dans ce tableau.
WRITE_DAC Obligatoire pour modifier les informations DACL pour l’objet.
WRITE_OWNER Obligatoire pour modifier les informations de propriété dans le descripteur de sécurité de l’objet (SECURITY_DESCRIPTOR).
ACCESS_SYSTEM_SECURITY Obligatoire pour obtenir ou définir la liste SACL dans la liste de contrôle d’accès d’un objet. Le système d’exploitation accorde ce droit au nouveau jeton uniquement si le privilège SE_SECURITY_NAME est activé dans le jeton d’accès du thread appelant.
STANDARD_RIGHTS_READ Actuellement défini comme égal à READ_CONTROL.
STANDARD_RIGHTS_WRITE Actuellement défini comme égal à READ_CONTROL.
STANDARD_RIGHTS_EXECUTE Actuellement défini comme égal à READ_CONTROL.
STANDARD_RIGHTS_REQUIRED Combine l’accès DELETE, READ_CONTROL, WRITE_DAC et WRITE_OWNER.
STANDARD_RIGHTS_ALL Combine l’accès DELETE, READ_CONTROL, WRITE_DAC, WRITE_OWNER et SYNCHRONIZE. Toutefois, la valeur SYNCHRONIZE ne s’applique pas aux objets de jeton. Ainsi, STANDARD_RIGHTS_ALL a un équivalent fonctionnel à STANDARD_RIGHTS_REQUIRED.
TOKEN_ADJUST_DEFAULT Obligatoire pour modifier le propriétaire par défaut, le groupe principal ou la liste de contrôle d’accès d’un jeton d’accès.
TOKEN_ADJUST_GROUPS Obligatoire pour ajuster les attributs des groupes dans un jeton d’accès.
TOKEN_ADJUST_PRIVILEGES Obligatoire pour activer ou désactiver les privilèges dans un jeton d’accès.
TOKEN_ADJUST_SESSIONID Obligatoire pour ajuster l’ID de session (SID) d’un jeton d’accès. Le système d’exploitation accorde ce droit au nouveau jeton uniquement si le privilège SE_TCB_NAME est activé dans le jeton d’accès du thread appelant.
TOKEN_ASSIGN_PRIMARY Obligatoire pour attacher un jeton principal à un processus. Le système d’exploitation accorde ce droit au nouveau jeton uniquement si le privilège SE_ASSIGNPRIMARYTOKEN_NAME est activé dans le jeton d’accès du thread appelant.
TOKEN_DUPLICATE Obligatoire pour dupliquer un jeton d’accès. Notez que le jeton ExistingTokenHandle donné doit contenir ce droit pour pouvoir utiliser correctement cette routine.
TOKEN_EXECUTE Combine STANDARD_RIGHTS_EXECUTE et TOKEN_IMPERSONATE.
TOKEN_IMPERSONATE Obligatoire pour attacher un jeton d’accès d’emprunt d’identité à un processus.
TOKEN_QUERY Obligatoire pour interroger un jeton d’accès.
TOKEN_QUERY_SOURCE Obligatoire pour interroger la source d’un jeton d’accès.
TOKEN_READ Combine STANDARD_RIGHTS_READ et TOKEN_QUERY.
TOKEN_WRITE Combine STANDARD_RIGHTS_WRITE, TOKEN_ADJUST_PRIVILEGES, TOKEN_ADJUST_GROUPS et TOKEN_ADJUST_DEFAULT.
TOKEN_ALL_ACCESS Combine toutes les autorisations d’accès au jeton possibles pour un jeton.

Pour plus d’informations, consultez Droits d’accès pour les objets Access-Token. Notez que les jetons d’accès ne prennent pas en charge le droit SYNCHRONIZE.

[in] ObjectAttributes

Pointeur vers une structure OBJECT_ATTRIBUTES qui décrit les propriétés demandées pour le nouveau jeton. Le paramètre ObjectAttributes est facultatif et peut être NULL. Si le paramètre ObjectAttributes a la valeur NULL ou si le membre SecurityDescriptor de la structure pointée par le paramètre ObjectAttributes est NULL, le nouveau jeton reçoit un descripteur de sécurité par défaut et le nouveau handle de jeton ne peut pas être hérité. Dans ce cas, ce descripteur de sécurité par défaut est créé à partir du groupe d’utilisateurs, du groupe principal et des informations DACL stockées dans le jeton de l’appelant.

Lorsque le paramètre TokenType est défini sur TokenImpersonation :

  • Le paramètre ObjectAttributes peut être utilisé pour spécifier le niveau d’emprunt d’identité du nouveau jeton. Pour ce faire, définissez ObjectAttributes-SecurityQualityOfService.ImpersonationLevel >sur une valeur d’énumération SECURITY_IMPERSONATION_LEVEL appropriée. Pour plus d’informations, consultez SECURITY_QUALITY_OF_SERVICE.
  • Si le jeton existant est un jeton d’emprunt d’identité et que le paramètre ObjectAttributes ne fournit aucune information d’emprunt d’identité, le niveau d’emprunt d’identité du nouveau jeton est défini sur le niveau d’emprunt d’identité du jeton existant.
  • Si le jeton existant est un jeton principal et qu’aucune information de niveau d’emprunt d’identité n’est fournie, le nouveau jeton d’emprunt d’identité aura un SECURITY_IMPERSONATION_LEVEL niveau d’emprunt d’identité.

[in] EffectiveOnly

Valeur booléenne qui indique si l’intégralité du jeton existant doit être dupliquée dans le nouveau jeton ou uniquement dans la partie effective (actuellement activée) du jeton. Si la valeur est TRUE, seules les parties actuellement activées du jeton source seront dupliquées. Si la valeur est FALSE, la totalité du jeton existant est dupliquée. Cela permet à l’appelant d’un sous-système protégé de limiter les groupes et privilèges facultatifs mis à la disposition du sous-système protégé. Par exemple, si EffectiveOnly a la valeur TRUE, l’appelant peut dupliquer un jeton, mais supprimer le groupe Administrateurs et le droit SeTcbPrivilege. Le jeton résultant peut ensuite être passé à un processus enfant (CreateProcessAsUser), ce qui limiterait ce que le processus enfant peut faire. Ce paramètre est obligatoire.

[in] TokenType

Spécifie l’une des valeurs suivantes de l’énumération TOKEN_TYPE .

Valeur Signification
TokenPrimary Le nouveau jeton est un jeton principal. Si le jeton existant est un jeton d’emprunt d’identité, le jeton d’emprunt d’identité existant doit avoir un niveau d’emprunt d’identité (comme fourni par le paramètre ObjectAttributes ) de SecurityImpersonation ou SecurityDelegation. Sinon, NtDuplicateToken retourne STATUS_BAD_IMPERSONATION_LEVEL est retourné.
TokenImpersonation Le nouveau jeton est un jeton d’emprunt d’identité. Si le jeton existant est un jeton d’emprunt d’identité, le niveau d’emprunt d’identité demandé (tel que fourni par le paramètre ObjectAttributes ) du nouveau jeton ne doit pas être supérieur au niveau d’emprunt d’identité du jeton existant. Sinon, NtDuplicateToken retourne STATUS_BAD_IMPERSONATION_LEVEL.

Le paramètre TokenType est obligatoire et ne peut pas être NULL.

[out] NewTokenHandle

Pointeur vers une variable allouée par l’appelant, de type HANDLE, qui reçoit un handle vers le nouveau jeton. Ce paramètre est obligatoire et ne peut pas avoir la valeur NULL.

Valeur retournée

NtDuplicateToken retourne STATUS_SUCCESS si l’appel réussit. Les codes de retour d’erreur possibles sont les suivants :

Code de retour Description
STATUS_ACCESS_VIOLATION Une violation d’accès à la mémoire s’est produite. Par exemple, si le mode précédent était le mode utilisateur et que la mémoire en mode utilisateur non valide a été fournie, NtDuplicateToken retourne STATUS_ACCESS_VIOLATION.
STATUS_INSUFFICIENT_RESOURCES La mémoire suffisante n’a pas pu être allouée pour dupliquer le nouveau jeton.
STATUS_INVALID_PARAMETER Un paramètre non valide a été détecté.
STATUS_BAD_IMPERSONATION_LEVEL Le niveau d’emprunt d’identité demandé pour le nouveau jeton est supérieur au niveau d’emprunt d’identité du jeton existant.
STATUS_ACCESS_DENIED NtDuplicateToken n’a pas pu accéder à ExistingTokenHandle. Cela se produit si le jeton existant n’a pas le droit d’accès TOKEN_DUPLICATE.
STATUS_INVALID_HANDLE ExistingTokenHandle fait référence à un handle non valide.

Remarques

Si aucune information de niveau d’emprunt d’identité n’a été fournie par le paramètre ObjectAttributes , le niveau d’emprunt d’identité du jeton existant est utilisé pour le nouveau jeton.

En ce qui concerne la structure pointée vers le paramètre ObjectAttributes facultatif, le membre SecurityQualityOfService de OBJECT_ATTRIBUTES pointe vers une structure de type SECURITY_QUALITY_OF_SERVICE. Consultez SECURITY_QUALITY_OF_SERVICE pour plus d’informations sur les membres de cette structure.

Le membre SecurityQualityOfService doit être défini après l’appel de la macro InitializeObjectAttributes , car InitializeObjectAttributes définit actuellement SecurityQualityOfService sur NULL.

Pour plus d’informations sur l’analogue en mode utilisateur de NtDuplicateToken, consultez DuplicateTokenEx dans la documentation SDK Windows.

Une fois que vous avez terminé d’utiliser le nouveau jeton, appelez la fonction NtClose pour fermer le handle de jeton.

Si l’appel à la fonction NtDuplicateToken se produit en mode utilisateur, vous devez utiliser le nom « NtDuplicateToken » au lieu de « NtDuplicateToken ».

Pour les appels à partir de pilotes en mode noyau, les versions NtXxx et ZwXxx d’une routine Windows Native System Services peuvent se comporter différemment dans la façon dont elles gèrent et interprètent les paramètres d’entrée. Pour plus d’informations sur la relation entre les versions NtXxx et ZwXxx d’une routine, consultez Utilisation des versions Nt et Zw des routines des services système natifs.

Configuration requise

Condition requise Valeur
Client minimal pris en charge Windows 2000
Plateforme cible Universal
En-tête ntifs.h (inclure Ntifs.h, FltKernel.h)
Bibliothèque NtosKrnl.lib
DLL NtosKrnl.exe
IRQL PASSIVE_LEVEL
Règles de conformité DDI HwStorPortProhibitedDDIs, PowerIrpDDis

Voir aussi

ACCESS_MASK

InitializeObjectAttributes

OBJECT_ATTRIBUTES

SECURITY_IMPERSONATION_LEVEL