PowerShell无法进入PSSession求助:交互式会话执行异常
解决PromptForChoice后无法进入PSSession的问题
问题根源
Enter-PSSession启动的是交互式远程会话,但脚本会在执行该命令后立即继续运行后续代码,不会停留在交互式会话中,导致你视觉上感觉“没进入会话”。- 原脚本中的
Invoke-Command未指定-ComputerName ServerABC,会默认在本地执行,完全不符合远程操作的需求。
解决方案1:先进入交互式会话,退出后自动执行远程关闭操作
如果你需要先手动操作远程服务器,再自动执行关闭COM应用的逻辑,可以修改脚本,让交互式会话退出后再执行远程命令:
# 选择是否进入交互式会话 $Prompt = "点击Yes进入ServerABC的交互式会话" $Choices = [System.Management.Automation.Host.ChoiceDescription[]] @("&Yes", "&No", "&Cancel") $Default = 1 $Choice = $host.UI.PromptForChoice($null, $Prompt, $Choices, $Default) switch($Choice) { 0 { Write-Host "正在进入远程会话,退出后将自动关闭COM应用" Enter-PSSession ServerABC # 退出交互式会话后执行远程关闭逻辑 $sb = { $admin = New-Object -ComObject "COMAdmin.COMAdminCatalog" $appCollection = $admin.GetCollection("Applications") $appCollection.Populate() $appCollection | ForEach-Object { Write-Host "正在关闭: $($_.Name)" $admin.ShutdownApplication($_.Name) } } Invoke-Command -ComputerName ServerABC -ScriptBlock $sb } 1 { Write-Host "选择了No" } 2 { Write-Host "选择了Cancel" } }
解决方案2:直接远程执行关闭操作(无需交互式会话)
如果不需要手动操作远程服务器,直接执行关闭逻辑更高效,完全可以跳过交互式会话:
# 选择是否远程关闭COM应用 $Prompt = "点击Yes关闭ServerABC上的COM应用" $Choices = [System.Management.Automation.Host.ChoiceDescription[]] @("&Yes", "&No", "&Cancel") $Default = 1 $Choice = $host.UI.PromptForChoice($null, $Prompt, $Choices, $Default) switch($Choice) { 0 { $sb = { $admin = New-Object -ComObject "COMAdmin.COMAdminCatalog" $appCollection = $admin.GetCollection("Applications") $appCollection.Populate() $appCollection | ForEach-Object { Write-Host "正在关闭: $($_.Name)" $admin.ShutdownApplication($_.Name) } } Invoke-Command -ComputerName ServerABC -ScriptBlock $sb } 1 { Write-Host "选择了No" } 2 { Write-Host "选择了Cancel" } }
注意事项
- 确保当前执行脚本的用户拥有目标服务器
ServerABC的远程管理权限。 - 目标服务器需开启WinRM服务(可通过
Enable-PSRemoting命令开启)。
内容的提问来源于stack exchange,提问作者movement
相关产品推荐
相关产品推荐

