Pregunta

Me gustaría crear una pequeña aplicación que puede recopilar información del sistema (Win32_blablabla) usando WinRM en contraposición a WMI. ¿Cómo puedo hacer eso desde C #?

El objetivo principal es el uso de WS-Man (WinRM) en contraposición a DCOM (WMI).

¿Fue útil?

Solución

supongo que la forma más fácil sería utilizar la automatización WSMAN. wsmauto.dll referencia de windwos \ system32 en su proyecto:

text alt

A continuación, el código de abajo debe trabajar para usted. Descripción API está aquí: 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);
    }
}

Espero que esta ayuda, respecto

Otros consejos

Tengo un artículo que describe una manera fácil de ejecutar a través de Powershell WinRM de .NET http://getthinktank.com/2015/06/22/naos-winrm-windows-remote-management-through-net/ .

El código es en un solo archivo si desea simplemente copiarlo y también es un paquete NuGet que incluye la referencia a System.Management.Automation.

auto administra hosts de confianza, puede ejecutar bloques de script, y también enviar archivos (que no es realmente soportados pero creó un trabajo alrededor). Los rendimientos son siempre los objetos en bruto 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);

Espero que esta ayuda, He estado usando esto por un tiempo con mis implementaciones automatizadas. Por favor, dejar comentarios si encuentra problemas.

Me gustaría señalar que esto demuestra un error de interoperabilidad de forma predeterminada en Visual Studio 2010.
compárese http://blogs.msdn.com/b/mshneer/archive/2009/12/07/interop-type-xxx-cannot-be-embedded-use-the-applicable-interface-instead .aspx

Parece que hay dos maneras de resolver esto. Esta primera se documenta en el artículo mencionado anteriormente y parece ser la forma correcta de manejar el problema. Los cambios pertinentes para este ejemplo es:

WSMan wsManObject = new WSMan (); Esto es en lugar de IWSMan wsman = new WSManClass (); que tirar el error.

La segunda resolución es ir a la VS2010-> Solución Explorer-> Solución-> Proyecto-> Referencias y seleccione WSManAutomation. Haga clic derecho o pulsar Alt-Enter para acceder a las propiedades. Cambiar el valor de la propiedad "Insertar Tipos de interoperabilidad" de la referencia wsmauto.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top