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

15

我可以在远程服务器上启动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个会话时,会出现错误提示,说这是不允许的(由于PowerShell默认限制为5个并发远程PSSessions)。但运行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会话,而无需从一个控制台会话中执行所有操作?

你在本地和远程计算机上使用的操作系统和PowerShell版本是什么?我发现在Windows 8 / PS3.0,Windows 8.1 / PS4.0Preview上有不同的行为(几乎可以打开20个会话而没有问题)。 - Joshua McKinnon
本地和远程系统均为使用PowerShell 3.0的Windows 2008 R2 SP1。 - Local Needs
啊,我写得太快了。尽管我被保证远程服务器是PowerShell 3.0,但实际上它们只运行PowerShell 2.0。这可能是问题所在。Keith提到的许多命令(例如与“断开连接会话”相关的命令)仅在v3.0中可用。 - Local Needs
3个回答

14
据我所知...你创建的 PSSessions 存储在“MyServerName”上,并且在您首次创建它们的会话期间,还将由Get-PSSession返回(在您远程 FROM 的 PowerShell 窗口中不带参数)。当关闭创建它们的会话时,这些会话就不再存在于您的计算机上了。这就是为什么在关闭并打开新的 PowerShell 窗口时,Get-PSSession 不会返回任何内容的原因。它们从未“存储”在您的计算机上,它们是远程会话,但在最初创建它们的本地作用域内它们是可用的。
如果您的会话仍然留在 MyServerName 上,正如您提到的关于最大会话数的错误,那么键入以下命令应该列出它们:
Get-PSSession -ComputerName MyServerName

如果您想在当前会话/窗口中重新连接它们,可以执行以下操作:

Get-PSSession -ComputerName MyServerName | Connect-PSSession

为了删除它们,使您能够创建新的到MyServerName的PSSessions

Get-PSSession -ComputerName MyServerName | Remove-PSSession

深入了解文档后,所有会话并不会在关闭PowerShell窗口时无限期地保留。请参见:

Get-Help about_Remote_Disconnected_Sessions -ShowWindow

部分摘录(强调是我的):

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

据我所见,当您关闭启动PSSession的PowerShell窗口时,既不处于断开连接状态,也没有忙于运行命令的会话将被丢弃。此外,文档似乎还提到了超时(可能取决于服务器上的PSSessionConfigurations,但我自己对此一无所知)。

这是我筛选PowerShell Remoting文档的好借口,还可以查看:

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

是的,我同意我应该能够使用以下命令在远程计算机上获取打开的会话(从新控制台):Get-PSSession -ComputerName MyServerName。 - Local Needs
你不能做到这一点让我非常怀疑2.0...很高兴我们解决了这个问题。 - Joshua McKinnon

0
从我的实验来看,如果会话没有做任何事情,它们就会在远程端关闭。为了防止这种情况发生,请让它们做些什么,例如:
Invoke-Command -Session $s { ... } -AsJob
Invoke-Command server01 { ... } -Disconnected

或者另一个选择是断开你的会话:

Disconnect-PSSession -Id (1..5)

这两种方法都会使远程会话保持活动状态。


-1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接