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 |
ターゲット プラットフォーム の | 万国 |
ヘッダー | ntifs.h (Ntifs.h を含む) |
ライブラリ | NtosKrnl.lib |
DLL | NtosKrnl.exe |
IRQL | PASSIVE_LEVEL |
DDI コンプライアンス規則 を する | HwStorPortProhibitedDDIs(storport), PowerIrpDDis(wdm) |
関連項目
PsGetCurrentThread の
PsReferenceImpersonationToken の
PsRevertToSelf を する