Partager via


Fonction LogonUserExExW

La fonction LogonUserExExW tente de journaliser un utilisateur sur l’ordinateur local. L’ordinateur local est l’ordinateur à partir duquel LogonUserExExW a été appelé. Vous ne pouvez pas utiliser LogonUserExExW pour vous connecter à un ordinateur distant. Spécifiez l’utilisateur à l’aide d’un nom d’utilisateur et d’un domaine, puis authentifiez-le à l’aide d’un mot de passe en texte clair. Si la fonction réussit, elle reçoit un handle pour un jeton qui représente l’utilisateur connecté. Vous pouvez ensuite utiliser ce handle de jeton pour emprunter l’identité de l’utilisateur spécifié ou, dans la plupart des cas, pour créer un processus qui s’exécute dans le contexte de l’utilisateur spécifié.

Cette fonction est similaire à la fonction LogonUserEx , sauf qu’elle prend le paramètre supplémentaire, pTokenGroups, qui est un ensemble d’identificateurs de sécurité (SID) ajoutés au jeton retourné à l’appelant lorsque l’ouverture de session réussit.

Cette fonction n’est pas déclarée dans un en-tête public et n’a pas de bibliothèque d’importation associée. Vous devez utiliser les fonctions LoadLibrary et GetProcAddress pour établir un lien dynamique vers Advapi32.dll.

Syntaxe

BOOL WINAPI LogonUserExExW(
  _In_      LPTSTR        lpszUsername,
  _In_opt_  LPTSTR        lpszDomain,
  _In_opt_  LPTSTR        lpszPassword,
  _In_      DWORD         dwLogonType,
  _In_      DWORD         dwLogonProvider,
  _In_opt_  PTOKEN_GROUPS pTokenGroups,
  _Out_opt_ PHANDLE       phToken,
  _Out_opt_ PSID          *ppLogonSid,
  _Out_opt_ PVOID         *ppProfileBuffer,
  _Out_opt_ LPDWORD       pdwProfileLength,
  _Out_opt_ PQUOTA_LIMITS pQuotaLimits
);

Paramètres

lpszUsername [in]

Pointeur vers une chaîne terminée par null qui spécifie le nom de l’utilisateur. Il s’agit du nom du compte d’utilisateur auquel se connecter. Si vous utilisez le format de nom d’utilisateur principal (UPN), le paramètre lpszDomain doit avoir la valeur NULL.

lpszDomain [in, facultatif]

Pointeur vers une chaîne terminée par null qui spécifie le nom du domaine ou du serveur dont la base de données de compte contient le compte lpszUsername . Si ce paramètre a la valeur NULL, le nom d’utilisateur doit être spécifié au format UPN. Si ce paramètre est « », la fonction valide le compte en utilisant uniquement la base de données de compte locale.

lpszPassword [in, facultatif]

Pointeur vers une chaîne terminée par null qui spécifie le mot de passe en texte clair du compte d’utilisateur spécifié par lpszUsername. Lorsque vous avez terminé d’utiliser le mot de passe, effacez le mot de passe de la mémoire en appelant la fonction SecureZeroMemory . Pour plus d’informations sur la protection des mots de passe, consultez Gestion des mots de passe.

dwLogonType [in]

Type d’opération d’ouverture de session à effectuer. Ce paramètre peut prendre les valeurs suivantes.

Valeur Signification
LOGON32_LOGON_INTERACTIVE
2
Ce type d’ouverture de session est destiné aux utilisateurs qui utiliseront l’ordinateur de manière interactive, par exemple un utilisateur connecté par un serveur Terminal Server, un interpréteur de commandes distant ou un processus similaire. Ce type d’ouverture de session a pour coût supplémentaire la mise en cache des informations d’ouverture de session pour les opérations déconnectées ; par conséquent, il est inapproprié pour certaines applications client/serveur, telles qu’un serveur de messagerie.
LOGON32_LOGON_NETWORK
3
Ce type d’ouverture de session est destiné aux serveurs hautes performances pour authentifier les mots de passe en texte clair. La fonction LogonUserExExW ne met pas en cache les informations d’identification pour ce type d’ouverture de session.
LOGON32_LOGON_BATCH
4
Ce type d’ouverture de session est destiné aux serveurs par lots, où les processus peuvent s’exécuter pour le compte d’un utilisateur sans intervention directe de celui-ci. Ce type est également destiné aux serveurs plus performants qui traitent de nombreuses tentatives d’authentification en texte clair à la fois, comme les serveurs de messagerie ou web. La fonction LogonUserExExW ne met pas en cache les informations d’identification pour ce type d’ouverture de session.
LOGON32_LOGON_SERVICE
5
Indique une ouverture de session de type service. Le privilège de service doit être activé pour le compte fourni.
LOGON32_LOGON_UNLOCK
7
Ce type d’ouverture de session est destiné aux DLL GINA qui connectent les utilisateurs qui utiliseront l’ordinateur de manière interactive. Ce type d’ouverture de session peut générer un enregistrement d’audit unique qui indique quand la station de travail a été déverrouillée.
LOGON32_LOGON_NETWORK_CLEARTEXT
8
Ce type d’ouverture de session conserve le nom et le mot de passe dans le package d’authentification, ce qui permet au serveur d’établir des connexions à d’autres serveurs réseau tout en empruntant l’identité du client. Un serveur peut accepter les informations d’identification en texte clair d’un client, appeler LogonUserExExW, vérifier que l’utilisateur peut accéder au système sur le réseau et toujours communiquer avec d’autres serveurs.
LOGON32_LOGON_NEW_CREDENTIALS
9
Ce type d’ouverture de session permet à l’appelant de cloner son jeton actuel et de spécifier de nouvelles informations d’identification pour les connexions sortantes. La nouvelle session d’ouverture de session a le même identificateur local, mais utilise des informations d’identification différentes pour d’autres connexions réseau.
Ce type d’ouverture de session est pris en charge uniquement par le fournisseur d’ouverture de session LOGON32_PROVIDER_WINNT50 .

 

dwLogonProvider [in]

Fournisseur d’ouverture de session. Ce paramètre peut prendre les valeurs suivantes.

Valeur Signification
LOGON32_PROVIDER_DEFAULT
Utilisez le fournisseur d’ouverture de session standard pour le système. Le fournisseur de sécurité par défaut est NTLM.
LOGON32_PROVIDER_WINNT50
Utilisez le fournisseur d’ouverture de session de négociation.
LOGON32_PROVIDER_WINNT40
Utilisez le fournisseur d’ouverture de session NTLM.

 

pTokenGroups [in, facultatif]

Pointeur vers une structure de TOKEN_GROUPS qui spécifie une liste de SID de groupe ajoutés au jeton que cette fonction reçoit en cas d’ouverture de session réussie. Tous les SID ajoutés au jeton ont également un effet d’expansion du groupe. Par exemple, si les SID ajoutés sont membres de groupes locaux, ces groupes sont également ajoutés au jeton d’accès reçu.

Si ce paramètre n’est pas NULL, l’appelant de cette fonction doit avoir le privilège SE_TCB_PRIVILEGE accordé et activé.

phToken [out, facultatif]

Pointeur vers une variable de handle qui reçoit un handle vers un jeton qui représente l’utilisateur spécifié.

Vous pouvez utiliser le handle retourné dans les appels à la fonction ImpersonateLoggedOnUser .

Dans la plupart des cas, le handle retourné est un jeton principal que vous pouvez utiliser dans les appels à la fonction CreateProcessAsUser . Toutefois, si vous spécifiez l’indicateur LOGON32_LOGON_NETWORK, LogonUserExExW retourne un jeton d’emprunt d’identité que vous ne pouvez pas utiliser dans CreateProcessAsUser , sauf si vous appelez DuplicateTokenEx pour convertir le jeton d’emprunt d’identité en jeton principal.

Lorsque vous n’avez plus besoin de ce handle, fermez-le en appelant la fonction CloseHandle .

ppLogonSid [out, facultatif]

Pointeur vers un pointeur vers un SID qui reçoit le SID de l’utilisateur connecté.

Une fois que vous avez terminé d’utiliser le SID, libérez-le en appelant la fonction LocalFree .

ppProfileBuffer [out, facultatif]

Pointeur vers un pointeur qui reçoit l’adresse d’une mémoire tampon qui contient le profil de l’utilisateur connecté.

pdwProfileLength [out, facultatif]

Pointeur vers un DWORD qui reçoit la longueur de la mémoire tampon de profil.

pQuotaLimits [out, facultatif]

Pointeur vers une structure QUOTA_LIMITS qui reçoit des informations sur les quotas de l’utilisateur connecté.

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.

Remarques

Le type d’ouverture de session LOGON32_LOGON_NETWORK est le plus rapide, mais il présente les limitations suivantes :

  • La fonction retourne un jeton d’emprunt d’identité, pas un jeton principal. Vous ne pouvez pas utiliser ce jeton directement dans la fonction CreateProcessAsUser . Toutefois, vous pouvez appeler la fonction DuplicateTokenEx pour convertir le jeton en jeton principal, puis l’utiliser dans CreateProcessAsUser.
  • Si vous convertissez le jeton en jeton principal et que vous l’utilisez dans CreateProcessAsUser pour démarrer un processus, le nouveau processus ne peut pas accéder à d’autres ressources réseau, telles que les serveurs distants ou les imprimantes, via le redirecteur. Une exception est que si la ressource réseau n’est pas contrôlée par l’accès, le nouveau processus peut y accéder.

Le compte spécifié par lpszUsername doit disposer des droits de compte nécessaires. Par exemple, pour ouvrir une session sur un utilisateur avec l’indicateur LOGON32_LOGON_INTERACTIVE , l’utilisateur (ou un groupe auquel appartient l’utilisateur) doit disposer du droit de compte SE_INTERACTIVE_LOGON_NAME . Pour obtenir la liste des droits de compte qui affectent les différentes opérations d’ouverture de session, consultez Droits d’accès aux objets de compte.

Un utilisateur est considéré comme connecté s’il existe au moins un jeton. Si vous appelez CreateProcessAsUser , puis fermez le jeton, l’utilisateur est toujours connecté jusqu’à ce que le processus (et tous les processus enfants) se soient terminés.

Si le paramètre pTokenGroups facultatif est fourni, LSA n’ajoute ni le SID local ni le SID d’ouverture de session automatiquement.

Spécifications

Condition requise Valeur
Client minimal pris en charge
Windows Vista [applications de bureau uniquement]
Serveur minimal pris en charge
Windows Server 2008 [applications de bureau uniquement]
Version
LogonUserExExW est également disponible sur Windows Server 2003 ou Windows XP avec la version de distribution générale.
En-tête
Winbasep.h
DLL
Advapi32.dll

Voir aussi

Access Control client/serveur

Fonctions client/serveur Access Control

CloseHandle

CreateProcessAsUser

DuplicateTokenEx

ImpersonateLoggedOnUser

LogonUserEx

QUOTA_LIMITS