2010-09-22 8 views
13

Je voudrais créer une petite application capable de collecter des informations système (Win32_blablabla) en utilisant WinRM plutôt que WMI. Comment puis-je faire ça à partir de C#?Comment accéder à WinRM en C#

L'objectif principal est d'utiliser WS-Man (WinRm) par opposition à DCOM (WMI).

Répondre

13

Je suppose que le moyen le plus simple serait d'utiliser l'automatisation WSMAN. wsmauto.dll de référence de Windwos \ system32 dans votre projet:

alt text

alors, le code ci-dessous devrait travailler pour vous. Description de l'API est ici: 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); 
    } 
} 

espérons que cette aide, ce qui est

1

Je voudrais noter que cela montre une erreur Interop par défaut dans Visual Studio 2010.
CF. http://blogs.msdn.com/b/mshneer/archive/2009/12/07/interop-type-xxx-cannot-be-embedded-use-the-applicable-interface-instead.aspx

Il semble y avoir deux façons de résoudre ce problème. Cette première est documentée dans l'article ci-dessus et semble être la bonne façon de gérer le problème. Les modifications pertinentes pour cet exemple sont les suivantes:

WSMan wsManObject = new WSMan(); Ceci remplace IWSMan wsman = new WSManClass(); ce qui va jeter l'erreur.

La deuxième résolution est d'aller à VS2010-> Solution Explorer-> Solution-> Projet-> Références et sélectionnez WSManAutomation. Faites un clic droit ou appuyez sur Alt-Entrée pour accéder aux propriétés. Modifiez la valeur de la propriété "Embed Interop Types" de la référence wsmauto.

3

J'ai un article qui décrit un moyen facile d'exécuter Powershell via WinRM à partir de .NET au http://getthinktank.com/2015/06/22/naos-winrm-windows-remote-management-through-net/.

Le code se trouve dans un fichier unique si vous voulez simplement le copier et c'est aussi un paquet NuGet qui inclut la référence à System.Management.Automation.

Il gère automatiquement les hôtes de confiance, peut exécuter des blocs de script, et aussi envoyer des fichiers (ce qui n'est pas vraiment supporté mais j'ai créé un travail autour). Les retours sont toujours les objets bruts de Powershell.

// this is the entrypoint to interact with the system (interfaced for testing). 
var machineManager = new MachineManager(
    "10.0.0.1", 
    "Administrator", 
    MachineManager.ConvertStringToSecureString("xxx"), 
    true); 

// will perform a user initiated reboot. 
machineManager.Reboot(); 

// can run random script blocks WITH parameters. 
var fileObjects = machineManager.RunScript(
    "{ param($path) ls $path }", 
    new[] { @"C:\PathToList" }); 

// can transfer files to the remote server (over WinRM's protocol!). 
var localFilePath = @"D:\Temp\BigFileLocal.nupkg"; 
var fileBytes = File.ReadAllBytes(localFilePath); 
var remoteFilePath = @"D:\Temp\BigFileRemote.nupkg"; 
machineManager.SendFile(remoteFilePath, fileBytes); 

J'espère que cela aide, je l'utilise depuis un certain temps avec mes déploiements automatisés. S'il vous plaît laissez des commentaires si vous trouvez des problèmes.

Questions connexes