1

ASP.NET Web アプリケーションから使用Process.Kill()すると、「アクセスが拒否されました」というテキストで Win32Exception が発生します。

ウェブを検索すると、アクセス許可を設定するように何度か言われました。しかし、私は Windows XP ユーザー システムについて十分に理解しているわけではありません。

例外がスローされた時点でThread.CurrentPrincipal.Identity、次の可視プロパティがあります。

  1. AuthenticationType = ""
  2. IsAuthenticated = "偽"
  3. 名前 = ""

WindowsIdentity.GetCurrent()「NAME\ASPNET」としてログインしていることを示していますが、これは関係ないと思います。

私は何をする必要がありますか?どうにかしてスレッドに Windows ユーザーとしてログインさせることはできますか?

4

3 に答える 3

2

あなたは正しい道を進んでいると思います.「アクセスが拒否されました」の問題は、権限が制限されたASPNETユーザーで実行されているASP.NETプロセスが原因であり、それがエラーの原因です. できることは、Web アプリケーションのイマースネーションをセットアップすることです。web.config を変更するか、コードで行うことができます。なりすましの詳細については、こちらをご覧ください

web.comfig は非常に簡単です。web.config の system.web セクションに次の行を追加する必要があります。

<identity impersonate="true" userName="domain\user" password="password" />

ユーザーはサーバー上で管理者権限を持っている必要があります

以下のコードで偽装を実行したい場合は、これを行う方法の例を示します。

...
WindowsImpersonationContext context = ImpersonateUser("domain", "user", "password");
// kill your process
context.Undo();
...

[DllImport("advapi32.dll")]
private static extern bool LogonUser(
    String lpszUsername, String lpszDomain, String lpszPassword,
    int dwLogonType, int dwLogonProvider, ref IntPtr phToken);

[DllImport("advapi32.dll")]
private static extern bool DuplicateToken(
    IntPtr ExistingTokenHandle, int ImpersonationLevel,
    ref IntPtr DuplicateTokenHandle);

[DllImport("kernel32.dll")]
private static extern bool CloseHandle(IntPtr hObject);


private enum SecurityImpersonationLevel
{
    SecurityAnonymous,
    SecurityIdentification,
    SecurityImpersonation,
    SecurityDelegation
}

private enum LogonTypes
{
    LOGON32_PROVIDER_DEFAULT=0,
    LOGON32_LOGON_INTERACTIVE=2,
    LOGON32_LOGON_NETWORK=3,
    LOGON32_LOGON_BATCH=4,
    LOGON32_LOGON_SERVICE=5,
    LOGON32_LOGON_UNLOCK=7,
    LOGON32_LOGON_NETWORK_CLEARTEXT=8,
    LOGON32_LOGON_NEW_CREDENTIALS=9
}

public static WindowsImpersonationContext ImpersonateUser(string domain, string username, string password)
{
    WindowsImpersonationContext result = null;
    IntPtr existingTokenHandle = IntPtr.Zero;
    IntPtr duplicateTokenHandle = IntPtr.Zero;

    try
    {
        if (LogonUser(username, domain, password,
            (int)LogonTypes.LOGON32_LOGON_NETWORK_CLEARTEXT, (int)LogonTypes.LOGON32_PROVIDER_DEFAULT,
            ref existingTokenHandle))
        {
            if (DuplicateToken(existingTokenHandle,
                (int)SecurityImpersonationLevel.SecurityImpersonation,
                ref duplicateTokenHandle))
            {
                WindowsIdentity newId = new WindowsIdentity(duplicateTokenHandle);
                result = newId.Impersonate();
            }
        }
    }
    finally
    {
        if (existingTokenHandle != IntPtr.Zero)
            CloseHandle(existingTokenHandle);
        if (duplicateTokenHandle != IntPtr.Zero)
            CloseHandle(duplicateTokenHandle);
    }
    return result;
}

これが役に立てば幸いです、よろしく

于 2009-11-21T00:11:22.360 に答える
1

十分な権限を持つユーザーとして C# アプリケーションを実行する必要があります。

このような権限を持つ ASP AppPool を信頼できない場合 (すべきではありません)、十分な権限を持つアカウントで実行される別のサービスを作成し、権限の低いアプリと権限の高いサービスの間で通信するためのプロトコルを用意する必要があります。プロセスを殺します。

AppPool で高い特権を持つユーザーになりすまさないでください。そのパスワードを提示する必要があります。これにより、AppPool が侵害された場合に、すべての効果的な手段によって、権限の低いアカウントを権限の高いアカウントに効果的に昇格させることができます.

于 2009-11-20T22:27:13.647 に答える