Compartilhar via


Função PsImpersonateClient (ntifs.h)

A rotina de PsImpersonateClient faz com que um thread de servidor represente um cliente.

Sintaxe

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

Ponteiro para o thread do servidor que deve representar o cliente.

[in] Token

Ponteiro para o token a ser atribuído como o token de representação. Esse token pode ser um token primário ou um token de representação. Defina como NULL para encerrar a representação.

[in] CopyOnOpen

Especifica se o token pode ser aberto diretamente. Defina como TRUE para especificar que o token não pode ser aberto diretamente. Nesse caso, o token deve ser duplicado e o token duplicado usado em vez disso. Defina como FALSE para permitir que o token seja aberto diretamente.

[in] EffectiveOnly

Defina como FALSE para permitir que o servidor habilite grupos e privilégios que estão desabilitados no contexto de segurança do cliente, VERDADEIRO caso contrário.

[in] ImpersonationLevel

Um valor SECURITY_IMPERSONATION_LEVEL que especifica o nível de representação no qual o servidor deve acessar o token.

Valor de retorno

PsImpersonateClient retorna STATUS_SUCCESS ou um valor NTSTATUS apropriado, como o seguinte:

Código de retorno Descrição
STATUS_ACCESS_DENIED
Não foi possível representar um cliente devido a restrições de trabalho.
STATUS_NO_MEMORY
Não havia memória suficiente para concluir a operação.

Observações

PsImpersonateClient faz com que o thread do servidor especificado represente o cliente especificado.

O thread do servidor já pode estar representando um cliente quando PsImpersonateClient é chamado. Se esse for o caso, a contagem de referência no token que representa esse cliente será decremente decremente. Para preservar esse token para uso posterior, os drivers devem chamar PsReferenceImpersonationToken antes de chamar PsImpersonateClient e salvar o ponteiro retornado por PsReferenceImpersonationToken.

Para encerrar a nova representação e retornar o thread do servidor à representação anterior, chame PsImpersonateClient novamente, passando o ponteiro salvo para o parâmetro token de. Para encerrar todas as representações, chame a rotina de PsRevertToSelf.

Caso contrário, para encerrar a representação e retornar o thread do servidor para seu contexto de segurança original (ou seja, aquele representado por seu token primário), chame PsImpersonateClient novamente, passando um ponteiro de NULL para o parâmetro token de.

A rotina de PsImpersonateClient pode falhar ao retornar com êxito o thread do servidor para a representação anterior se o thread já estiver representando ou houver restrições de trabalho.

A rotina garante se a representação do cliente pode realmente ocorrer verificando várias condições, incluindo o seguinte:

  • O token passado pelo chamador não tem uma ID de autenticação anônima
  • O token do processo referenciado do thread do servidor e o token fornecido têm SIDs (identificadores de segurança iguais)
  • Nenhum dos tokens é restrito

Se nenhuma das condições for atendida, a rotina fará uma cópia do token existente passada para a chamada e atribuirá o token recém-copiado como token de representação, embora com nível de representação de segurança limitado; ou seja, o thread do servidor só pode obter informações sobre o cliente. Se a cópia de token não for possível, a rotina falhará com um código NTSTATUS.

É extremamente inseguro aumentar o estado de privilégio de um thread de usuário não confiável (pegue o thread de um usuário e represente o LocalSystem, por exemplo). Se um thread de usuário não confiável tiver seu privilégio gerado, o usuário poderá pegar o token de thread depois de ter sido elevado e subverter a segurança de todo o sistema.

Nos casos em que um estado de privilégio mais alto é necessário, a tarefa deve ser enviada para uma fila de trabalho em que a tarefa pode ser tratada com segurança pelo thread de trabalho do sistema. Dessa forma, nenhuma representação é necessária.

A rotina SeImpersonateClientEx pode ser usada para fazer com que um thread represente um usuário.

Para obter mais informações sobre segurança e controle de acesso, consulte modelo de segurança do Windows para desenvolvedores de driver e a documentação sobre esses tópicos no SDK do Windows.

Requisitos

Requisito Valor
de cliente com suporte mínimo Windows XP
da Plataforma de Destino Universal
cabeçalho ntifs.h (inclua Ntifs.h)
biblioteca NtosKrnl.lib
de DLL NtosKrnl.exe
IRQL PASSIVE_LEVEL
regras de conformidade de DDI HwStorPortProhibitedDIs(storport), PowerIrpDDis(wdm)

Consulte também

PsGetCurrentThread

PsReferenceImpersonationToken

PsRevertToSelf

SECURITY_IMPERSONATION_LEVEL

SeImpersonateClientEx