ImpersonateSecurityContext 関数 (sspi.h)

ImpersonateSecurityContext 関数を使用すると、サーバーは AcceptSecurityContext (General) または QuerySecurityContextToken の呼び出しによって以前に取得したトークンを使用してクライアントを偽装できます。 この関数を使用すると、アプリケーション サーバーがクライアントとして機能し、必要なすべてのアクセス制御が適用されます。

構文

KSECDDDECLSPEC SECURITY_STATUS SEC_ENTRY ImpersonateSecurityContext(
  [in] PCtxtHandle phContext
);

パラメーター

[in] phContext

偽装するコンテキストのハンドル。 このハンドルは、 AcceptSecurityContext (General) 関数の呼び出しによって取得されている必要があります。

戻り値

関数が成功した場合、関数はSEC_E_OKを返します。

関数が失敗すると、次のエラー コードが返されます。

リターン コード 説明
SEC_E_INVALID_HANDLE
関数に渡されたハンドルが無効です。
SEC_E_NO_IMPERSONATION
クライアントを偽装できませんでした。
SEC_E_UNSUPPORTED_FUNCTION
この値は、この関数がサポートされていないことを示すために、Schannel カーネル モードによって返されます。

解説

サーバー アプリケーションは、クライアントを偽装する必要がある場合に ImpersonateSecurityContext 関数を呼び出します。 その前に、サーバーが有効なコンテキスト ハンドルを取得している必要があります。 コンテキスト ハンドルを取得するには、サーバーで AcceptSecurityContext (General) を呼び出して、クライアントの受信セキュリティ トークンをセキュリティ システムに送信する必要があります。 受信コンテキストが検証された場合、サーバーはコンテキスト ハンドルを取得します。 関数は 偽装トークン を作成し、偽装コンテキストを使用してスレッドまたはプロセスを実行できるようにします。

Schannel セキュリティ サポート プロバイダー (SSP) を使用する場合、サーバー アプリケーションは AcceptSecurityContext (General) を呼び出すときにASC_REQ_MUTUAL_AUTH フラグを渡す必要があります。 これにより、SSL/TLS ハンドシェイク中にクライアントにクライアント証明書の要求が行われます。 クライアント証明書を受信すると、Schannel パッケージはクライアント証明書を検証し、それをユーザー アカウントにマップしようとします。 このマッピングが成功すると、クライアント ユーザー トークンが作成され、この関数は成功します。

アプリケーション サーバーは、完了したとき、または独自のセキュリティ コンテキストを復元する必要があるときに、RevertSecurityContext 関数を呼び出す必要があります。

ImpersonateSecurityContext は、すべてのプラットフォームのすべての セキュリティ パッケージ で使用できるわけではありません。 通常、これはプラットフォームでのみ実装され、偽装をサポートするセキュリティ パッケージを使用します。 セキュリティ パッケージが偽装をサポートしているかどうかを確認するには、 QuerySecurityPackageInfo 関数を呼び出します。

メモImpersonateSecurityContext 関数が失敗した場合、クライアントは偽装されず、後続のすべてのクライアント要求は、関数を呼び出したプロセスのセキュリティ コンテキストで行われます。 呼び出し元のプロセスが特権アカウントとして実行されている場合は、クライアントが実行を許可されないアクションを実行できます。 セキュリティ リスクを回避するには、呼び出し元のプロセスで常に戻り値をチェックする必要があります。 戻り値が関数呼び出しに失敗したことを示す場合は、クライアント要求を実行する必要はありません。
 
ImpersonateSecurityContext を含むすべての偽装関数では、次のいずれかに該当する場合、要求された偽装が許可されます。
  • トークンの要求された偽装レベルは、SecurityIdentificationSecurityAnonymous など、SecurityImpersonation よりも小さくなります。
  • 呼び出し元には SeImpersonatePrivilege 特権があります。
  • プロセス (または呼び出し元のログオン セッション内の別のプロセス) によって、 LogonUser または LsaLogonUser 関数を介して明示的な資格情報を使用してトークンが作成されました。
  • 認証された ID は呼び出し元と同じです。
SP1 以前の Windows XP: SeImpersonatePrivilege 特権はサポートされていません。

Windows XP: SeImpersonatePrivilege 特権は、Service Pack 2 (SP2) を使用した Windows XP までサポートされていません。

要件

   
サポートされている最小のクライアント Windows XP (デスクトップ アプリのみ)
サポートされている最小のサーバー Windows Server 2003 (デスクトップ アプリのみ)
対象プラットフォーム Windows
ヘッダー sspi.h (Security.h を含む)
Library Secur32.lib
[DLL] Secur32.dll

関連項目

AcceptSecurityContext (全般)

QuerySecurityPackageInfo

RevertSecurityContext

SSPI 関数