偽装と復帰

Windows アカウントを偽装するために、Windows NT アカウント トークンの取得が必要になる場合もあります。 たとえば、ASP.NET ベースのアプリケーションが、違う時刻に複数の異なるユーザーの代わりを務める必要がある場合です。 アプリケーションは、インターネット インフォメーション サービス (IIS: Internet Information Services) からの管理者を表すトークンを承認し、そのユーザーを偽装し、操作を実行して前の ID に戻ります。 次に、より少ない権限を持つユーザーを表す IIS からのトークンを承認し、操作を実行して再び復帰します。

IIS によって現在のスレッドに結合されていない Windows アカウントをアプリケーションが偽装する必要がある場合は、そのアカウントのトークンを取得し、それを使用してアカウントをアクティブにする必要があります。 この処理は、次のタスクを行うことによって実行できます。

  1. アンマネージの LogonUser メソッドを呼び出すことによって、特定のユーザーのアカウント トークンを取得します。 このメソッドは、.NET Framework の基本クラス ライブラリの中ではなく、アンマネージ advapi32.dll の中にあります。 アンマネージ コードでメソッドにアクセスすることは高度な操作であり、ここでは説明しません。 詳細については、「アンマネージ コードとの相互運用」を参照してください。 LogonUser メソッドと advapi32.dll の詳細については、プラットフォーム SDK を参照してください。

  2. トークンを渡して、WindowsIdentity クラスの新しいインスタンスを作成します。 hToken が Windows トークンを表すときの、この呼び出しを示すコードを次に示します。

    WindowsIdentity ImpersonatedIdentity = new WindowsIdentity(hToken);
    
    Dim ImpersonatedIdentity As New WindowsIdentity(hToken)
    
  3. WindowsImpersonationContext クラスの新しいインスタンスを作成し、初期化されたクラスの WindowsIdentity.Impersonate メソッドでこのインスタンスを初期化して偽装を開始します。このコード例を次に示します。

    WindowsImpersonationContext MyImpersonation = ImpersonatedIdentity.Impersonate();
    
    WindowsImpersonationContext MyImpersonation = ImpersonatedIdentity.Impersonate()
    
  4. 偽装の必要がなくなったら、WindowsImpersonationContext.Undo メソッドを呼び出して偽装を戻します。このコード例を次に示します。

    MyImpersonation.Undo();
    
    MyImpersonation.Undo()
    

信頼されるコードが既に WindowsPrincipal オブジェクトをスレッドに結合している場合は、アカウント トークンをとらないインスタンス メソッド Impersonate を呼び出すことができます。 ただし、この方法が有用なのは、スレッド上の WindowsPrincipal オブジェクトが、プロセスが現在実行されているユーザー以外のユーザーを表すときだけです。 この状況は、たとえば、Windows 認証をオンに偽装をオフにして ASP.NET を使用するときに発生することがあります。 この場合、プロセスはインターネット インフォメーション サービス (IIS: Internet Information Services) で設定されたアカウントで実行され、現在のプリンシパルはそのページにアクセスしている Windows ユーザーを表します。

ImpersonateUndo のいずれも、現在の呼び出しコンテキストに関連付けられている Principal オブジェクトを変更しません。 その代わりに、偽装と復帰によって、現在のオペレーティング システム プロセスに関連付けられているトークンが変更されます。

参照

参照

WindowsIdentity

WindowsImpersonationContext

概念

プリンシパル オブジェクトと ID オブジェクト

ASP.NET の偽装

ASP.NET の偽装と IIS 認証の使用

その他の技術情報

アンマネージ コードとの相互運用