PsImpersonateClient-Funktion (ntifs.h)

Die PsImpersonateClient-Routine bewirkt, dass ein Serverthread einen Client imitiert.

Syntax

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

Parameter

[in, out] Thread

Zeiger auf den Serverthread, der den Client imitieren soll.

[in] Token

Zeiger auf das Token, das als Identitätstoken zugewiesen werden soll. Dieses Token kann ein primäres Token oder ein Identitätstoken sein. Legen Sie auf NULL fest, um die Identitätswechsel zu beenden.

[in] CopyOnOpen

Gibt an, ob das Token direkt geöffnet werden kann. Legen Sie auf TRUE fest, um anzugeben, dass das Token nicht direkt geöffnet werden kann. In diesem Fall muss das Token dupliziert werden, und das doppelte Token, das stattdessen verwendet wird. Legen Sie auf FALSE fest, damit das Token direkt geöffnet werden kann.

[in] EffectiveOnly

Legen Sie auf FALSE fest, damit der Server Gruppen und Berechtigungen aktivieren kann, die derzeit im Clientsicherheitskontext deaktiviert sind, andernfalls TRUE .

[in] ImpersonationLevel

Ein SECURITY_IMPERSONATION_LEVEL Wert, der die Identitätswechselebene angibt, auf die der Server auf das Token zugreifen soll.

Rückgabewert

PsImpersonateClient gibt STATUS_SUCCESS oder einen entsprechenden NTSTATUS-Wert zurück, z. B. folgendes:

Rückgabecode Beschreibung
STATUS_ACCESS_DENIED
Es war nicht möglich, einen Client aufgrund von Auftragseinschränkungen zu imitieren.
STATUS_NO_MEMORY
Es gab nicht genügend Arbeitsspeicher, um den Vorgang abzuschließen.

Bemerkungen

PsImpersonateClient führt dazu, dass der angegebene Serverthread den angegebenen Client imitiert.

Der Serverthread konnte bereits beim Aufrufen von PsImpersonateClient einen Client imitieren. Wenn dies der Fall ist, wird die Referenzanzahl für das Token, das den Client darstellt, decrementiert. Um dieses Token für die spätere Verwendung beizubehalten, sollten Treiber PsReferenceImpersonationToken aufrufen, bevor Sie PsImpersonateClient aufrufen und den Zeiger speichern, der von PsReferenceImpersonationToken zurückgegeben wird.

Um den neuen Identitätswechsel zu beenden und den Serverthread an die vorherige Identität zurückzugeben, rufen Sie PsImpersonateClient erneut auf, und übergeben Sie den gespeicherten Zeiger für den Tokenparameter . Rufen Sie die PsRevertToSelf-Routine auf, um alle Identitätswechsel zu beenden.

Andernfalls rufen Sie den PsImpersonateClient erneut auf, um den Serverthread an den ursprünglichen Sicherheitskontext zurückzugeben (das heißt, das durch das primäre Token dargestellt wird), rufen Sie PsImpersonateClient erneut auf, indem Sie einen NULL-Zeiger für den Tokenparameter übergeben.

Die PsImpersonateClient-Routine kann den Serverthread erfolgreich an den vorherigen Identitätswechsel zurückgeben, wenn der Thread bereits identitätswechselt oder Jobeinschränkungen vorhanden ist.

Die Routine stellt sicher, ob die Identität des Clients tatsächlich auftreten kann, indem verschiedene Bedingungen überprüft werden, einschließlich der folgenden:

  • Das vom Anrufer übergebene Token verfügt nicht über eine anonyme Authentifizierungs-ID.
  • Das Token des Prozesses, auf das vom Serverthread verwiesen wird, und das angegebene Token verfügt über gleiche Sicherheitsbezeichner (SIDs)
  • Keiner der Token ist eingeschränkt.

Wenn keine der Bedingungen erfüllt ist, macht die Routine eine Kopie des vorhandenen Token, das an den Aufruf übergeben wurde, und weist das neu kopierte Token als Identitätswechseltoken zu, wenn auch mit eingeschränkter Sicherheitswechselstufe; das heißt, der Serverthread kann nur Informationen über den Client abrufen. Wenn das Kopieren von Token nicht möglich ist, schlägt die Routine mit einem NTSTATUS-Code fehl.

Es ist äußerst unsicher, den Berechtigungszustand eines nicht vertrauenswürdigen Benutzerthreads zu erhöhen (nehmen Sie beispielsweise den Thread eines Benutzers und die Identität von LocalSystem. Wenn ein nicht vertrauenswürdiger Benutzerthread seine Berechtigung ausgelöst hatte, konnte der Benutzer das Threadtoken nach dem Erhöhten ergreifen und die Sicherheit des gesamten Systems subvertieren.

In Fällen, in denen ein höherer Berechtigungsstatus erforderlich ist, sollte die Aufgabe an eine Arbeitswarteschlange verteilt werden, in der die Aufgabe von Systemarbeitsthread sicher behandelt werden kann. Auf diese Weise ist keine Identitätswechsel erforderlich.

Die SeImpersonateClientEx-Routine kann verwendet werden, um zu verursachen, dass ein Thread einen Benutzer imitiert.

Weitere Informationen zur Sicherheits- und Zugriffssteuerung finden Sie in der Dokumentation zu diesen Themen im Microsoft Windows SDK.

Anforderungen

   
Unterstützte Mindestversion (Client) Verfügbar in Windows XP- und späteren Versionen der Windows-Betriebssysteme.
Zielplattform Universell
Header ntifs.h (einschließlich Ntifs.h)
Bibliothek NtosKrnl.lib
DLL NtosKrnl.exe
IRQL PASSIVE_LEVEL
DDI-Complianceregeln HwStorPortProhibitedDIs(storport), PowerIrpDDis(wdm)

Siehe auch

PsGetCurrentThread

PsReferenceImpersonationToken

PsRevertToSelf

SECURITY_IMPERSONATION_LEVEL

SeImpersonateClientEx