Función PsImpersonateClient (ntifs.h)

La rutina 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 de 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. Establezca en TRUE para especificar que el token no se puede abrir directamente. En este caso, el token se debe duplicar y el token duplicado que se usa en su lugar. Establezca en FALSE para permitir que el token se abra directamente.

[in] EffectiveOnly

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

[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.

Comentarios

PsImpersonateClient hace que el subproceso de servidor especificado suplanta el 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 y pase el puntero guardado para el parámetro Token . 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 de nuevo a PsImpersonateClient y pase un puntero NULL para el parámetro Token .

La rutina PsImpersonateClient puede no devolver correctamente el subproceso de 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 realmente comprobando varias condiciones, entre las que se incluyen 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 de suplantación de seguridad limitado; es decir, el subproceso del servidor solo puede obtener información sobre el cliente. Si no es posible copiar tokens, se produce un error en la rutina con un código NTSTATUS.

No es seguro elevar el estado de privilegio de un subproceso de usuario que no es de confianza (tome el subproceso de un usuario y suplantar LocalSystem, por ejemplo). Si un subproceso de usuario que no es de confianza tiene sus privilegios elevados, el usuario podría tomar el token de subproceso después de que se haya elevado y subvertido la seguridad de todo el sistema.

En los casos en los que se requiera 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 este modo, 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 Value
Cliente mínimo compatible Windows XP
Plataforma de destino Universal
Encabezado ntifs.h (incluya Ntifs.h)
Library NtosKrnl.lib
Archivo DLL NtosKrnl.exe
IRQL PASSIVE_LEVEL
Reglas de cumplimiento de DDI HwStorPortProhibitedDIs(storport), PowerIrpDDis(wdm)

Consulte también

PsGetCurrentThread

PsReferenceImpersonationToken

PsRevertToSelf

SECURITY_IMPERSONATION_LEVEL

SeImpersonateClientEx