次の方法で共有


偽装と復帰

更新 : 2007 年 11 月

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 オブジェクトを変更しません。その代わりに、偽装と復帰によって、現在のオペレーティング システム プロセスに関連付けられているトークンが変更されます。

参照

概念

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

ASP.NET の偽装

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

参照

WindowsIdentity

WindowsImpersonationContext

その他の技術情報

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