2014-09-25 5 views
1

Я использую WSManAutomation для удаленного управления серверами. Мне нужно установить и удалить приложения на удаленных серверах с включенным WinRM через HTTPS. Соединение не является проблемойУдаление продукта с помощью WinRM и C#

До сих пор приведенный ниже код запускает msiexec.exe на удаленном хосте, поскольку я могу видеть его в списке процессов, но он не выполняет команду удаления.

public void UninstallProduct(string path, string target, string username = null, string password = null) 
    { 
     IWSMan wsman = new WSManClass(); 
     IWSManConnectionOptions options = (IWSManConnectionOptions)wsman.CreateConnectionOptions(); 
     if (options != null) 
     { 
      try 
      { 
       options.UserName = username; 
       options.Password = password; 

       int iFlags = (int)_WSManSessionFlags.WSManFlagCredUsernamePassword; 
       IWSManSession session = (IWSManSession)wsman.CreateSession(string.Format("https://{0}:5986/wsman", target), iFlags, options); 
       // IWSManSession session = (IWSManSession)wsman.CreateSession(string.Format("http://{0}/wsman", target), 0, options); 
       if (session != null) 
       { 
        try 
        { 

         string strResource = "http://schemas.microsoft.com/wbem/wsman/1/wmi/root/cimv2/Win32_Process"; 
         string strInputParameters =string.Format("<p:Create_INPUT xmlns:p=\"{0}\"><p:CommandLine>\"{1}\"</p:CommandLine></p:Create_INPUT>", "http://schemas.microsoft.com/wbem/wsman/1/wmi/root/cimv2/Win32_Process",path); 

         var reply = session.Invoke("Create", strResource, strInputParameters); 


         Console.WriteLine(reply); 
         Console.WriteLine(); 

        } 
        finally 
        { 
         Marshal.ReleaseComObject(session); 
        } 
       } 
      } 
      finally 
      { 
       Marshal.ReleaseComObject(options); 
      } 
     } 

    } 

Вызов метода выше будет:

obj.UninstallProduct(@"C:\Windows\System32\msiexec.exe /x {E499AB77-9B27-416CB9B6F-4A171D02BB31} /passive", "hostname", @"hostname\Administrator", "password"); 

Вы знаете, почему команда не получает выполняется? Должен ли я использовать другой способ удаления продукта?

Заранее спасибо.

ответ

0

Наконец я наткнулся на способ сделать это с помощью удаленного PowerShell

string command = string.Format("(Get-WmiObject -Class Win32_Product | Where-Object {$_.Name -match {0}}).Uninstall()", productName); 

     PSCredential credential = new PSCredential(username, securePassword); 
     string shellUri = "http://schemas.microsoft.com/powershell/Microsoft.PowerShell"; 
     WSManConnectionInfo connectionInfo = new WSManConnectionInfo(true, target, 5986, "/wsman", shellUri, credential); 
     using (Runspace runspace = RunspaceFactory.CreateRunspace(connectionInfo)) 
     { 

      runspace.Open(); 

      Pipeline pipeline = runspace.CreatePipeline(command); 

      try 
      { 
       Collection<PSObject> results = pipeline.Invoke("Set-ExecutionPolicy Unrestricted -Scope Process"); 
      } 
      finally 
      { 
       runspace.Close(); 
      } 





     } 
Смежные вопросы