🇬🇧 | 🇩🇪 | 🇫🇷 | 🇪🇸 | 🇨🇳 | 🇸🇦
我们没有DLL,但我们有:
Windows文件分析器和在线快速反病毒

一个简约的界面,具有快速搜索,方便的上传和干净的部分结构.

🛡️🔍 快速验证你的档案,只需要放上这个页面.
病毒检查,哈希,签名验证,架构,人工智能信息.

如何修复 "WinRM Shell客户端无法处理请求.传递给WSManRunShellCommand函数的参数值之一是零或零. "

描述

This error occurs when you try to execute a remote command via Windows Remote Management (WinRM) or PowerShell Remoting, and the command invocation fails before it even starts executing on the target machine.

核心问题是 WinRM 在启动 shell 命令时期望有效的,非空的参数 ( WSManRunShellCommand 如果您的脚本,自动化工具 (如Ansible,Jenkins或Azure DevOps) 或手动CLI输入传递一个空字符串 ( "" ),一个 null 变量,或一个错误的逃离参数,如果命令或参数是明确要求的,WinRM 拒绝这个错误的请求.它也可能由字符编码不匹配,损坏的WinRM 会话配置,或在远程主机上严格的策略限制,在传输过程中删除特定参数.


逐步修复问题

修复1:检查和清洁你的命令参数

最常见的是,这个错误是由一个在发送命令之前对values为null的变量引起的.

  1. Locate the script or task 这导致了错误.
  2. Review the exact command string 通过远程主机.
  3. 寻找空的变量 (例如, Invoke-Command -ScriptBlock { & $executable $arguments } 在哪里? $executable 或是 $arguments 结果是空的或零的).
  4. Hardcode a simple test command (比如 whoami 或是 hostname ) 代替你的变量.
  5. 如果测试命令有效,请将验证逻辑添加到脚本中,以确保在执行之前没有参数为零,如下:
    if (-not [string]::IsNullOrEmpty($myArgument)) {
        # Run your WinRM command here
    }

修复2:重新注册并重新启动WinRM服务

如果参数是正确的,则客户端或主机上的 WinRM 服务配置可能出现故障或不同步.

  1. 按下 Start 菜单,类型 cmd,右键按下 Command Prompt,并选择 Run as administrator.
  2. 通过键入下面的命令并按下关闭 WinRM 服务 Enter:
    net stop winrm
  3. 取消 WinRM 配置以清除卡住状态:
    winrm unconfig
  4. 重新启动默认的 WinRM 配置和防火墙例外:
    winrm quickconfig -q
  5. 重新启动服务以清洁应用更改:
    net start winrm

修复3:修复第三方自动化 (Ansible/Jenkins) 的参数逃离

如果您在使用自动化平台来控制 Windows 节点时遇到此错误,则问题通常在于如何处理引号或特殊字符.

  1. 打开您的配置操作簿或管道脚本.
  2. 检查是否通过嵌套引号的命令 (例如, "powershell.exe -Command "Write-Output 'Hello'"" ) 没有.
  3. Change the escaping style 例如,在Ansible中,使用 win_shell 模块,而不是原材料. win_command,或者使用字面区块量表包裹你的PowerShell命令 ( | ) 以防止YAML将参数转换为零值:
    - name: Run powershell script safely
      ansible.windows.win_shell: |
        $path = "C:\Program Files\App"
        Start-Process -FilePath "$path\run.exe"

修复4:增加WinRM MaxShellsPerUser和MaxMemoryPerShell

有时WinRM会丢弃参数或返回空的内部指针,因为它没有分配的操作资源.

  1. 打开 PowerShell as an Administrator 在目标的 Windows 机器上.
  2. 检查您当前的MaxShellsPerUser和MaxMemory配置:
    Get-Item WSMan:\localhost\Shell\*
  3. 增加每个 shell 的内存限制,以防止参数解析时的无声崩:
    Set-Item WSMan:\localhost\Shell\MaxMemoryPerShellMB 1024
  4. 增加并发的限制,以确保您的进程不会被窒息:
    Set-Item WSMan:\localhost\Shell\MaxShellsPerUser 30
  5. 重新启动 WinRM 服务以应用资源更新:
    Restart-Service winrm
ERROR_WSMAN_SHELL_INVALID_SHELL_HANDLE | ERROR_WSMAN_SHELL_INVALID_COMMAND_HANDLE | ERROR_WSMAN_COMMAND_ALREADY_CLOSED | ERROR_WSMAN_SENDSHELLINPUT_INVALID_STREAMID_INDEX | ERROR_WSMAN_SHELL_SYNCHRONOUS_NOT_SUPPORTED

可能有一些错误.. Learn Microsoft