0

次のMicrosoft の例を使用しています。WindowsIdentity インスタンスが .Impersonate() を呼び出すたびに、何も起こりません。エラーなし、なりすましなし。
呼び出しの前後で、現在の ID は常に AppPool ID です。オンラインで見つけた別の例である Impersonator クラス
も試しましたが、同じことが起こります。

これらの例に対して行った唯一の変更は、LogOnUser 呼び出しで LOGON32_LOGON_INTERACTIVE を LOGON32_LOGON_NETWORK に変更したことです。Interactive を使用すると常に 0 エラーが返されるためです。

これは、Win2k8 サーバーで実行されている ASP.NET 4.0 アプリであり、AD でユーザーを偽装しようとしています。

編集: 最初はこれについて言及していませんでしたが、Microsoft の例を変更してクラスに変換し、ASP.NET アプリから実行できるようにしました。私もimpersonate=trueweb.configにいます。

4

3 に答える 3

1

最終的に、数年前に似たようなことをしたヘルパー クラスを見つけました。ヘルパーは IDisposable を実装しているので、ファイル アクセス コードを次のように "using" でラップするだけです。

using (Impersonate imp = new Impersonate())
{
    // Code in here will run under the identity specified in the helper
}

ヘルパー クラスのコードは次のとおりです (スペースを節約するために "usings" を削除しました)。ユーザー アカウントがコンストラクターでハードコーディングされていることがわかります。

internal class Impersonate : IDisposable
{
    private const int LOGON32_LOGON_INTERACTIVE = 2;
    private const int LOGON32_PROVIDER_DEFAULT = 0;

    private bool _disposed = false;
    private WindowsImpersonationContext _context = null;

    [DllImport("advapi32.dll")]
    private static extern int LogonUserA(String lpszUserName, String lpszDomain, String lpszPassword, int dwLogonType, int dwLogonProvider, ref IntPtr phToken);
    [DllImport("advapi32.dll", CharSet = CharSet.Auto, SetLastError = true)]
    private static extern int DuplicateToken(IntPtr hToken, int impersonationLevel, ref IntPtr hNewToken);

    [DllImport("advapi32.dll", CharSet = CharSet.Auto, SetLastError = true)]
    private static extern bool RevertToSelf();

    [DllImport("kernel32.dll", CharSet = CharSet.Auto)]
    private static extern bool CloseHandle(IntPtr handle);

    internal Impersonate()
    {
        WindowsIdentity tempWindowsIdentity;
        IntPtr token = IntPtr.Zero;
        IntPtr tokenDuplicate = IntPtr.Zero;

        string domain = "<whatever>";
        string username = "<whatever>";
        string password = "<whatever>";

        try
        {
            if (RevertToSelf())
            {
                if (LogonUserA(username, domain, password, LOGON32_LOGON_INTERACTIVE, LOGON32_PROVIDER_DEFAULT, ref token) != 0)
                {
                    if (DuplicateToken(token, 2, ref tokenDuplicate) != 0)
                    {
                        tempWindowsIdentity = new WindowsIdentity(tokenDuplicate);
                        _context = tempWindowsIdentity.Impersonate();
                    }
                }
            }
        }
        finally
        {
            if (token != IntPtr.Zero)
            {
                CloseHandle(token);
            }

            if (tokenDuplicate != IntPtr.Zero)
            {
                CloseHandle(tokenDuplicate);
            }
        }
    }

    public void Dispose()
    {
        Dispose(true);
        GC.SuppressFinalize(this);
    }

    private void Dispose(bool disposing)
    {
        if (!_disposed)
        {
            if (disposing)
            {
                // Dispose any managed resources here.
            }

            // Stop the impersonation.
            _context.Undo();

            _disposed = true;

        }
    }
}

それを試してみて、あなたがどのようにうまくいくか教えてください...

アンドリュー

于 2012-05-09T09:07:28.960 に答える
0

リンクする例は、コンソール アプリケーション用です。訪問者のセキュリティ コンテキストでコードを実行する ASP.Net Web アプリケーションがある場合は、IIS 認証設定 (IIS マネージャー MMC スナップイン) で ASP.Net 偽装を有効にできます。

于 2012-05-08T14:10:47.030 に答える
0

ユーザー グループに App_Data フォルダーへの書き込みアクセス権を付与すると、問題が修正されました。ただし、それが偽装と何の関係があるのか​​ はわかりません。

于 2012-05-10T17:37:08.183 に答える