Compartir a través de


Función LogonUserExExW

La función LogonUserExExW intenta registrar un usuario en el equipo local. El equipo local es el equipo desde el que se llamó a LogonUserExExW . No puede usar LogonUserExExW para iniciar sesión en un equipo remoto. Especifique el usuario mediante un nombre de usuario y un dominio y autentique al usuario mediante una contraseña de texto no cifrado. Si la función se realiza correctamente, recibe un identificador de un token que representa al usuario que ha iniciado sesión. Después, puede usar este identificador de token para suplantar al usuario especificado o, en la mayoría de los casos, para crear un proceso que se ejecute en el contexto del usuario especificado.

Esta función es similar a la función LogonUserEx , salvo que toma el parámetro adicional, pTokenGroups, que es un conjunto de uno o varios identificadores de seguridad (SID) que se agregan al token devuelto al autor de la llamada cuando el inicio de sesión se realiza correctamente.

Esta función no se declara en un encabezado público y no tiene ninguna biblioteca de importación asociada. Debe usar las funciones LoadLibrary y GetProcAddress para vincular dinámicamente a Advapi32.dll.

Sintaxis

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
);

Parámetros

lpszUsername [in]

Puntero a una cadena terminada en null que especifica el nombre del usuario. Este es el nombre de la cuenta de usuario en la que iniciar sesión. Si usa el formato de nombre principal de usuario (UPN), el parámetro lpszDomain debe ser NULL.

lpszDomain [in, opcional]

Puntero a una cadena terminada en null que especifica el nombre del dominio o servidor cuya base de datos de cuenta contiene la cuenta lpszUsername . Si este parámetro es NULL, el nombre de usuario debe especificarse en formato UPN. Si este parámetro es ".", la función valida la cuenta usando solo la base de datos de la cuenta local.

lpszPassword [in, optional]

Puntero a una cadena terminada en null que especifica la contraseña de texto no cifrado de la cuenta de usuario especificada por lpszUsername. Cuando haya terminado de usar la contraseña, borre la contraseña de la memoria mediante una llamada a la función SecureZeroMemory . Para obtener más información sobre la protección de contraseñas, consulte Control de contraseñas.

dwLogonType [in]

Tipo de operación de inicio de sesión que se va a realizar. Este parámetro puede ser uno de los valores siguientes.

Valor Significado
LOGON32_LOGON_INTERACTIVE
2
Este tipo de inicio de sesión está pensado para los usuarios que van a usar interactivamente el equipo, como un usuario que ha iniciado sesión mediante un servidor de terminal , un shell remoto o un proceso similar. Este tipo de inicio de sesión tiene el gasto adicional de almacenar en caché información de inicio de sesión para las operaciones desconectadas; por lo tanto, no es adecuado para algunas aplicaciones cliente/servidor, como un servidor de correo.
LOGON32_LOGON_NETWORK
3
Este tipo de inicio de sesión está destinado a servidores de alto rendimiento para autenticar contraseñas de texto no cifrado. La función LogonUserExExW no almacena en caché las credenciales de este tipo de inicio de sesión.
LOGON32_LOGON_BATCH
4
Este tipo de inicio de sesión está pensado para servidores por lotes, donde los procesos pueden ejecutarse en nombre de un usuario sin su intervención directa. Este tipo también es para servidores de mayor rendimiento que procesan muchos intentos de autenticación de texto no cifrado a la vez, como el correo o los servidores web. La función LogonUserExExW no almacena en caché las credenciales de este tipo de inicio de sesión.
LOGON32_LOGON_SERVICE
5
Indica un inicio de sesión de tipo de servicio. La cuenta proporcionada debe tener habilitado el privilegio de servicio.
LOGON32_LOGON_UNLOCK
7
Este tipo de inicio de sesión es para los archivos DLL de GINA que inician sesión en los usuarios que van a usar el equipo de forma interactiva. Este tipo de inicio de sesión puede generar un registro de auditoría único que muestra cuándo se desbloqueó la estación de trabajo.
LOGON32_LOGON_NETWORK_CLEARTEXT
8
Este tipo de inicio de sesión conserva el nombre y la contraseña en el paquete de autenticación, lo que permite al servidor realizar conexiones a otros servidores de red al suplantar al cliente. Un servidor puede aceptar credenciales de texto no cifrado de un cliente, llamar a LogonUserExW, comprobar que el usuario puede acceder al sistema a través de la red y seguir comunicándose con otros servidores.
LOGON32_LOGON_NEW_CREDENTIALS
9
Este tipo de inicio de sesión permite al autor de la llamada clonar su token actual y especificar nuevas credenciales para las conexiones salientes. La nueva sesión de inicio de sesión tiene el mismo identificador local, pero usa credenciales diferentes para otras conexiones de red.
Este tipo de inicio de sesión solo es compatible con el proveedor de inicio de sesión de LOGON32_PROVIDER_WINNT50 .

 

dwLogonProvider [in]

Proveedor de inicio de sesión. Este parámetro puede ser uno de los valores siguientes.

Valor Significado
LOGON32_PROVIDER_DEFAULT
Use el proveedor de inicio de sesión estándar para el sistema. El proveedor de seguridad predeterminado es NTLM.
LOGON32_PROVIDER_WINNT50
Use el proveedor de inicio de sesión negotiate.
LOGON32_PROVIDER_WINNT40
Use el proveedor de inicio de sesión NTLM.

 

pTokenGroups [in, opcional]

Puntero a una estructura de TOKEN_GROUPS que especifica una lista de SID de grupo que se agregan al token que recibe esta función tras el inicio de sesión correcto. Los SID agregados al token también afectan a la expansión del grupo. Por ejemplo, si los SID agregados son miembros de grupos locales, esos grupos también se agregan al token de acceso recibido.

Si este parámetro no es NULL, el autor de la llamada de esta función debe tener el privilegio SE_TCB_PRIVILEGE concedido y habilitado.

phToken [out, opcional]

Puntero a una variable de identificador que recibe un identificador a un token que representa al usuario especificado.

Puede usar el identificador devuelto en las llamadas a la función ImpersonateLoggedOnUser .

En la mayoría de los casos, el identificador devuelto es un token principal que se puede usar en llamadas a la función CreateProcessAsUser . Sin embargo, si especifica la marca LOGON32_LOGON_NETWORK, LogonUserExExW devuelve un token de suplantación que no puede usar en CreateProcessAsUser a menos que llame a DuplicateTokenEx para convertir el token de suplantación en un token principal.

Cuando ya no necesite este identificador, ciérralo llamando a la función CloseHandle .

ppLogonSid [out, opcional]

Puntero a un puntero a un SID que recibe el SID del usuario que ha iniciado sesión.

Cuando haya terminado de usar el SID, puede liberarlo llamando a la función LocalFree .

ppProfileBuffer [out, optional]

Puntero a un puntero que recibe la dirección de un búfer que contiene el perfil del usuario que ha iniciado sesión.

pdwProfileLength [out, opcional]

Puntero a un DWORD que recibe la longitud del búfer de perfil.

pQuotaLimits [out, opcional]

Puntero a una estructura de QUOTA_LIMITS que recibe información sobre las cuotas del usuario que ha iniciado sesión.

Valor devuelto

Si la función se ejecuta correctamente, la función devuelve un valor distinto de cero.

Si se produce un error en la función, devuelve cero. Para obtener información de error extendida, llame a GetLastError.

Comentarios

El tipo de inicio de sesión de LOGON32_LOGON_NETWORK es más rápido, pero tiene las siguientes limitaciones:

  • La función devuelve un token de suplantación, no un token principal. No puede usar este token directamente en la función CreateProcessAsUser . Sin embargo, puede llamar a la función DuplicateTokenEx para convertir el token en un token principal y, a continuación, usarlo en CreateProcessAsUser.
  • Si convierte el token en un token principal y lo usa en CreateProcessAsUser para iniciar un proceso, el nuevo proceso no puede acceder a otros recursos de red, como servidores remotos o impresoras, a través del redirector. Una excepción es que si el recurso de red no está controlado por el acceso, el nuevo proceso podrá acceder a él.

La cuenta especificada por lpszUsername debe tener los derechos de cuenta necesarios. Por ejemplo, para iniciar sesión en un usuario con la marca LOGON32_LOGON_INTERACTIVE , el usuario (o un grupo al que pertenece el usuario) debe tener el derecho SE_INTERACTIVE_LOGON_NAME cuenta. Para obtener una lista de los derechos de cuenta que afectan a las distintas operaciones de inicio de sesión, consulte Derechos de acceso a objetos de cuenta.

Un usuario se considera que ha iniciado sesión si existe al menos un token. Si llama a CreateProcessAsUser y cierra el token, el usuario seguirá iniciando sesión hasta que finalice el proceso (y todos los procesos secundarios).

Si se proporciona el parámetro pTokenGroups opcional, LSA no agregará el SID local ni el SID de inicio de sesión automáticamente.

Requisitos

Requisito Value
Cliente mínimo compatible
Windows Vista [solo aplicaciones de escritorio]
Servidor mínimo compatible
Windows Server 2008 [solo aplicaciones de escritorio]
Versión
LogonUserExExW también está disponible enWindows Server 2003 o Windows XP con la versión de distribución general.
Encabezado
Winbasep.h
Archivo DLL
Advapi32.dll

Consulte también

Access Control cliente/servidor

Funciones de Access Control cliente/servidor

CloseHandle

CreateProcessAsUser

DuplicateTokenEx

ImpersonateLoggedOnUser

LogonUserEx

QUOTA_LIMITS