Question

Je voudrais créer une petite application qui peut collecter des informations système (Win32_blablabla) en utilisant WinRM par opposition à WMI. Comment puis-je faire de C #?

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

Était-ce utile?

La solution

Je suppose que la meilleure façon serait d'utiliser l'automatisation WSMAN. wsmauto.dll de référence de Windwos \ system32 dans votre projet:

text alt

alors, le code ci-dessous devrait travailler pour vous. Description de l'API est ici: msdn: API C ++ WinRM

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 a trait

Autres conseils

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

Le code est dans un seul fichier si vous voulez copier juste et il y a aussi un paquet NuGet qui comprend la référence à System.Management.Automation.

Il gère automatiquement les hôtes de confiance, peut exécuter des blocs de script, et également envoyer des fichiers (qui est pas vraiment soutenu mais je 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);

Espérons que cela aide, je l'ai utilisé pendant un certain temps avec mes déploiements automatisés. S'il vous plaît laisser des commentaires si vous trouvez des questions.

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 décrite dans l'article ci-dessus et semble être la bonne façon de traiter le problème. Les changements pertinents pour cet exemple est:

WSMan wsManObject = new WSMan (); Ce remplace IWSMan wsman = new WSManClass (); qui jette l'erreur.

La deuxième résolution est d'aller à la 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é « Intégrer Interop Types » de la référence wsmauto.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top