次の方法で共有


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

関連項目

PsGetCurrentThread

PsReferenceImpersonationToken

PsRevertToSelf する

SECURITY_IMPERSONATION_LEVEL

SeImpersonateClientEx