Condividi tramite


Funzione PsImpersonateClient (ntifs.h)

La routine PsImpersonateClient causa la rappresentazione di un client da parte di un thread del server.

Sintassi

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

Parametri

[in, out] Thread

Puntatore al thread del server che rappresenta il client.

[in] Token

Puntatore al token da assegnare come token di rappresentazione. Questo token può essere un token primario o un token di rappresentazione. Impostare su NULL per terminare la rappresentazione.

[in] CopyOnOpen

Specifica se il token può essere aperto direttamente. Impostare su TRUE per specificare che il token non può essere aperto direttamente. In questo caso, il token deve essere duplicato e il token duplicato usato. Impostare su FALSE per consentire l'apertura diretta del token.

[in] EffectiveOnly

Impostare su FALSE per consentire al server di abilitare gruppi e privilegi attualmente disabilitati nel contesto di sicurezza client, TRUE in caso contrario.

[in] ImpersonationLevel

Valore SECURITY_IMPERSONATION_LEVEL che specifica il livello di rappresentazione a cui il server deve accedere al token.

Valore restituito

PsImpersonateClient restituisce STATUS_SUCCESS o un valore NTSTATUS appropriato, ad esempio quanto segue:

Codice restituito Descrizione
STATUS_ACCESS_DENIED
Non è stato possibile rappresentare un client a causa di restrizioni per il processo.
STATUS_NO_MEMORY
Memoria insufficiente per completare l'operazione.

Commenti

PsImpersonateClient causa la rappresentazione del client specificato nel thread del server specificato.

Il thread del server potrebbe già rappresentare un client quando viene chiamato PsImpersonateClient . Se si tratta del caso, il conteggio dei riferimenti sul token che rappresenta il client viene decrementato. Per mantenere questo token per un uso successivo, i driver devono chiamare PsReferenceImpersonationToken prima di chiamare PsImpersonateClient e salvare il puntatore restituito da PsReferenceImpersonationToken.

Per terminare la nuova rappresentazione e restituire il thread del server alla rappresentazione precedente, chiamare di nuovo PsImpersonateClient , passando il puntatore salvato per il parametro Token . Per terminare tutte le rappresentazioni, chiamare la routine PsRevertToSelf .

In caso contrario, per terminare la rappresentazione e restituire il thread del server al contesto di sicurezza originale, ovvero quello rappresentato dal token primario, chiamare di nuovo PsImpersonateClient , passando un puntatore NULL per il parametro Token .

La routine PsImpersonateClient può non riuscire a restituire correttamente il thread del server alla rappresentazione precedente se il thread è già rappresentazione o esistono restrizioni per il processo.

La routine garantisce se la rappresentazione client può verificarsi effettivamente controllando varie condizioni, tra cui quanto segue:

  • Il token passato dal chiamante non ha un ID di autenticazione anonimo
  • Il token del processo a cui viene fatto riferimento dal thread del server e il token specificato hanno identificatori di sicurezza uguali (SID)
  • Nessuno dei token è limitato

Se nessuna delle condizioni viene soddisfatta, la routine esegue una copia del token esistente passato alla chiamata e assegna il token appena copiato come token di rappresentazione anche se con un livello di rappresentazione limitato; ovvero, il thread del server può ottenere solo informazioni sul client. Se la copia del token non è possibile, la routine ha esito negativo con un codice NTSTATUS.

È estremamente non sicuro aumentare lo stato dei privilegi di un thread utente non attendibile ,ad esempio prendere il thread di un utente e rappresentare LocalSystem. Se un thread utente non attendibile ha generato il proprio privilegio, l'utente potrebbe acquisire il token di thread dopo che è stato elevato e annullare la sicurezza dell'intero sistema.

Nei casi in cui è necessario uno stato con privilegi più elevati, l'attività deve essere inviata a una coda di lavoro in cui l'attività può essere gestita in modo sicuro dal thread di lavoro di sistema . In questo modo non è necessaria alcuna rappresentazione.

La routine SeImpersonateClientEx può essere usata per causare la rappresentazione di un thread di un utente.

Per altre informazioni sul controllo di sicurezza e accesso, vedere Modello di sicurezza di Windows per sviluppatori driver e la documentazione su questi argomenti in Windows SDK.

Requisiti

Requisito Valore
Client minimo supportato Windows XP
Piattaforma di destinazione Universale
Intestazione ntifs.h (include Ntifs.h)
Libreria NtosKrnl.lib
DLL NtosKrnl.exe
IRQL PASSIVE_LEVEL
Regole di conformità DDI HwStorPortProhibitedDDIs(storport), PowerIrpDDis(wdm)

Vedi anche

PsGetCurrentThread

PsReferenceImpersonationToken

PsRevertToSelf

SECURITY_IMPERSONATION_LEVEL

SeImpersonateClientEx