在远程服务器上获取所有打开的PS会话(从新的控制台窗口)

Loc*_*eds 13 powershell remote-access powershell-3.0

我可以在远程服务器上启动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]
Run Code Online (Sandbox Code Playgroud)

正如预期的那样,当我尝试打开第6次会议,我得到的错误说,这是一个没有没有(5个并发远程PSSession中由于PoswerShells默认限制).但是运行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
Run Code Online (Sandbox Code Playgroud)

然而,当我关闭控制台,并打开一个新的,运行Get-PSSession中(有或没有定义的"-ComputerName"参数)显示根本没有打开的会话.

PS C:\> Get-PSSession
PS C:\>
Run Code Online (Sandbox Code Playgroud)

我知道这些会议仍然是开放的,因为当我尝试打开我的新的控制台一个新的我得到关于超过5个并发会话相同的错误:

PS C:\> New-PSSession -ComputerName MyServerName
    New-PSSession : [......maximum number of 5 concurrent shells]
Run Code Online (Sandbox Code Playgroud)

根据'Get-PSSession Get-Help -full'运行'Get-PSSession -ComputerName MyServerName应该获取特定服务器上的所有远程PS会话,无论他们从哪个会话或计算机启动(至少我理解它):

"该命令返回[远程服务器]上的所有会话,即使它们是在不同的会话中或在不同的计算机上创建的."

那么,有没有办法在远程服务器上查找和/或删除任何打开的PS会话 - 而无需在一个控制台会话中完成所有操作?

Jos*_*non 12

据我所知......

您在"MyServerName"上创建的PSSession,在您首次创建它们的会话期间,也将由Get-PSSession返回(没有参数,在您正在远程处理的框中的PowerShell窗口中).当您关闭创建的会话时,会话不再在您的计算机上.这就是当您关闭并打开一个新的PowerShell窗口时Get-PSSession不返回任何内容的原因.它们永远不会"存在"您的计算机上,它们是远程会话,但是,它们位于原始PowerShell窗口的范围内,因为这是您创建它们的本地范围.

如果您的会话仍在MyServerName上,因为它们似乎是由于您提到的有关最大会话的错误,那么键入以下命令应该列出它们:

Get-PSSession -ComputerName MyServerName
Run Code Online (Sandbox Code Playgroud)

如果要在现有会话/窗口中重新连接它们,可以执行以下操作:

Get-PSSession -ComputerName MyServerName | Connect-PSSession
Run Code Online (Sandbox Code Playgroud)

要全部删除它们,您可以创建到MyServerName的新PSSession

Get-PSSession -ComputerName MyServerName | Remove-PSSession
Run Code Online (Sandbox Code Playgroud)

在文档中进一步了解,当您关闭PowerShell窗口时,所有会话都无法无限期地存在.看到:

Get-Help about_Remote_Disconnected_Sessions -ShowWindow

部分摘录(强调我的):

如果在PSSession中运行命令时关闭(退出)创建PSSession的会话,则Windows PowerShell会将PSSession维持在远程计算机上的"已断开连接"状态.如果关闭(退出)创建PSSession的会话,但PSSession中没有运行任何命令,则Windows PowerShell不会尝试维护PSSession.

从我所看到的,当您关闭启动PSSession的PowerShell窗口时,将忽略非a)断开连接或b)忙于运行命令的会话.此外,文档似乎确实提到还有超时(这可能取决于服务器上的PSSessionConfigurations,但我自己也不知道这些(除了它们存在).

这是我筛选一些PowerShell Remoting文档的一个很好的借口,同时看看:

Get-Help *PSSession*
Get-Help *remote*
Run Code Online (Sandbox Code Playgroud)