Windows WinRM 错误:WSManSendShellInput 参数为零或零
描述
这种错误通常发生在远程PowerShell管理会话 (WinRM) 中,当客户机和远程主机之间出现不匹配,腐败或配置漂移时. 这意味着WinRM shell客户端试图将数据发送到远程终端,但内部API函数所需的基本结构参数之一 ( WSManSendShellInput ) 缺失,损坏或评估为零.
常见的根源原因包括:
- 损坏的 WinRM 收听器设置或系统环境变量.
- 网络包检查软件 (如防火墙,代理程序或反病毒套件) 剥离头条或在运输中改变有效载荷.
- 在本地和远程操作系统之间不匹配或受损的 WinRM 配置方案.
- 在目标机器上的 WinRM 提供器内存管理限制.
逐步修复问题
从客户机 (如果适用,在主机上) 顺序执行这些解决方案来解决问题.
解决方案1:重新启动和重置WinRM服务
在 WinRM 服务中受损的运行状态可能导致 API 参数失败.重启和注册服务默认常常清除此错误.
- 打开开始菜单,输入 cmd,右键点击 Command Prompt,并选择 Run as administrator.
- 通过执行以下命令停止 WinRM 服务:
net stop winrm - 重新启动 WinRM 服务:
net start winrm - 运行快速配置工具来修复任何故障的默认参数,收听器或防火墙例外:
winrm quickconfig - 它们的类型 y (是的) 如果提示进行更改或创建一个新的 WinRM 收听器.
解决方案2:清除 MaxShellsPerUser 和 MaxMemoryPerShellMB 的限制
If the remote shell process hits an allocation limit, it may fail to populate the parameters required by the WSManSendShellInput 它们的功能.
- 发射 PowerShell as an Administrator 在客户端和远程机器 (如果可访问).
- 通过运行检查现有配置参数:
Get-Item WSMan:\localhost\Shell\* - 增加每个 shell 的内存限制,以确保复杂对象不会切割成零对象:
Set-Item WSMan:\localhost\Shell\MaxMemoryPerShellMB 2048 - 增加每个用户允许的 shell,以防止同时会话冲突:
Set-Item WSMan:\localhost\Shell\MaxShellsPerUser 30 - 重新启动 WinRM 服务以立即应用这些更改:
Restart-Service winrm
解决方案3:重建 WinRM 收听器
如果默认的收听器有损坏的属性,则必须完全删除它们并重建它们,以确保API参数与本机系统规范相匹配.
- 打开 Command Prompt as an administrator.
- 通过运行: 查看您当前的活跃 WinRM 收听器
winrm enumerate winrm/config/listener - 使用这个命令完全删除错误的收听器:
winrm delete winrm/config/listener?Address=*+Transport=HTTP(注:如果您的网络基础设施特别使用WinRM通过SSL,则将HTTP更改为HTTPS).
- 从干净的系统模板重新创建收听器基础设施:
winrm quickconfig
解决方案4:修复环境变量和系统路径
The WinRM sub-system relies heavily on underlying system environment variables to process structural payload schemas. Missing entries like %SystemRoot% 可能导致零参数.
- 按下 Windows Key + R, 类型
sysdm.cpl,并击中 Enter 打开系统属性. - 导航到 Advanced 按下按,然后点击 Environment Variables 在底部的按.
- 在下. System variables 找到名为的变量. Path 然后点击 Edit.
- Ensure that the following default Windows paths are explicitly listed. If they are missing, click New 将它们添加到:
C:\Windows\system32C:\WindowsC:\Windows\System32\WbemC:\Windows\System32\WindowsPowerShell\v1.0\
- 点击 OK 在所有窗口上保存更改,然后重新启动计算机.
解决方案5:暂时绕过SSL或网络检查
安全应用程序或硬件负载均衡器可能会删除自定义头,导致WSMan API参数到达终端点是空的.
- 如果您正在使用代理服务器,请在一个升高的PowerShell窗口中执行以下操作,暂时绕过本地路由地址:
$env:no_proxy="localhost,127.0.0.1,your-remote-host-ip" - 如果问题仅限于特定的可信目标机器,请直接将其添加到客户端可信托主机列表中,以消除握手过:
Set-Item WSMan:\localhost\Client\TrustedHosts -Value "your-remote-host-name-or-IP" -Force - 试试你的远程外连接序列.
为了帮助我们进一步确定问题,
- 您在运行一个 时是否会收到此错误? specific script 否则会发生吗? immediately upon connecting?
- 这是什么? Windows OS versions 在本地客户端和远程主机上都安装了吗?
- 您是否通过本地网络连接, VPN 或通过一个 domain controller environment?
可能有一些错误.. Learn Microsoft