偽装と復帰
更新 : 2007 年 11 月
Windows アカウントを偽装するために、Windows NT アカウント トークンの取得が必要になる場合もあります。たとえば、ASP.NET ベースのアプリケーションが、違う時刻に複数の異なるユーザーの代わりを務める必要がある場合です。アプリケーションは、インターネット インフォメーション サービス (IIS: Internet Information Services) からの管理者を表すトークンを承認し、そのユーザーを偽装し、操作を実行して前の ID に戻ります。次に、より少ない権限を持つユーザーを表す IIS からのトークンを承認し、操作を実行して再び復帰します。
IIS によって現在のスレッドに結合されていない Windows アカウントをアプリケーションが偽装する必要がある場合は、そのアカウントのトークンを取得し、それを使用してアカウントをアクティブにする必要があります。この処理は、次のタスクを行うことによって実行できます。
アンマネージの LogonUser メソッドを呼び出すことによって、特定のユーザーのアカウント トークンを取得します。このメソッドは、.NET Framework の基本クラス ライブラリの中ではなく、アンマネージ advapi32.dll の中にあります。アンマネージ コードでメソッドにアクセスすることは高度な操作であり、ここでは説明しません。詳細については、「アンマネージ コードとの相互運用」を参照してください。LogonUser メソッドと advapi32.dll の詳細については、プラットフォーム SDK を参照してください。
トークンを渡して、WindowsIdentity クラスの新しいインスタンスを作成します。hToken が Windows トークンを表すときの、この呼び出しを示すコードを次に示します。
WindowsIdentity ImpersonatedIdentity = new WindowsIdentity(hToken);
Dim ImpersonatedIdentity As New WindowsIdentity(hToken)
WindowsImpersonationContext クラスの新しいインスタンスを作成し、初期化されたクラスの WindowsIdentity.Impersonate メソッドでこのインスタンスを初期化して偽装を開始します。このコード例を次に示します。
WindowsImpersonationContext MyImpersonation = ImpersonatedIdentity.Impersonate();
WindowsImpersonationContext MyImpersonation = ImpersonatedIdentity.Impersonate()
偽装の必要がなくなったら、WindowsImpersonationContext.Undo メソッドを呼び出して偽装を戻します。このコード例を次に示します。
MyImpersonation.Undo();
MyImpersonation.Undo()
信頼されるコードが既に WindowsPrincipal オブジェクトをスレッドに結合している場合は、アカウント トークンをとらないインスタンス メソッド Impersonate を呼び出すことができます。ただし、この方法が有用なのは、スレッド上の WindowsPrincipal オブジェクトが、プロセスが現在実行されているユーザー以外のユーザーを表すときだけです。この状況は、たとえば、Windows 認証をオンに偽装をオフにして ASP.NET を使用するときに発生することがあります。この場合、プロセスはインターネット インフォメーション サービス (IIS: Internet Information Services) で設定されたアカウントで実行され、現在のプリンシパルはそのページにアクセスしている Windows ユーザーを表します。
Impersonate と Undo のいずれも、現在の呼び出しコンテキストに関連付けられている Principal オブジェクトを変更しません。その代わりに、偽装と復帰によって、現在のオペレーティング システム プロセスに関連付けられているトークンが変更されます。