Domanda

Mi piacerebbe creare una piccola applicazione in grado di raccogliere informazioni di sistema (Win32_blablabla) utilizzando Gestione remota Windows rispetto a WMI. Come posso fare che da C #?

Lo scopo principale è quello di utilizzare WS-Man (WinRM) al contrario di DCOM (WMI).

È stato utile?

Soluzione

Credo che il modo più semplice sarebbe quella di utilizzare l'automazione WSMAN. Riferimento wsmauto.dll da Windwos \ system32 nel progetto:

alt text

dunque, codice qui sotto dovrebbe funzionare per voi. Descrizione API è qui: 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);
    }
}

Spero che questo aiuti, saluti

Altri suggerimenti

Ho un articolo che descrive un modo semplice per eseguire PowerShell tramite Gestione remota Windows da .NET a http://getthinktank.com/2015/06/22/naos-winrm-windows-remote-management-through-net/ .

Il codice è in un singolo file, se si desidera basta copiarlo ed è anche un pacchetto NuGet che include il riferimento a System.Management.Automation.

E 'automatico gestisce host attendibili, in grado di eseguire blocchi di script e file anche inviare (che non è realmente supportato, ma ho creato un lavoro in giro). I rendimenti sono sempre gli oggetti prime da 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);

Spero che questo aiuti, ho usato questo per un po 'con le mie installazioni automatizzate. Si prega di lasciare commenti se trovate i problemi.

Vorrei notare che questo mostra un errore di interoperabilità per impostazione predefinita in Visual Studio 2010.
c.f. http://blogs.msdn.com/b/mshneer/archive/2009/12/07/interop-type-xxx-cannot-be-embedded-use-the-applicable-interface-instead aspx

Ci sembrano essere due modi per risolvere questo. Questo primo è documentato nell'articolo elencato sopra e sembra essere il modo corretto per gestire il problema. I cambiamenti rilevanti per questo esempio è:

WS-Management wsManObject = new WS-Management (); Questo sostituisce IWSMan wsman = new WSManClass (); che gettare l'errore.

La seconda risoluzione è quello di andare al VS2010-> Solution Explorer-> cura-> Progetto-> Riferimenti e selezionare WSManAutomation. Fare clic destro o premere Alt-Invio per accedere alle proprietà. Modificare il valore del "Tipi di Embed Interop" proprietà del riferimento wsmauto.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top