Compartir a través de


Función PsImpersonateClient (ntifs.h)

La rutina de psImpersonateClient hace que un subproceso de servidor suplantar a un cliente.

Sintaxis

NTSTATUS PsImpersonateClient(
  [in, out] PETHREAD                     Thread,
  [in]      PACCESS_TOKEN                Token,
  [in]      BOOLEAN                      CopyOnOpen,
  [in]      BOOLEAN                      EffectiveOnly,
  [in]      SECURITY_IMPERSONATION_LEVEL ImpersonationLevel
);

Parámetros

[in, out] Thread

Puntero al subproceso del servidor que se va a suplantar al cliente.

[in] Token

Puntero al token que se va a asignar como token de suplantación. Este token puede ser un token principal o un token de suplantación. Establezca en NULL para finalizar la suplantación.

[in] CopyOnOpen

Especifica si el token se puede abrir directamente. Establézcalo en TRUE para especificar que el token no se puede abrir directamente. En este caso, el token debe duplicarse y el token duplicado usado en su lugar. Establézcalo en false para permitir que el token se abra directamente.

[in] EffectiveOnly

Establézcalo en FALSE para permitir que el servidor habilite grupos y privilegios que están deshabilitados actualmente en el contexto de seguridad del cliente, TRUE de lo contrario.

[in] ImpersonationLevel

Valor de SECURITY_IMPERSONATION_LEVEL que especifica el nivel de suplantación en el que el servidor tiene que acceder al token.

Valor devuelto

psImpersonateClient devuelve STATUS_SUCCESS o un valor NTSTATUS adecuado, como el siguiente:

Código devuelto Descripción
STATUS_ACCESS_DENIED
No era posible suplantar a un cliente debido a restricciones de trabajo.
STATUS_NO_MEMORY
No había memoria suficiente para completar la operación.

Observaciones

PsImpersonateClient hace que el subproceso de servidor especificado suplanta al cliente especificado.

El subproceso de servidor ya podría suplantar a un cliente cuando se llama a psImpersonateClient. Si este es el caso, se disminuye el recuento de referencias en el token que representa ese cliente. Para conservar este token para su uso posterior, los controladores deben llamar a PsReferenceImpersonationToken antes de llamar a PsImpersonateClient y guardar el puntero devuelto por PsReferenceImpersonationToken.

Para finalizar la nueva suplantación y devolver el subproceso de servidor a la suplantación anterior, llame a PsImpersonateClient de nuevo, pasando el puntero guardado para el parámetro token de. Para finalizar todas las suplantaciones, llame a la rutina PsRevertToSelf.

De lo contrario, para finalizar la suplantación y devolver el subproceso del servidor a su contexto de seguridad original (es decir, el representado por su token principal), llame a PsImpersonateClient de nuevo, pasando un puntero de NULL para el parámetro token de.

La rutina de psImpersonateClient de puede no devolver correctamente el subproceso del servidor a la suplantación anterior si el subproceso ya está suplantando o hay restricciones de trabajo.

La rutina garantiza si la suplantación de cliente puede producirse comprobando varias condiciones, incluidas las siguientes:

  • El token pasado por el autor de la llamada no tiene un identificador de autenticación anónimo.
  • El token del proceso al que se hace referencia desde el subproceso del servidor y el token especificado tienen identificadores de seguridad iguales (SID)
  • Ninguno de los tokens está restringido

Si no se cumple ninguna de las condiciones, la rutina realiza una copia del token existente pasado a la llamada y asigna el token recién copiado como token de suplantación, aunque con un nivel limitado de suplantación de seguridad; es decir, el subproceso del servidor solo puede obtener información sobre el cliente. Si no es posible realizar la copia de tokens, se produce un error en la rutina con un código NTSTATUS.

Es extremadamente seguro aumentar el estado de privilegio de un subproceso de usuario que no es de confianza (tome el subproceso de un usuario y suplanta localSystem, por ejemplo). Si se ha generado un subproceso de usuario que no es de confianza, el usuario podría tomar el token de subproceso después de haber sido elevado y subvertir la seguridad de todo el sistema.

En los casos en los que se requiere un estado de privilegio mayor, la tarea se debe enviar a una cola de trabajo donde la tarea se puede controlar de forma segura mediante el subproceso de trabajo del sistema . De esta manera no es necesaria ninguna suplantación.

La rutina SeImpersonateClientEx se puede usar para hacer que un subproceso suplantar a un usuario.

Para obtener más información sobre la seguridad y el control de acceso, consulte modelo de seguridad de Windows para desarrolladores de controladores y la documentación sobre estos temas en Windows SDK.

Requisitos

Requisito Valor
cliente mínimo admitido Windows XP
de la plataforma de destino de Universal
encabezado de ntifs.h (incluya Ntifs.h)
biblioteca de NtosKrnl.lib
DLL de NtosKrnl.exe
irQL PASSIVE_LEVEL
reglas de cumplimiento de DDI HwStorPortProhibitedDIs(storport), PowerIrpDDis(wdm)

Consulte también

PsGetCurrentThread

psReferenceImpersonationToken

PsRevertToSelf

SECURITY_IMPERSONATION_LEVEL

SeImpersonateClientEx