次の方法で共有


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 値を返します。

リターン コード 説明
STATUS_ACCESS_DENIED
ジョブの制限のため、クライアントを偽装できませんでした。
STATUS_NO_MEMORY
操作を完了するためのメモリが不足していました。

注釈

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)

こちらもご覧ください

PsGetCurrentThread

PsReferenceImpersonationToken

PsRevertToSelf

SECURITY_IMPERSONATION_LEVEL

SeImpersonateClientEx