0

SQL CLRストアドプロシージャを研究しているときに、CLRのSQLバルクコピーのリンクをたどるリンクに出くわし ました。このリンクでは、ユーザーは WindowsIdentity currentIdentity = SqlContext.WindowsIdentity; WindowsImpersonationContext impersonatedIdentity = currentIdentity.Impersonate();

WindowsImpersonationContextの使用法を理解できません。使用しないと、コードを実行できます。このID偽装の正確な使用法を誰かに教えてもらえますか。

4

1 に答える 1

0

たとえば、プロセスと同じコンテキストでスレッドを実行したい場合は、次のようにすることができます。

    private void ImpersonateThread()
    {
        new Thread(() =>
        {
            Thread.CurrentPrincipal = new WindowsPrincipal(WindowsIdentity.GetCurrent());
            //Do the work...
        }).Start();
    }

アプリケーション プールが 1 人のユーザーとして実行され、認証モードが Windows 認証に設定されている Web サイト (MS-IIS 上) を実行している場合、これは非常に便利です。次に、Web サイトにアクセスするユーザーとしてスレッドを実行することをお勧めします。

アップデート:

これを明確にしたいだけです。この線:

  Thread.CurrentPrincipal = new WindowsPrincipal(WindowsIdentity.GetCurrent());

ユーザー(ユーザーはまだスレッドに偽装されていません)をスレッドに転送するだけで、他のコンポーネントがユーザーが誰であるかを確認し、必要に応じて情報を使用できるようになります。たとえば、次のようになります。

        System.Security.Principal.WindowsImpersonationContext impersonationContext;
        impersonationContext =
            ((System.Security.Principal.WindowsIdentity)System.Threading.Thread.CurrentPrincipal.Identity).Impersonate();
            //Do the work that you want within the impersonated users context.
        impersonationContext.Undo();

偽装と元に戻すの間に、ユーザーは偽装され、すべてのコードがこのユーザーとして実行されます。このサンプルではユーザーが同じであることはわかっていますが、プロセスを実行しているユーザーとはまったく異なるユーザー (ユーザーが入力したものなど) をスレッドが保持していると想像してください。お役に立てれば :-)

于 2012-10-25T11:05:37.877 に答える