2011-08-26 102 views
2

我一直在嘗試創建一個位於win2k3 IIS 6服務器上的ac#asp.net頁面,並且當被遠程調用時,重新啓動/回收特定應用程序池服務器。通過WMI從ASP.NET重新啓動應用程序池問題

我一直沒有多看,有人知道我要去哪裏錯了嗎?我嘗試了很多組合,並嘗試從服務器直接運行,但無濟於事。

當我不通過憑證時,我總是收到「訪問被拒絕」或「win32:訪問被拒絕錯誤」。當我通過他們時,我得到「用戶憑證不能用於本地連接」。

我也嘗試提升anon帳戶的權限只是爲了測試,但它不會工作......這可能是我想要實現的嗎?

 try 
     { 

     ManagementScope scope = new ManagementScope("root\\MicrosoftIISv2"); 
     scope.Path.Server = "servername"; 
     scope.Path.Path = "\\\\servername\\root\\MicrosoftIISv2"; 
     scope.Path.NamespacePath = "root\\MicrosoftIISv2"; 
     scope.Options.Username = "domain\\user"; 
     scope.Options.Password = "password"; 
     scope.Options.Authentication = AuthenticationLevel.Default; 
     scope.Options.Impersonation = ImpersonationLevel.Impersonate; 
     scope.Options.EnablePrivileges = true; 
     scope.Connect(); 

     ManagementObject appPool = new ManagementObject(scope, new ManagementPath("IIsApplicationPool.Name='W3SVC/AppPools/AppPoolName'"), null); 
     appPool.InvokeMethod("Recycle", null, null); 

     } 
     catch (System.Exception ex) 
     { 
     } 
+0

忘了提及,我通過的域帳戶確實需要權限才能執行應用程序池重啓(dom admin) – Developr

回答

2

對於本地WMI連接,您不能使用用戶名/密碼選項。默認情況下,對於本地WMI連接,使用登錄用戶的憑證(在您的情況下爲您網站的應用程序池的標識)。我認爲你必須使用WMI從您的網站兩個選項:

  • 第一種選擇:授予您的應用程序池足夠的權限的身份來使用WMI(回收應用程序池)。

  • 第二種選擇:使用模擬。

下面是一個例子:

public class _Default : Page 
{ 
    [DllImport("advapi32.dll", SetLastError = true)] 
    static extern bool LogonUser(string principal, string authority,string password, uint logonType, uint logonProvider, out IntPtr token); 

    [DllImport("kernel32.dll", SetLastError = true)] 
    static extern bool CloseHandle(IntPtr handle); 

    protected void OnClick(object sender, EventArgs e) 
    { 
    IntPtr token = IntPtr.Zero; 
    WindowsImpersonationContext impUser = null; 

    try 
    {   
     bool result = LogonUser("administrator", "contoso", 
          "[email protected]$$W0rd", 3, 0, out token); 
     if (result) 
     { 
     WindowsIdentity wid = new WindowsIdentity(token); 
     impUser = wid.Impersonate(); 

     try 
     { 
      ManagementScope scope = new ManagementScope("root\\MicrosoftIISv2"); 
      scope.Path.Server = "srvcontoso"; 
      scope.Path.Path = "\\\\srvcontoso\\root\\MicrosoftIISv2"; 
      scope.Path.NamespacePath = "root\\MicrosoftIISv2"; 

      scope.Connect(); 

      ManagementObject appPool = new ManagementObject(scope, new ManagementPath("IIsApplicationPool.Name='W3SVC/AppPools/DefaultAppPool'"), null); 
      appPool.InvokeMethod("Recycle", null, null); 
     } 
     catch (System.Exception ex) 
     { 
     } 
     } 
    } 
    catch 
    {   
    } 
    finally 
    {   
     if (impUser != null) 
     impUser .Undo(); 

     if (token != IntPtr.Zero) 
     CloseHandle(token); 
    }     
    } 
}  

希望,這會有所幫助。

+0

謝謝,這幫助了很多! – Developr