You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

使用Invoke-Command(icm)执行远程连接时遭遇Windows PowerShell无法处理的错误

解决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账号必须具备目标机器的远程管理权限:

    1. 确保账号属于目标机器的Remote Management Users组或者管理员组;
    2. 检查目标机器的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

火山引擎 最新活动