Получение всех открытых сеансов 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