如何在C#中访问WinRM

我想创build一个小的应用程序,可以使用WinRM而不是WMI来收集系统信息(Win32_blablabla)。 我怎么能从C#做到这一点?

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

Solutions Collecting From Web of "如何在C#中访问WinRM"

我想最简单的方法是使用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); } } 

希望这有助于问候

我有一篇文章描述了通过.NET的WinRM运行Powershell的简单方法, 网址为http://getthinktank.com/2015/06/22/naos-winrm-windows-remote-management-through-net/

如果您想要复制代码,则代码位于单个文件中,也是包含对System.Management.Automation的引用的NuGet包。

它自动管理可信主机,可以运行脚本块,并发送文件(这不是真的支持,但我创造了一个工作)。 返回始终是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); 

希望这有帮助,我一直在使用这一段时间与我的自动化部署。 如果您发现问题,请留下评论。

我想说明的是,这在Visual Studio 2010中默认显示了一个互操作错误。
参考http://blogs.msdn.com/b/mshneer/archive/2009/12/07/interop-type-xxx-cannot-be-embedded-use-the-applicable-interface-instead.aspx

似乎有两种方法可以解决这个问题。 这首先记录在上面列出的文章,似乎是正确的方法来处理这个问题。 这个例子的相关变化是:

WSMan wsManObject = new WSMan(); 这是代替IWSMan wsman = new WSManClass(); 这会抛出错误。

第二种解决方法是进入VS2010->解决方案资源管理器 – >解决方案 – >项目 – >引用并选择WSManAutomation。 右键单击或按Alt-Enter访问属性。 更改wsmauto引用的“Embed Interop Types”属性的值。