【问题标题】:PowerShell remote connection problemsPowerShell 远程连接问题
【发布时间】:2019-02-05 18:07:35
【问题描述】:

我正在尝试实现 PowerShell 远程处理(用于在远程服务器上执行 PowerShell 脚本)。 我的远程服务器正在运行 Windows Server 2008 和 PowerShell v2。

从提升权限的 PS 控制台,我执行了以下 cmdlet:

Enable-PSRemoting

返回控制台:

WinRM 已设置为接收此计算机上的请求。

WinRM 已设置为在此计算机上进行远程管理。

从客户端计算机上提升的 PowerShell 会话中,我执行了以下 cmdlet:

Enter-PSSession –ComputerName [remote_server_name]

这一次,返回控制台:

Enter-PSSession:连接到远程服务器 [remote_server_name] 失败,出现以下错误消息: 客户端无法连接到请求中指定的目的地。验证目标上的服务是否正在运行并且正在接受请求。请查阅在目标(最常见的是 IIS 或 WinRM)上运行的 WS-Management 服务的日志和文档。如果目标是 WinRM 服务,在目标上运行以下命令来分析和配置 WinRM 服务:“winrm quickconfig”。有关详细信息,请参阅 about_Remote_Troubleshooting 帮助主题。

在 line:1 char:1

+ Enter_PSSession –ComputerName [remote_server_name]

+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

+ CategoryInfo : 无效/参数: ([remote_server_name]:string) [Enter-PSSession], PSRemotingTransportException

+ FullyQualifiedErrorId : CreateRemoteRunspaceFailed

我按照错误消息建议执行了“winrm quickconfig”。再次返回控制台:

WinRM 已设置为接收此计算机上的请求。

WinRM 已设置为在此计算机上进行远程管理。

重试

Enter-PSSession –ComputerName [remote_server_name]

从客户端机器返回相同的错误。

我仔细检查了 WinRM 服务是否正在远程服务器上运行。 为 TCP 协议、本地端口 5985 和所有远程端口配置了 Windows 远程管理 (HTTP-In) 防火墙规则。

即使我执行

Get-Service WinRM –ComputerName [remote_server_name]

从客户端机器,我们看到返回到控制台,确认 WinRM 服务确实在远程服务器上运行:

状态名称显示名称

-------- ---- ------------

运行 WinRM Windows 远程管理(WS-Manag…

在远程机器上执行以下命令

WinRM Enumerate WinRM/Config/Listener

返回控制台,显示正确的端口已打开:

侦听器 [Source="GPO"]

地址 = *

端口 = 5985

主机名启用 = true

URLPrefix = wsman

CertificateThumbprint ListeningOn = null

但是,执行

$remoteServer = [test_server_name]
$port = 5985
$connection = New-Object System.Net.Sockets.TcpClient($remoteServer, $port)
if ($connection.Connected) {
    Write-Host "Success"
}
else {
    Write-Host "Failed"
}

返回以下错误信息:

New-Object : 使用“2”参数调用“.ctor”的异常:“无法建立连接,因为目标机器主动拒绝它 [remote_server_ipaddress]:5985”

在 line:4 char:15

+ ... onnection = New-Object System.Net.Sockets.TcpClient($ipaddress, $port ...

+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~

+ CategoryInfo : InvalidOperation: (:) [New-Object], MethodInvocationException

+ FullyQualifiedErrorId : ConstructorInvokedThrowException,Microsoft.PowerShell.Commands.NewObjectCommand

我有另一台远程服务器,运行带有 PowerShell v4 的 Windows Server 2012 R2。我已经在这个盒子上启用了 PS 远程处理,并且可以从同一个客户端远程执行 PS 脚本。

那么,我错过了什么? PowerShell版本之间是否存在兼容性问题?

我的客户端 PC 正在运行 PowerShell 5,我正常运行的远程服务器正在运行 PowerShell 4,我发生故障的远程服务器正在运行 PowerShell 2。

非常欢迎提供见解、指导和建议。感谢观看。

更新:

我已经将两个测试虚拟机上的 .Net Framework 更新为 .Net 4.7.2,并在受影响的虚拟机上安装了 PowerShell 4(与正常运行的机器相同)。

在我的工作虚拟机和受影响的机器之间比较与 WinRM 相关的注册表项时,我找到了关键:

HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\WSMAN\Service

在工作的 VM 上,我发现了一个 32 位的“allow-remote-requests”,赋值为 1。受影响机器的注册表中缺少此条目。我添加了它,重新启动机器,重试了连接请求。

同样的问题仍然存在。

【问题讨论】:

  • 您是否设置了任何代理? netsh winhttp show proxy
  • 没有设置代理; “直接访问(无代理服务器)。”

标签: powershell powershell-remoting winrm


【解决方案1】:

您的主机似乎一直拒绝客户端计算机。

尝试通过执行以下操作获取主机的凭据:

    $c = Get-Credential        
    New-CimSession -ComputerName [name] -Credential $c        

然后,输入你的主机名和密码。

如果这仍然不起作用,请尝试手动将您的客户端添加为主机上的授权用户。

【讨论】:

    【解决方案2】:

    WinRM 服务绑定的 IP 地址似乎很重要,并且以某种方式与 IIS IP 相关联(我可能错了)。 @Komputer 的代码提供了一个很好的线索,在我的情况下,为“-ComputerName localhost”运行它没有用,但是当我输入真实的服务器名称时就可以了。

    在做

    netstat -aon | find "5985"
    

    返回

    TCP    192.168.24.82:5985      0.0.0.0:0              LISTENING       4
    

    验证 WinRM(端口 5985)未绑定到 localhost (127.0.0.1) 或所有 IP (0.0.0.0)。 (请注意,PID 为 4 的不是 WinRM 服务而是系统,我想这就是它的工作原理)。这是使用 netsh http 配置的(我不知道是否有其他方法),但由于它似乎也会影响 IIS 绑定,所以应该小心。我通过运行解决了这个问题

    netsh http add ipaddress=127.0.0.1
    

    (我也做了iisreset,可能没有必要)。这实质上使 WinRM 可以通过 localhost 访问,我猜这正是这些工具所期望的。在此之后,所有 WinRM 的东西似乎都可以工作了。

    Robin CM's IT Blog 上有一篇关于其他可能解决方案的好帖子,我在my own blog post 上进行了更深入的讨论(尽管其中一些与此无关)。

    【讨论】:

      猜你喜欢
      • 2021-04-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-06-02
      • 2011-07-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多