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 |
---|---|
|
Não foi possível representar um cliente devido a restrições de trabalho. |
|
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) |