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

时间:2013-07-24 23:15:14

标签: powershell remote-access powershell-v3.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]

正如预期的那样,当我尝试打开第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会话 - 而无需在一个控制台会话中完成所有操作?

3 个答案:

答案 0 :(得分:12)

据我所知......

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

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

Get-PSSession -ComputerName MyServerName

如果您想在现有的会话/窗口中重新连接它们,您可以这样做:

Get-PSSession -ComputerName MyServerName | Connect-PSSession

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

Get-PSSession -ComputerName MyServerName | Remove-PSSession

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

  

Get-Help about_Remote_Disconnected_Sessions -ShowWindow

     

部分摘录(强调我的):

     

如果您关闭(退出)创建PSSession的会话   Windows PowerShell维护的命令在PSSession中运行   PSSession处于远程计算机上的Disconnected状态。 如果你   关闭(退出)创建PSSession的会话,但不是   命令在PSSession中运行,而Windows PowerShell则没有   尝试维持PSSession。

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

这对我来说是一个很好的借口来筛选一些PowerShell远程处理文档,同时看看:

Get-Help *PSSession*
Get-Help *remote*

答案 1 :(得分:0)

从我的实验中,如果会话没有做任何事情,那么他们就会在远程端关闭。为了防止这种情况,要么让他们做某事,例如:

Invoke-Command -Session $s { ... } -AsJob
Invoke-Command server01 { ... } -Disconnected

或另一种选择是断开会话:

Disconnect-PSSession -Id (1..5)

这两种方法都会导致远程会话保持活跃状态​​。

答案 2 :(得分:-1)

今天遇到同样的问题我从jrich那里遇到了这套很好的功能。 我甚至只是将功能粘贴到我的PS窗口并运行

"<computername>" | Get-RemotePSSession | Remove-RemotePSSession

瞧!在所述计算机上不再有左开会话。

这是他博客的直接链接。 https://jrich523.wordpress.com/2012/01/19/managing-remote-wsman-sessions-with-powershell/#comment-1079