咨询PowerShell远程会话中断时自动重建的实现方案(CMCB补丁场景)
PowerShell远程会话自动重连解决方案
问题分析
你之前的方案核心问题在于:SessionValid属性只是返回了新的会话对象,但并没有更新$Session变量本身。每次调用Invoke-Command时还是在使用原来的失效会话,自然达不到自动重连的效果。
解决方案:封装会话管理逻辑
可以通过封装会话检查与重建的逻辑,确保每次调用Invoke-Command时都使用有效会话。以下是两种可行方案:
方案1:用函数统一管理会话
$Server = 'servername' # 初始化会话变量 $Session = $null # 定义获取有效会话的函数 function Get-ValidSession { param($ComputerName) # 检查现有会话是否处于正常打开状态 if ($null -ne $Script:Session -and $Script:Session.State -eq 'Opened') { return $Script:Session } # 会话失效或不存在,重建会话 Write-Host "重建到 $ComputerName 的远程会话..." $Script:Session = try { New-PSSession -ComputerName $ComputerName -ErrorAction Stop } catch { Write-Warning "无法建立到 $ComputerName 的会话: $_" $null } return $Script:Session } # 测试监控循环 while($true){ $validSession = Get-ValidSession -ComputerName $Server if ($null -ne $validSession) { try { $result = Invoke-Command -Session $validSession -ScriptBlock { $pid } Write-Host "当前会话PID: $result" } catch { Write-Warning "调用失败,标记会话为失效: $_" # 显式销毁失效会话,避免残留无效对象 if ($null -ne $Script:Session) { Remove-PSSession -Session $Script:Session -ErrorAction SilentlyContinue $Script:Session = $null } } } Start-Sleep -Seconds 5 }
方案2:用脚本块动态获取会话
如果不想用函数,也可以用脚本块实现动态检查逻辑:
$Server = 'servername' $Session = try { New-PSSession -ComputerName $Server -ErrorAction Stop } catch {} # 定义动态获取有效会话的脚本块 $getValidSession = { if ($null -ne $Script:Session -and $Script:Session.State -eq 'Opened') { return $Script:Session } # 重建会话 Write-Host "重建到 $Server 的远程会话..." $Script:Session = try { New-PSSession -ComputerName $Server -ErrorAction Stop } catch { $null } return $Script:Session } # 测试监控循环 while($true){ $validSession = & $getValidSession if ($null -ne $validSession) { try { $result = Invoke-Command -Session $validSession -ScriptBlock { $pid } Write-Host "当前会话PID: $result" } catch { Write-Warning "调用失败,标记会话为失效: $_" Remove-PSSession -Session $Script:Session -ErrorAction SilentlyContinue $Script:Session = $null } } Start-Sleep -Seconds 5 }
关键改进点
- 每次调用前主动检查会话状态,失效则立即重建
- 调用失败后显式销毁失效会话,避免残留无效对象
- 使用
Script:作用域确保会话变量在函数/脚本块中能被正确更新 - 增加日志输出,便于排查会话重建和调用失败的情况
内容的提问来源于stack exchange,提问作者Steve
相关产品推荐
相关产品推荐

