我想创建一个小型应用程序,该应用程序可以使用WinRM而不是WMI来收集系统信息(Win32_blablabla)。我如何从C#中做到这一点?

主要目标是使用WS-Man(WinRm)而不是DCOM(WMI)。

最佳答案

我猜最简单的方法是使用WSMAN自动化。从项目中的windwos\system32引用wsmauto.dll:

然后,下面的代码将为您工作。 API说明在这里: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);
    }
}

希望这会有所帮助,问候

10-04 21:17