在 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# 代码。远程计算机已设置。

在 C# 中使用 Winrm 在远程窗口上运行命令

好吧,我想出一种方法,我将在下面发布,但是虽然它在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);

如果有帮助,请标记为答案。 我已经在自动化部署中使用了一段时间。 如果您发现问题,请留下评论。