【发布时间】: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