通过Enter-PSSession执行含Start-Process的PowerShell脚本会话中断问题
问题根因
你遇到的报错和Shell内存分配无关,核心是远程PSSession的生命周期和你启动的监控软件安装程序行为直接绑定,当安装程序执行以下操作时就会强制中断会话:
- 安装过程中触发WinRM服务重启或配置变更
- 监控类软件自带的网络驱动、防火墙规则修改操作会临时断开当前远程TCP连接
- 安装程序要求提升至本地System权限运行时,当前交互式远程用户的会话上下文被强制回收
- 部分安装包会触发用户登出、系统重启预备操作,直接终止所有当前用户的活跃会话
排查验证步骤
- 先在目标服务器本地执行相同的安装命令,确认安装过程是否会弹出UAC提示、是否会提示重启WinRM/网络服务、是否安装过程中网络会出现瞬断
- 执行安装前先在远程会话中运行
Get-WinEvent -LogName Microsoft-Windows-WinRM/Operational -MaxEvents 20 | Format-List TimeCreated,Message,查看WinRM服务是否在你执行安装命令的时刻有重启、错误记录 - 替换安装程序为简单的测试程序,比如
Start-Process -FilePath notepad.exe -Wait -PassThru,确认是否还会出现会话中断,如果不会就可以100%确认是监控安装包本身的行为导致的问题
解决方案
方案1:使用后台作业脱离会话生命周期绑定
不要在交互式的Enter-PSSession会话中直接执行命令,改用Invoke-Command配合-AsJob参数,让安装进程和当前PSSession脱钩:
# 本地执行,远程触发安装作业 Invoke-Command -ComputerName 目标服务器名 -ScriptBlock { Start-Process -FilePath $using:Installer -ArgumentList $using:ArgList -Wait -PassThru } -AsJob -JobName 监控安装作业 # 后续可以通过Get-Job接收执行结果
方案2:使用计划任务绕过会话上下文限制
直接在远程服务器上创建一个计划任务,用本地System权限执行安装程序,完全避开WinRM会话的限制:
# 远程创建计划任务执行安装 Invoke-Command -ComputerName 目标服务器名 -ScriptBlock { $action = New-ScheduledTaskAction -Execute $using:Installer -Argument $using:ArgList $trigger = New-ScheduledTaskTrigger -Once -At (Get-Date).AddMinutes(1) $principal = New-ScheduledTaskPrincipal -UserId "NT AUTHORITY\SYSTEM" -RunLevel Highest Register-ScheduledTask -TaskName "监控软件安装" -Action $action -Trigger $trigger -Principal $principal }
安装完成后手动删除该计划任务即可。
方案3:添加WinRM服务恢复配置
如果确实是安装过程中WinRM服务被重启导致的会话中断,提前在远程服务器上配置WinRM服务的自动恢复规则,同时延长PSSession的超时时间:
# 配置WinRM服务失败后自动重启 sc.exe config WinRM start= auto sc.exe failure WinRM reset= 0 actions= restart/1000/restart/2000/restart/3000 # 延长PSSession超时时间到1小时 Set-PSSessionConfiguration -Name Microsoft.PowerShell -IdleTimeoutSeconds 3600 -Force
内容的提问来源于stack exchange,提问作者Leon Smith
相关产品推荐
相关产品推荐

