我一直试图创建一个C#ASP.NET页面,该页面位于Windows Server 2003 IIS 6服务器上,并且在(远程)调用时,重新启动/回收服务器上的特定应用程序池。

我运气不太好,有人知道我要去哪里了吗?我尝试了许多组合,并尝试直接从服务器运行,但无济于事。

如果我没有通过凭据,则会收到错误消息...


拒绝访问


...当我通过它们时,我得到了错误...


用户凭证不能用于本地连接


我还尝试过使用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)
{
}

最佳答案

您不能将用户名/密码选项用于本地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",
                            "P@$$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);
    }
  }
}


希望这可以帮助。

10-07 15:50