2010-09-22 20 views
13

Chciałbym utworzyć małą aplikację, która zbiera informacje o systemie (Win32_blablabla) za pomocą WinRM w przeciwieństwie do WMI. Jak mogę to zrobić z C#?Jak uzyskać dostęp do WinRM w C#

Głównym celem jest użycie WS-Man (WinRm) w przeciwieństwie do DCOM (WMI).

Odpowiedz

13

Najwyraźniej najłatwiej byłoby zastosować automatyzację WSMAN. wsmauto.dll referencyjny Windwos \ system32 w projekcie:

alt text

wtedy, kod poniżej powinny pracować dla Ciebie. Opis API jest tutaj: msdn: WinRM C++ API

IWSMan wsman = new WSManClass(); 
IWSManConnectionOptions options = (IWSManConnectionOptions)wsman.CreateConnectionOptions();     
if (options != null) 
{ 
    try 
    { 
     // options.UserName = ???; 
     // options.Password = ???; 
     IWSManSession session = (IWSManSession)wsman.CreateSession("http://<your_server_name>/wsman", 0, options); 
     if (session != null) 
     { 
      try 
      { 
       // retrieve the Win32_Service xml representation 
       var reply = session.Get("http://schemas.microsoft.com/wbem/wsman/1/wmi/root/cimv2/Win32_Service?Name=winmgmt", 0); 
       // parse xml and dump service name and description 
       var doc = new XmlDocument(); 
       doc.LoadXml(reply); 
       foreach (var elementName in new string[] { "p:Caption", "p:Description" }) 
       { 
        var node = doc.GetElementsByTagName(elementName)[0]; 
        if (node != null) Console.WriteLine(node.InnerText); 
       } 
      } 
      finally 
      { 
       Marshal.ReleaseComObject(session); 
      } 
     } 
    } 
    finally 
    { 
     Marshal.ReleaseComObject(options); 
    } 
} 

nadzieję, że to pomaga, chodzi

1

Chciałbym zauważyć, że to pokazuje błąd współdziałania domyślnie w Visual Studio 2010.
por http://blogs.msdn.com/b/mshneer/archive/2009/12/07/interop-type-xxx-cannot-be-embedded-use-the-applicable-interface-instead.aspx

Wygląda na to, że są dwa sposoby rozwiązania tego problemu. Ta pierwsza jest udokumentowana w powyższym artykule i wydaje się być właściwym sposobem rozwiązania problemu. Istotne zmiany w tym przykładzie:

WSMan wsManObject = new WSMan(); To jest zamiast IWSMan wsman = new WSManClass(); który rzuci błąd.

Druga rozdzielczość to przejście do VS2010-> Solution Explorer-> Solution-> Project-> References i wybranie WSManAutomation. Kliknij prawym przyciskiem lub naciśnij Alt-Enter, aby uzyskać dostęp do właściwości. Zmień wartość właściwości "Embed Interop Types" odwołania wsmauto.

3

Mam artykuł opisujący prosty sposób uruchomienia Powershell przez WinRM z .NET pod numerem http://getthinktank.com/2015/06/22/naos-winrm-windows-remote-management-through-net/.

Kod znajduje się w jednym pliku, jeśli chcesz go po prostu skopiować, a jest to także pakiet NuGet zawierający odniesienie do System.Management.Automation.

To automatycznie zarządza zaufanymi hostami, może uruchamiać bloki skryptów, a także wysyłać pliki (co nie jest tak naprawdę obsługiwane, ale utworzyłem pracę). Zwroty są zawsze surowymi obiektami z Powershell.

Mam nadzieję, że to pomaga, używam tego przez pewien czas przy moich automatycznych wdrożeniach. Proszę zostawić komentarz, jeśli znajdziesz problemy.

Powiązane problemy