在 C# 中使用 Winrm 在远程窗口上运行命令
本文关键字:窗口 命令 运行 程窗口 Winrm | 更新日期: 2023-09-27 18:32:28
我有一个简单的方法可以使用winrm从本地Windows机器连接到远程Windows机器。以下是正在运行的powershell代码:
Set-Item WSMan:'localhost'Client'TrustedHosts -Value $ip -Force
$securePassword = ConvertTo-SecureString -AsPlainText -Force 'mypass'
$cred = New-Object System.Management.Automation.PSCredential 'Administrator', $securePassword
$cmd = {ls C:'temp}
Invoke-Command -ComputerName $ip -Credential $cred -ScriptBlock $cmd
我想弄清楚如何在 c# 中做确切的事情。
此外,如果有人告诉我是否有一种方法可以在 c# winrm 中发送文件,这将更加有帮助。
注意:这只是我的本地机器上需要的 c# 代码。远程计算机已设置。
好吧,我想出一种方法,我将在下面发布,但是虽然它在Windows 8上运行良好,但它在Windows 7上遇到错误"强名称验证失败",所以我应该继续研究这个问题。仍然请随时发布其他想法。
-->将 System.Management.Automation.dll 添加到您的项目中。
WSManConnectionInfo connectionInfo = new WSManConnectionInfo();
connectionInfo.ComputerName = host;
SecureString securePwd = new SecureString();
pass.ToCharArray().ToList().ForEach(p => securePwd.AppendChar(p));
connectionInfo.Credential = new PSCredential(username, securePwd);
Runspace runspace = RunspaceFactory.CreateRunspace(connectionInfo);
runspace.Open();
Collection<PSObject> results = null;
using (PowerShell ps = PowerShell.Create())
{
ps.Runspace = runspace;
ps.AddScript(cmd);
results = ps.Invoke();
// Do something with result ...
}
runspace.Close();
foreach (var result in results)
{
txtOutput.AppendText(result.ToString() + "'r'n");
}
我有一篇文章描述了一种通过 WinRM 在 http://getthinktank.com/2015/06/22/naos-winrm-windows-remote-management-through-net/运行 Powershell 的简单方法。
如果只想复制代码,则代码位于单个文件中,它也是一个包含对 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);
如果有帮助,请标记为答案。 我已经在自动化部署中使用了一段时间。 如果您发现问题,请留下评论。