PsImpersonateClient 関数 (ntifs.h)
PsImpersonateClient ルーチンを使用すると、サーバー スレッドはクライアントを偽装します。
構文
NTSTATUS PsImpersonateClient(
[in, out] PETHREAD Thread,
[in] PACCESS_TOKEN Token,
[in] BOOLEAN CopyOnOpen,
[in] BOOLEAN EffectiveOnly,
[in] SECURITY_IMPERSONATION_LEVEL ImpersonationLevel
);
パラメーター
[in, out] Thread
クライアントを偽装するサーバー スレッドへのポインター。
[in] Token
偽装トークンとして割り当てられるトークンへのポインター。 このトークンには、プライマリ トークンまたは偽装トークンを指定できます。 偽装を終了するには 、NULL に設定します。
[in] CopyOnOpen
トークンを直接開くことができるかどうかを指定します。 トークンを直接開くことができないことを指定するには、 TRUE に 設定します。 この場合は、トークンを複製し、代わりに使用する重複トークンを指定する必要があります。 トークンを直接開くことを許可するには、 FALSE に設定します。
[in] EffectiveOnly
クライアント セキュリティ コンテキストで現在無効になっているグループと特権をサーバーが有効にするには FALSE に設定します。それ以外の場合は TRUE 。
[in] ImpersonationLevel
サーバーがトークンにアクセスする権限借用レベルを指定するSECURITY_IMPERSONATION_LEVEL値。
戻り値
PsImpersonateClient は 、次のようなSTATUS_SUCCESSまたは適切な NTSTATUS 値を返します。
リターン コード | 説明 |
---|---|
|
ジョブの制限のため、クライアントを偽装できませんでした。 |
|
操作を完了するためのメモリが不足していました。 |
注釈
PsImpersonateClient により、指定したサーバー スレッドが指定したクライアントの権限を借用します。
PsImpersonateClient が呼び出されたときに、サーバー スレッドが既にクライアントを偽装している可能性があります。 この場合、そのクライアントを表すトークンの参照カウントがデクリメントされます。 後で使用するためにこのトークンを保持するには、ドライバーは PsImpersonateClient を呼び出す前に PsReferenceImpersonationToken を呼び出し、PsReferenceImpersonationToken によって返されるポインターを保存する必要があります。
新しい偽装を終了し、サーバー スレッドを以前の偽装に戻すには、 PsImpersonateClient をもう一度呼び出し、 Token パラメーターの保存されたポインターを渡します。 すべての偽装を終了するには、 PsRevertToSelf ルーチンを呼び出します。
それ以外の場合、偽装を終了し、サーバー スレッドを元のセキュリティ コンテキスト (つまり、プライマリ トークンで表される) に戻すには、PsImpersonateClient を再度呼び出し、Token パラメーターの NULL ポインターを渡します。
PsImpersonateClient ルーチンは、スレッドが既に偽装されている場合、またはジョブの制限がある場合、サーバー スレッドを以前の偽装に正常に返しません。
ルーチンは、次のようなさまざまな条件を確認することで、クライアントの偽装が実際に発生できるかどうかを確認します。
- 呼び出し元によって渡されたトークンに匿名認証 ID がありません
- サーバー スレッドから参照されるプロセスのトークンと、指定されたトークンのセキュリティ識別子 (SID) が等しい
- どちらのトークンも制限されていない
どの条件も満たされない場合、ルーチンは呼び出しに渡された既存のトークンのコピーを作成し、新しくコピーしたトークンを偽装トークンとして割り当てますが、セキュリティ偽装レベルは制限されています。つまり、サーバー スレッドはクライアントに関する情報のみを取得できます。 トークンのコピーが不可能な場合、ルーチンは NTSTATUS コードで失敗します。
信頼されていないユーザー スレッドの特権状態を上げることは非常に安全ではありません (たとえば、ユーザーのスレッドを取得し、LocalSystem を偽装します)。 信頼されていないユーザー スレッドに特権が発生した場合、ユーザーは昇格された後にスレッド トークンを取得し、システム全体のセキュリティを覆すことができます。
より高い特権の状態が必要な場合は、タスクを作業キューにディスパッチする必要があります。タスクは、システム ワーカー スレッド によって安全に処理できます。 この方法では、偽装は必要ありません。
SeImpersonateClientEx ルーチンを使用すると、スレッドがユーザーを偽装できます。
セキュリティとアクセス制御の詳細については、 ドライバー開発者向けの Windows セキュリティ モデル と、Windows SDK のこれらのトピックに関するドキュメントを参照してください。
要件
要件 | 値 |
---|---|
サポートされている最小のクライアント | Windows XP |
対象プラットフォーム | ユニバーサル |
Header | ntifs.h (Ntifs.h を含む) |
Library | NtosKrnl.lib |
[DLL] | NtosKrnl.exe |
IRQL | PASSIVE_LEVEL |
DDI コンプライアンス規則 | HwStorPortProhibitedDDIs(storport), PowerIrpDDis(wdm) |