如何修复 "WinRM Shell 客户端无法处理请求.WSManSignalShell 函数所需的参数之一是零或零. "
没有.
当Windows远程管理 (WinRM) 客户端试图将控制信号 (如终止进程或关闭会话) 发送到远程时发生这种错误,但底层WS-Management API收到一个无效,缺失或零参数 ( WSManSignalShell ) 这通常表明本地客户端和远程主机之间的配置不匹配,破损的shell会话状态,过时的Windows PowerShell/WinRM组件,或限制性的网络安全策略阻止特定的信号有效负载.
逐步修复问题
步骤1:重新启动WinRM服务
在本地计算机或远程服务器上出现故障或结的WinRM服务可能导致参数交付失败.重启服务可以更新状态.
- 按下 Windows Key + X 并且选择 Terminal (Admin) 或是 Command Prompt (Admin).
- 键入下面的命令来停止服务,然后按下 Enter:
net stop winrm - 键入下面的命令重新启动服务,然后按下 Enter:
net start winrm - 如果可能,请在本地机器和远程目标机器上执行这些步骤.
步骤2:更新或重新注册WS管理组件
如果负责WSMan函数的本地系统文件未注册或受损,WinRM可能会传递零参数.
- 打开 Command Prompt as Administrator.
- 运行下列命令将 WinRM 配置重置到其默认设置:
winrm quickconfig - 它们的类型 Y 然后按下. Enter 如果提示进行更改或启用防火墙例外.
步骤3:增加 WinRM MaxShellsPerUser 和 MaxMemoryPerShellMB
当远程 shell 耗尽分配的内存或超过允许的同时 shell 数量时,它会丢弃或破坏接入的会话包,导致函数调用中的 null 值.
- 打开 PowerShell as Administrator 在远程机器上 (或局部如果故障排除局部回路).
- 通过运行检查当前的限制:
Get-Item WSMan:\localhost\Shell\* - 增加每个外分配的最大内存,以确保信号有效载荷不会下降:
Set-Item WSMan:\localhost\Shell\MaxMemoryPerShellMB 1024 - 增加每个用户允许的同时使用的最大数量:
Set-Item WSMan:\localhost\Shell\MaxShellsPerUser 30 - 使用步骤1中的命令重新启动 WinRM 服务,以应用更改.
步骤4:将目标主机添加到可信托主机列表
If the client does not fully trust the remote endpoint, certain advanced management signals like WSManSignalShell 可能因安全限制而被剥离.
- 打开 PowerShell as Administrator 在您的本地客户机上.
- 运行下面的命令来信任特定的远程机器 (取代
REMOTE_IP_OR_NAME与您实际的远程计算机的IP地址或主机名):Set-Item WSMan:\localhost\Client\TrustedHosts -Value "REMOTE_IP_OR_NAME" -Force(注:使用 ` 如果您想为测试目的信任所有主机,但这不那么安全).*
- 在本地机器上重新启动 WinRM 服务.
步骤 5: 验证PowerShell和.NET框架的兼容性
在客户机上运行的 PowerShell 版本和远程主机上运行的版本之间的不兼容性可能导致序列化参数对象被错误解包为 null.
- 在两个机器上检查您的PowerShell版本:
$PSVersionTable.PSVersion - 如果一个机器运行过时的Windows管理框架 (WMF) 或.NET框架版本,请通过Windows Update下载和安装最新更新,以确保两个终端使用匹配协议.
可能有一些错误.. Learn Microsoft