Получение всех открытых сеансов PS на удаленном сервере (из нового окна консоли)
Я могу начать 5 новых сеансов PS на удаленном сервере и увидеть их всех, запустив Get-PSSession
PS C:\> New-PSSession -ComputerName MyServerName
Id Name ComputerName State ConfigurationName Availability
-- ---- ------------ ----- ----------------- ------------
1 Session1 MyServerName Opened Microsoft.PowerShell Available
[repeat 4 more times]
Как и ожидалось, когда я пытаюсь открыть 6-ю сессию, я получаю сообщение об ошибке "нет-нет" (из-за предела по умолчанию PoswerShells из 5 одновременных удаленных PSSession). Но запуск Get-Session показывает все 5 сеансов, так что все работает так, как должно быть до сих пор:
PS C:\> New-PSSession -ComputerName MyServerName
New-PSSession : [......maximum number of 5 concurrent shells]
PS C:\> Get-PSSession
Id Name ComputerName State ConfigurationName Availability
-- ---- ------------ ----- ----------------- ------------
1 Session1 MyServerName Opened Microsoft.PowerShell Available
2 Session2 MyServerName Opened Microsoft.PowerShell Available
3 Session3 MyServerName Opened Microsoft.PowerShell Available
4 Session4 MyServerName Opened Microsoft.PowerShell Available
5 Session5 MyServerName Opened Microsoft.PowerShell Available
Однако, когда я закрываю эту консоль и открываю новую, запуск Get-PSSession (с или без параметра -ComputerName "не показывает открытых сеансов вообще.
PS C:\> Get-PSSession
PS C:\>
Я знаю, что эти сеансы все еще открыты, потому что, когда я пытаюсь открыть новую в моей новой консоли, я получаю ту же ошибку, что и в отношении более 5 одновременных сеансов:
PS C:\> New-PSSession -ComputerName MyServerName
New-PSSession : [......maximum number of 5 concurrent shells]
Согласно "Get-PSSession Get-Help -full" запуск "Get-PSSession -ComputerName MyServerName должен получать все удаленные сеансы PS на конкретном сервере независимо от того, с какого сеанса или компьютера они были запущены (по крайней мере, так я понимаю ):
"Команда возвращает все сеансы на [удаленном сервере], даже если они были созданы в разных сеансах или на разных компьютерах".
Итак, есть ли способ найти и/или удалить любые открытые сеансы PS на удаленном сервере - без необходимости делать все это из одной консоли?
Ответы
Ответ 1
Из того, что я могу сказать...
Созданные вами PSSessions в реальном времени на "MyServerName" и в течение всего сеанса, который вы впервые создали, также будут возвращены Get-PSSession (без аргументов в окне PowerShell в поле, в котором вы удаляете FROM). Когда вы закрываете сеанс, в котором они созданы, сеансы больше не отображаются на вашем компьютере. Вот почему Get-PSSession ничего не возвращает, когда вы закрываете и открываете новое окно PowerShell. Они никогда не "жили" на вашем компьютере, это удаленные сеансы, однако они были в области вашего исходного окна PowerShell, потому что это локальная область, в которой вы их создали.
Если ваши сеансы по-прежнему находятся в MyServerName, по-видимому, из-за ошибки вы упоминаете о максимальных сеансах, а затем введите следующую команду:
Get-PSSession -ComputerName MyServerName
Если вы хотите повторно подключить их все в своем существующем сеансе/окне, вы можете сделать следующее:
Get-PSSession -ComputerName MyServerName | Connect-PSSession
Чтобы удалить их все, что позволяет создавать новые PSSessions для MyServerName
Get-PSSession -ComputerName MyServerName | Remove-PSSession
Посмотрев немного дальше в документах, все сеансы не живут бесконечно, когда вы закрываете окно PowerShell. Видеть:
Get-Help about_Remote_Disconnected_Sessions -ShowWindow
частичная выдержка (с акцентом мой):
Если вы закроете сеанс, в котором была создана PSSession, когда команды запущены в PSSession, Windows PowerShell поддерживает PSSession в состоянии Disconnected на удаленном компьютере. Если вы закрываете сессию, в которой была создана PSSession, но в PSSession не выполняются команды, Windows PowerShell не пытается поддерживать PSSession.
Из того, что я вижу, сеансы, которые не были отключены или b) заняты запуском команды, отбрасываются при закрытии окна PowerShell, из которого вы начали PSSessions. Кроме того, в документации, похоже, упоминаются также тайм-ауты (которые, вероятно, зависят от PSSessionConfigurations на сервере, но я ничего не знаю о них, кроме меня (кроме них).
Это было хорошим оправданием для меня, чтобы просеять часть документации PowerShell Remoting, а также посмотреть:
Get-Help *PSSession*
Get-Help *remote*
Ответ 2
Из моих экспериментов, если сеансы ничего не делают, они закрываются на удаленном конце. Чтобы предотвратить это, попросите их сделать что-то например:
Invoke-Command -Session $s { ... } -AsJob
Invoke-Command server01 { ... } -Disconnected
Или другой вариант - отключить сеансы:
Disconnect-PSSession -Id (1..5)
Оба подхода приведут к тому, что удаленные сеансы останутся в живых.
Ответ 3
Имея эту же проблему сегодня, я наткнулся на этот хороший набор функций от jrich. Я даже просто вставлял функции в свое окно PS и запускал
"<computername>" | Get-RemotePSSession | Remove-RemotePSSession
и вуаля! больше не осталось открытых сессий на указанном компьютере.
Вот прямая ссылка на его блог. https://jrich523.wordpress.com/2012/01/19/managing-remote-wsman-sessions-with-powershell/#comment-1079