使用Invoke-Command(icm)执行远程连接时遭遇Windows PowerShell无法处理的错误
icm命令的会话终止错误 我之前处理过好几个类似的PowerShell远程会话报错的情况,针对你用icm -cn $ips -Credential $crd {hostname}时遇到的「An error has occurred which Windows PowerShell cannot handle. A remote session might have ended.」错误,给你分享几个实用的排查和解决方法:
先确认命令的小细节
你的脚本块{hostname}其实可以写成{Get-HostName}(更符合PowerShell规范),不过这个小问题一般不会触发这个致命错误,但先调整试试,避免语法解析的潜在问题。检查WinRM服务的运行状态
远程连接依赖WinRM服务,不管是本地机器还是目标机器,这个服务都得正常运行。你可以先在本地测试连通性:Test-WSMan -ComputerName $ips如果返回错误,先登录到目标机器(或者用其他方式)启动并设置自动启动:
Start-Service WinRM Set-Service WinRM -StartupType Automatic验证账号的远程管理权限
你用的$crd账号必须具备目标机器的远程管理权限:- 确保账号属于目标机器的Remote Management Users组或者管理员组;
- 检查目标机器的WinRM信任列表,确认你的客户端IP/主机名在里面:
如果不在,就添加进去(Get-Item WSMan:\localhost\Client\TrustedHosts-Concatenate参数是避免覆盖原有列表):Set-Item WSMan:\localhost\Client\TrustedHosts -Value "你的客户端IP或主机名" -Concatenate
调整远程会话的内存配额
这个错误经常是因为远程会话的内存限制不够,尤其是当命令返回大量数据的时候。你可以修改目标机器的WinRM配置:# 把单会话内存上限设为1GB,可根据需求调整 Set-Item WSMan:\localhost\Shell\MaxMemoryPerShellMB 1024修改后记得重启WinRM服务生效:
Restart-Service WinRM使用自定义会话选项执行命令
默认的会话参数可能会有超时或者配置文件加载的问题,你可以创建一个自定义会话选项再执行:$sessionOption = New-PSSessionOption -NoMachineProfile -OperationTimeout 300000 Invoke-Command -ComputerName $ips -Credential $crd -SessionOption $sessionOption {Get-HostName}这里设置了5分钟的超时时间,并且跳过加载用户配置文件,避免配置文件里的异常影响会话。
排查防火墙和网络配置
确保目标机器的防火墙允许WinRM流量:默认是5985(HTTP)和5986(HTTPS)端口。可以临时关闭防火墙测试,如果问题消失,就添加对应的入站规则。另外,如果是工作组环境,还要确保目标机器的网络类型设置为「私有」或者「域」——WinRM默认禁止在「公共」网络下进行远程连接。
小提示:如果以上方法都不行,可以尝试在目标机器上启用WinRM的详细日志,路径是
Event Viewer > Applications and Services Logs > Microsoft > Windows > WinRM > Operational,从日志里找更具体的错误原因。
内容的提问来源于stack exchange,提问作者Srishti




