Перезапустите пул приложений из ASP.NET через проблемы WMI - PullRequest
2 голосов
/ 26 августа 2011

Я пытался создать страницу c # asp.net, которая находится на сервере win2k3 IIS 6 и при вызове (удаленно) перезапускает / перезапускает определенный пул приложений на сервере.

У меня не было особого взгляда, кто-нибудь знает, где я иду не так? Я пробовал много комбинаций и пробовал работать напрямую с сервера, но безрезультатно.

Я продолжаю получать сообщения «доступ запрещен» или «ошибки 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)
        {
        }

1 Ответ

2 голосов
/ 27 августа 2011

Вы не можете использовать опцию имени пользователя / пароля для локальных соединений 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);
    }                 
  }
}    

Надеюсь, это поможет.

...