解决Windows错误:WinRM Shell客户端参数零或零
错误的描述
This error occurs when you attempt to run a command or script remotely using Windows Remote Management (WinRM), PowerShell Remoting, or a software provisioning tool like Ansible, Jenkins, or Terraform. The specific error message states: "WinRM Shell客户端无法处理请求.WSManRunShellCommand函数所需的参数之一是零或零. "
这种问题通常是由客户端和服务器之间的 WinRM 配置不匹配,目标机器上的环境变量受损,或将空的命令字符串传递给 WinRM API 引发的.当 WinRM 服务接收到格式不当,不完整或包含空参数的命令有效负载时,它无法执行函数并抛出此异常.
逐步修复问题
按照以下步骤来解决问题.
步骤1:验证命令有效载荷
最常见的原因是将空或零命令字符串传递给远程执行引擎.
- 检查导致错误的脚本或软件 (如Ansible或Jenkins).
- 确保包含命令的变量不是空的,未定义的,或者以零值进行评估.
- 如果您正在使用一个代码块,请验证在发送之前没有语法错误导致命令字符串断裂.
步骤2:检查和修复系统路径环境变量
一个受损或缺失的系统. Path variable on the target remote machine can prevent WinRM from finding the required executables (like cmd.exe 或是 powershell.exe ),使其内部通过一个零参数.
- 在目标的Windows机器上,打开开始菜单,键入 Environment Variables,并选择 Edit the system environment variables.
- 按下 Environment Variables... 在窗口底部的按.
- 在下面 System variables 找到了 Path 变量和点击 Edit.
- 确保存在以下关键条目:
%SystemRoot%\system32%SystemRoot%%SystemRoot%\System32\Wbem%SystemRoot%\System32\WindowsPowerShell\v1.0\
- 如果其中任何一个缺失,请点击 New 并将它们手动添加.
- 点击 OK 保存所有更改并重新启动计算机来应用它们.
步骤3:增加 WinRM MaxShellsPerUser 和 MaxMemoryPerShell
如果目标服务器分配的WinRM资源耗尽,它可能会在处理过程中丢失参数.
- 右键单击Windows开始菜单并选择 Windows PowerShell (Admin) 或是 Command Prompt (Admin) 在目标机器上.
- 通过运行检查当前 WinRM 配置限制:
winrm get winrm/config/winrs - 增加每个 shell 所分配的最大内存,以防止内存丢失:
winrm set winrm/config/winrs @{MaxMemoryPerShellMB="1024"} - 增加每个用户的同时 shell 的最大数量,以处理多个并行请求:
winrm set winrm/config/winrs @{MaxShellsPerUser="30"}
步骤4:重新启动Windows远程管理服务
通过重新启动 WinRM 服务应用新配置更改.
- 打开PowerShell作为管理员.
- 运行以下命令重新启动 WinRM 服务:
Restart-Service WinRM -Force - 如果您使用标准命令提示符,则运行以下命令:
net stop winrm net start winrm
步骤5:重新注册WSMan组件 (如果损坏)
如果底层的WSMan DLL文件未注册或受损,您可以重新注册它们来解决深层系统问题.
- 作为管理员打开命令提示符.
- 执行下列命令,一个接一个地重新注册核心组件:
regsvr32 WsmSvc.dll regsvr32 WsmWmiPl.dll - 在注册确认窗口出现后重新启动机器.
可能有一些错误.. Learn Microsoft