14

我可以在远程服务器上启动 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 个会话时,我收到错误消息说这是一个不可以(由于 PoswerShell 默认限制为 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 会话——而不必从一个控制台会话中完成所有操作?

4

3 回答 3

13

据我所知...

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

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

Get-PSSession -ComputerName MyServerName

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

Get-PSSession -ComputerName MyServerName | Connect-PSSession

要将它们全部删除,使您能够为 MyServerName 创建新的 PSSession

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。

据我所知,当您关闭启动 PSSessions 的 PowerShell 窗口时,未断开连接或 b) 忙于运行命令的会话将被丢弃。此外,文档似乎确实提到了超时(这可能取决于服务器上的 PSSessionConfigurations,但我自己对这些一无所知(除了它们存在之外)。

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

Get-Help *PSSession*
Get-Help *remote*
于 2013-07-25T05:31:15.857 回答
0

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

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

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

Disconnect-PSSession -Id (1..5)

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

于 2013-07-25T05:52:38.903 回答
-1

今天遇到同样的问题,我遇到了 jrich 提供的一组不错的函数。我什至只是将函数粘贴到我的 PS 窗口中并运行

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

所述计算机上没有更多的左开会话。

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

于 2015-02-11T21:47:53.903 回答