解决Windows错误:WinRS客户端无法处理请求
This error typically occurs when using Windows Remote Management (WinRM) or Windows Remote Shell (WinRS) to execute commands on a remote computer. The specific error message, "WinrsFreePullResult函数所需的参数是零或零", 指示协议不匹配,受损的会话状态,缓冲区大小问题,或在数据检索过程中客户端和远程目标机器之间意外的数据有效负载缩短.
下面是为什么会发生这种情况的完整,详细描述,以及如何解决这一问题的全面步骤指南.
错误概述和原因
没有 WinrsFreePullResult function 是 Windows Remote Shell 客户端使用的内部 API 调用来释放从远程服务器抽取命令执行结果所分配的内存资源. 当该函数接收一个零或零参数时,意味着客户端预计网络流中的内存指针或数据块大小是有效的,但接收了一个空白或受损的响应.
这种错误的常见触发因素包括:
- Buffer Limit Exhaustion: 远程机器上的命令输出对配置的WinRM缓冲区或输出大小限制太大.
- WinRM Service Glitches: 本地客户端或远程主机上的 WinRM 服务进入不稳定的状态.
- MaxShellsPerUser Limits: 用户帐户已超过主机策略允许的同时使用的最大数量的远程外.
- Network Security Interruption: 防火墙,深度包检查 (DPI) 或VPN下降在传输中切断了RPC/WS管理连接,导致零有效载荷返回.
逐步修复问题
按照这些步骤顺序解决错误. 执行这些命令需要客户机和远程机器的管理权限.
步骤1:重新启动WinRM服务
最快的解决方案是重新启动Windows远程管理服务.
- 打开开始菜单,输入 cmd,右键按下 Command Prompt,并选择 Run as administrator.
- 输入下面的命令来停止服务:
net stop winrm - 输入下面的命令重新启动服务:
net start winrm - 在远程机器上执行相同的步骤,如果您有其他方式访问它 (例如,通过RDP或物理访问).
步骤2:增加 MaxMemoryPerShellMB 和输出缓冲区
如果您正在运行的命令生成大量的文本或数据输出,默认的 WinRM 内存限制将停止连接并触发此错误.
- 在 Remote Target Machine 打开 PowerShell as an Administrator.
- 通过运行检查当前配置限制:
Get-Item WSMan:\localhost\Shell\* - 从默认的 (通常是512MB或1024MB) 增加每 shell 分配的内存到2048MB,运行:
Set-Item WSMan:\localhost\Shell\MaxMemoryPerShellMB 2048 - 增加每个用户允许的同时 shell 的最大数量,以确保您的会话不会被窒息:
Set-Item WSMan:\localhost\Shell\MaxShellsPerUser 30 - 重新启动 WinRM 服务以应用这些更改:
Restart-Service winrm
步骤3:修改客户端上的URI和时间截止设置
如果客户端在等待长时间的响应时放弃请求,内部数据指针将变为null.您可以延长操作时限值.
- 在你的 Local Client Machine 打开 PowerShell as an Administrator.
- 设置默认的结构时间止更高,以允许大数据流成功完成:
Set-Item WSMan:\localhost\Client\DefaultPorts\HTTP 5985 Set-Item WSMan:\localhost\Client\NetworkDelayms 60000 - 如果您正在执行命令使用
winrs执行文件,附上-t一个参数可以手动增加执行时间.例如:winrs -r:RemoteComputerName -t:600 "your-command-here"(注: 在
-t:600标志设置时间值为600秒).
步骤4:重新注册并修复 WinRM 配置
如果配置变得不对齐或安全描述符受损,重置 WinRM 收听器基础设施可以修复底层终端.
- 在 Remote Target Machine 打开 Command Prompt as an Administrator.
- 运行配置实用程序自动修复收听器和打开防火墙例外:
winrm quickconfig - 如果提示进行更改或分析状态,按一下 y 并且击中了 Enter 必须接受.
- 如果设置已经运行,请完全重置配置设置到默认状态,使用:
winrm invoke restore winrm/config @{} - 再一次运行.
winrm quickconfig在恢复后重建清洁的终点.
步骤5:检查网络包检查和MTU大小
包含数据有效负载的大数据包可以在网络路线上被碎片化.如果防火墙清除后续数据包,客户端会遇到零参数错误.
- 禁用暂时深包检查或HTTP通信扫描端口.
5985(HTTP) 和5986(HTTPS) 在本地或网络周围防火墙内. - Ensure that your Network Interface Card (NIC) Maximum Transmission Unit (MTU) size matches on both client and host (Standard value is
1500您可以通过命令提示符检查:netsh interface ipv4 show subinterfaces
ERROR_WINRS_CLIENT_SIGNAL_NULL_PARAM | ERROR_WINRS_CLIENT_RECEIVE_NULL_PARAM | ERROR_WINRS_CLIENT_PULL_NULL_PARAM | ERROR_WINRS_CLIENT_CLOSERECEIVEHANDLE_NULL_PARAM | ERROR_WINRS_CLIENT_SEND_NULL_PARAM
可能有一些错误.. Learn Microsoft