about_Remote_Disconnected_Sessions
简短说明
介绍如何断开连接并重新连接到 PowerShell 会话 (PSSession)。
长说明
从 PowerShell 3.0 开始,可以从 PSSession 断开连接,并从同一台计算机或其他计算机重新连接到 PSSession。 会话状态保持,PSSession 中的命令在会话断开连接时继续运行。
“断开连接的会话”功能允许关闭在其中创建 PSSession 并关闭计算机的会话,而不会中断在远程 PSSession 中运行的命令。 断开连接的会话对于运行需要较长时间才能完成的命令非常有用。
不能与使用 Enter-PSSession
cmdlet 启动的交互式会话断开连接。
可以使用断开连接的会话来管理由于计算机或网络中断而意外断开连接的 PSSession。
断开连接的会话 cmdlet
以下 cmdlet 支持断开连接的会话功能:
Connect-PSSession
:连接到断开连接的 PSSession。Disconnect-PSSession
:断开 PSSession 的连接。Get-PSSession
:在本地计算机或远程计算机上获取 PSSession。Receive-PSSession
:获取在断开连接的会话中运行的命令的结果。Invoke-Command
:InDisconnectedSession 参数会立即创建 PSSession 并断开连接。
断开连接的会话功能的工作原理
从 Windows PowerShell 3.0 开始,PSSession 独立于在其中创建的会话。 活动 PSSession 保留在远程计算机上或服务器端连接,即使客户端计算机已关闭或断开与网络的连接。
在 PowerShell 2.0 中,从远程计算机中删除 PSSession 时,它会从原始会话或创建会话的会话断开连接。
断开 PSSession 的连接时,PSSession 将保持活动状态,并保留在远程计算机上。 会话状态从运行更改为断开连接。 可以重新连接到断开连接的 PSSession
- 同一计算机上的当前会话
- 同一台计算机上的不同会话
- 从不同计算机上的会话
维护会话的远程计算机必须正在运行并连接到网络。
断开连接的 PSSession 中的命令在远程计算机上继续不间断运行,直到命令完成或输出缓冲区填充。 若要防止完整输出缓冲区挂起命令,请使用 Disconnect-PSSession
、New-PSSessionOption
或 New-PSTransportOption
cmdlet 的 OutputBufferingMode 参数。
断开连接的会话以远程计算机上的断开连接状态进行维护。 它们可供你重新连接,直到删除 PSSession(例如使用 Remove-PSSession
cmdlet),或者直到 PSSession 空闲超时过期为止。 可以使用 Disconnect-PSSession
、New-PSSessionOption
或 New-PSTransportOption
cmdlet 的 IdleTimeoutSec 或 idleTimeout 参数来调整 PSSession 的空闲超时。
另一个用户可以连接到创建的 PSSessions,但前提是他们可以提供用于创建会话的凭据,或使用会话配置的 RunAs
凭据。
如何获取 PSSession
从 PowerShell 3.0 开始,Get-PSSession
cmdlet 在本地计算机和远程计算机上获取 PSSession。 它还可以获取在当前会话中创建的 PSSession。
若要在本地计算机或远程计算机上获取 PSSessions,请使用 ComputerName 或 ConnectionUri 参数。 如果没有参数,Get-PSSession
获取在本地会话中创建的 PSSession,而不考虑它们终止的位置。
下面的示例说明如何使用 Get-PSSession
。
New-PSSession
创建与 Server01 计算机的会话。 会话驻留在 Server01 计算机上。
New-PSSession -ComputerName Server01
Id Name ComputerName State ConfigurationName Availability
-- ---- ------------ ----- ----------------- ------------
2 Session2 Server01 Opened Microsoft.PowerShell Available
若要从 Server01 获取会话,请使用 ComputerName 参数指定 Get-PSSession
的目标。
Get-PSSession -ComputerName Server01
Id Name ComputerName State ConfigurationName Availability
-- ---- ------------ ----- ----------------- ------------
2 Session2 Server01 Opened Microsoft.PowerShell Available
如果 Get-PSSession
的 ComputerName 参数的值是 localhost,则 Get-PSSession
获取终止并在本地计算机上维护的 PSSession。 即使在本地计算机上启动 PSSession,它也不会在 Server01 计算机上获取 PSSession。
Get-PSSession -ComputerName localhost
若要获取在当前会话中创建的会话,请使用不带参数的 Get-PSSession
cmdlet。 在此示例中,Get-PSSession
获取在当前会话中创建并连接到 Server01 计算机的 PSSession。
Get-PSSession
Id Name ComputerName State ConfigurationName Availability
-- ---- ------------ ----- ----------------- ------------
2 Session2 Server01 Opened Microsoft.PowerShell Available
如何断开会话的连接
使用 Disconnect-PSSession
cmdlet 断开会话的连接。 若要标识 PSSession,请使用会话参数,或者通过管道将 PSSession 对象从 New-PSSession
或 Get-PSSession
cmdlet 传递给 Disconnect-PSSession
。
以下命令将 PSSession 与 Server01 计算机断开连接。 请注意,状态属性的值为断开连接,可用性的值为无。
Get-PSSession -ComputerName Server01 | Disconnect-PSSession
Id Name ComputerName State ConfigurationName Availability
-- ---- ------------ ----- ----------------- ------------
2 Session2 Server01 Disconnected Microsoft.PowerShell None
若要创建断开连接的会话,请使用 Invoke-Command
cmdlet 的 InDisconnectedSession 参数。 它会创建会话、启动命令并立即断开连接,然后命令才能返回任何输出。
以下命令在远程计算机 Server02 上的断开连接会话中运行 Get-WinEvent
命令。
Invoke-Command -ComputerName Server02 -InDisconnectedSession -ScriptBlock {
Get-WinEvent -LogName "*PowerShell*" }
Id Name ComputerName State ConfigurationName Availability
-- ---- ------------ ----- ----------------- ------------
4 Session3 Server02 Disconnected Microsoft.PowerShell None
如何连接到断开连接的会话
若要连接断开连接的会话,请将 Connect-PSSession
cmdlet 与 ComputerName 或 ConnectionUri 参数配合使用。 或者,可以通过管道将 Get-PSSession
的输出传递给 Connect-PSSession
。
以下示例获取 Server02 计算机上的会话。 输出包括两个断开连接的会话。
Get-PSSession -ComputerName Server02
Id Name ComputerName State ConfigurationName Availability
-- ---- ------------ ----- ----------------- ------------
2 Session2 juneb-srv8320 Disconnected Microsoft.PowerShell None
4 Session3 juneb-srv8320 Disconnected Microsoft.PowerShell None
以下命令连接到 Session2。 PSSession 现已打开且可用。
Connect-PSSession -ComputerName Server02 -Name Session2
Id Name ComputerName State ConfigurationName Availability
-- ---- ------------ ----- ----------------- ------------
2 Session2 juneb-srv8320 Opened Microsoft.PowerShell Available
如何获取结果
若要获取在断开连接的 PSSession 中运行的命令的结果,请使用 Receive-PSSession
cmdlet。
可以使用 Receive-PSSession
,而不是使用 Connect-PSSession
cmdlet。 如果会话已重新连接,Receive-PSSession
获取在会话断开连接时运行的命令的结果。 如果 PSSession 仍然断开连接,Receive-PSSession
连接到它,然后获取断开连接时运行的命令的结果。
Receive-PSSession
可以在作业(异步)或主机程序(同步)中返回结果。 使用 OutTarget 参数选择作业或主机。 默认值为主机。 但是,如果接收的命令以作业的形式在当前会话中启动,则默认以作业的形式返回该命令。
以下示例使用 Receive-PSSession
cmdlet 重新连接到 Server02 上的会话,并获取 Get-WinEvent
命令的结果。 OutTarget 参数用于获取作业中的结果。
Receive-PSSession -ComputerName Server02 -Name Session3 -OutTarget Job
Id Name PSJobTypeName State HasMoreData Location
-- ---- ------------- ----- ----------- --------
3 Job3 RemoteJob Running True Server02
若要获取作业结果,请使用 Receive-Job
cmdlet。
Get-Job | Receive-Job -Keep
ProviderName: PowerShell
TimeCreated Id LevelDisplayName Message PSComputerName
----------- -- ---------------- ------- --------------
5/14/2012 7:26:04 PM 400 Information Engine stat Server02
5/14/2012 7:26:03 PM 600 Information Provider "W Server02
5/14/2012 7:26:03 PM 600 Information Provider "C Server02
5/14/2012 7:26:03 PM 600 Information Provider "V Server02
状态和可用性属性
断开连接的 PSSession 的状态和可用性属性告诉你会话是否可供你重新连接到它。
当 PSSession 连接到当前会话时,其状态为打开,其可用性为可用。 断开与 PSSession 的连接时,PSSession 状态为断开连接,其可用性为无。
状态属性的值相对于当前会话。 断开连接的值表示 PSSession 未连接到当前会话。 但是,这并不意味着 PSSession 已断开与所有会话的连接。 它可能连接到另一个会话。
若要确定是否可以连接还是重新连接到 PSSession,请使用可用性属性。 值为“无”指示可连接会话。 忙碌值表示无法连接到 PSSession,因为它已连接到另一个会话。
以下示例在同一台计算机上的两个 PowerShell 会话中运行。 请注意,当 PSSession 断开连接并重新连接时,每个会话中状态和可用性属性的更改值。
# Session 1
New-PSSession -ComputerName Server30 -Name Test
Id Name ComputerName State ConfigurationName Availability
-- ---- ------------ ----- ----------------- ------------
1 Test Server30 Opened Microsoft.PowerShell Available
# Session 2
Get-PSSession -ComputerName Server30 -Name Test
Id Name ComputerName State ConfigurationName Availability
-- ---- ------------ ----- ----------------- ------------
1 Test Server30 Disconnected Microsoft.PowerShell Busy
# Session 1
Get-PSSession -ComputerName Server30 -Name Test | Disconnect-PSSession
Id Name ComputerName State ConfigurationName Availability
-- ---- ------------ ----- ----------------- ------------
1 Test Server30 Disconnected Microsoft.PowerShell None
# Session 2
Get-PSSession -ComputerName Server30
Id Name ComputerName State ConfigurationName Availability
-- ---- ------------ ----- ----------------- ------------
1 Test Server30 Disconnected Microsoft.PowerShell None
# Session 2
Connect-PSSession -ComputerName Server30 -Name Test
Id Name ComputerName State ConfigurationName Availability
-- ---- ------------ ----- ----------------- ------------
3 Test Server30 Opened Microsoft.PowerShell Available
# Session 1
Get-PSSession -ComputerName Server30
Id Name ComputerName State ConfigurationName Availability
-- ---- ------------ ----- ----------------- ------------
1 Test Server30 Disconnected Microsoft.PowerShell Busy
在远程计算机上维护断开连接的会话,直到删除它们,例如使用 Remove-PSSession
cmdlet 或超时。PSSession 的 IdleTimeout 属性确定断开连接的会话在删除之前保留多长时间。
空闲超时值
当检测信号线程未收到响应时,PSSession 处于空闲状态。 断开会话会使会话处于空闲状态,并启动 IdleTimeout 时钟,即使命令仍在断开连接的会话中运行也是如此。 PowerShell 认为断开连接的会话处于活动状态,但处于空闲状态。
创建和断开会话时,请验证 PSSession 中的空闲超时时间是否足够长,以便根据需要维护会话,但不要太长,以免在远程计算机上占用不必要的资源。
会话配置的 IdleTimeoutMs 属性确定使用会话配置的会话的默认空闲超时。 可以替代默认值,但该值不能超过会话配置的 MaxIdleTimeoutMs 属性。
使用以下命令获取会话配置的 IdleTimeoutMs 和 MaxIdleTimeoutMs 的值。
Get-PSSessionConfiguration |
Format-Table Name, IdleTimeoutMs, MaxIdleTimeoutMs
如果你是远程计算机上的管理员组的成员,可以在创建会话配置时设置这些值。 此外,可以在断开连接时更改值。
会话配置和会话选项的空闲超时值以毫秒为单位。 会话和会话配置选项的空闲超时值以秒为单位。
创建 PSSession(New-PSSession
、Invoke-Command
) 以及断开与 PSSession (Disconnect-PSSession
) 的连接时,可以设置 PSSession 的空闲超时。 但是,连接到 PSSession (Connect-PSSession
) 或获取结果 (Receive-PSSession
) 时,无法更改 IdleTimeout 值。
Connect-PSSession
和 Receive-PSSession
cmdlet 具有 SessionOption 参数,该参数采用 PSSessionOption 对象,例如 New-PSSessionOption
cmdlet 返回的对象。
SessionOption 对象中的 IdleTimeout 值和 $PSSessionOption
首选项变量中的 IdleTimeout 值不会更改 Connect-PSSession
或 Receive-PSSession
命令中 IdleTimeout 的值。
若要创建具有特定空闲超时值的 PSSession,请创建 $PSSessionOption
首选项变量。 将 IdleTimeout 属性的值设置为所需值(以毫秒为单位)。
创建 PSSessions 时,$PSSessionOption
变量中的值优先于会话配置中的值。
例如,以下命令将空闲超时设置为 48 小时:
$PSSessionOption = New-PSSessionOption -IdleTimeoutMSec 172800000
若要创建具有特定空闲超时值的 PSSession,请使用 New-PSSessionOption
cmdlet 的 IdleTimeoutMSec 参数。 然后,在 New-PSSession
或 Invoke-Command
cmdlet 的 SessionOption 参数的值中使用会话选项。
创建会话时设置的值优先于 $PSSessionOption
首选项变量和会话配置中设置的值。
例如:
$o = New-PSSessionOption -IdleTimeoutMSec 172800000
New-PSSession -SessionOption $o
若要在断开连接时更改 PSSession 的空闲超时,请使用 Disconnect-PSSession
cmdlet 的 IdleTimeoutSec 参数。
例如:
Disconnect-PSSession -IdleTimeoutSec 172800
若要创建具有特定空闲超时和最大空闲超时的会话配置,请使用 New-PSTransportOption
cmdlet 的 IdleTimeoutSec 和 MaxIdleTimeoutSec 参数。 然后,在 Register-PSSessionConfiguration
的 TransportOption 参数的值中使用传输选项。
例如:
$o = New-PSTransportOption -IdleTimeoutSec 172800 -MaxIdleTimeoutSec 259200
Register-PSSessionConfiguration -Name Test -TransportOption $o
若要更改会话配置的默认空闲超时和最大空闲超时,请使用 New-PSTransportOption
cmdlet 的 IdleTimeoutSec 和 maxIdleTimeoutSec 参数。 然后,在 Set-PSSessionConfiguration
的 TransportOption 参数的值中使用传输选项。
例如:
$o = New-PSTransportOption -IdleTimeoutSec 172800 -MaxIdleTimeoutSec 259200
Set-PSSessionConfiguration -Name Test -TransportOption $o
输出缓冲模式
PSSession 的输出缓冲模式确定当 PSSession 的输出缓冲区已满时如何管理命令输出。
在断开连接的会话中,输出缓冲模式有效地确定该命令在会话断开连接时是否继续运行。
有效值如下:
Block
(默认值)- 当输出缓冲区已满时,将挂起执行,直到缓冲区清除为止。Block
保留数据,但可能会中断命令。Drop
- 当输出缓冲区已满时,将继续执行。 生成新输出时,将丢弃最早的输出。 使用Drop
值时,将输出重定向到文件。 建议对断开连接的会话使用此值。
会话配置的 OutputBufferingMode 属性确定使用会话配置的会话的默认缓冲模式。
若要查找 OutputBufferingMode 的会话配置的值,可以使用下列任一命令格式:
(Get-PSSessionConfiguration <ConfigurationName>).OutputBufferingMode
Get-PSSessionConfiguration | Format-Table Name, OutputBufferingMode
可以在会话配置中替代默认值,并在创建 PSSession、断开连接时和重新连接时设置 PSSession 的输出缓冲模式。
如果你是远程计算机上的管理员组的成员,则可以创建和更改会话配置的输出缓冲模式。
若要创建具有 Drop
输出缓冲模式的 PSSession,请创建一个 $PSSessionOption
首选项变量,其中 OutputBufferingMode 属性的值为 Drop
。
创建 PSSessions 时,$PSSessionOption
变量中的值优先于会话配置中的值。
例如:
$PSSessionOption = New-PSSessionOption -OutputBufferingMode Drop
使用 New-PSSessionOption
cmdlet 的 OutputBufferingMode 参数创建具有 Drop
值的会话选项。 然后,使用 PSSessionOption 对象作为 New-PSSession
或 Invoke-Command
cmdlet 的 SessionOption 参数的值。
创建会话时设置的值优先于 $PSSessionOption
首选项变量和会话配置中设置的值。
例如:
$o = New-PSSessionOption -OutputBufferingMode Drop
New-PSSession -SessionOption $o
若要在断开连接时更改 PSSession 的输出缓冲模式,请使用 Disconnect-PSSession
cmdlet 的 OutputBufferingMode 参数。
例如:
Disconnect-PSSession -OutputBufferingMode Drop
若要在断开连接时更改 PSSession 的输出缓冲模式,请使用 New-PSSessionOption
cmdlet 的 OutputBufferingMode 参数。 然后,在 Connect-PSSession
或 Receive-PSSession
cmdlet 的 SessionOption 参数的值中使用会话选项。
例如:
$o = New-PSSessionOption -OutputBufferingMode Drop
Connect-PSSession -ComputerName Server01 -Name Test -SessionOption $o
若要创建具有默认输出缓冲模式 Drop
的会话配置,请使用 New-PSTransportOption
cmdlet 的 OutputBufferingMode 参数创建具有 Drop
值的传输选项对象。 然后,在 Register-PSSessionConfiguration
的 TransportOption 参数的值中使用传输选项。
例如:
$o = New-PSTransportOption -OutputBufferingMode Drop
Register-PSSessionConfiguration -Name Test -TransportOption $o
若要更改会话配置的默认输出缓冲模式,请使用 New-PSTransportOption
cmdlet 的 OutputBufferingMode 参数创建具有 Drop
值的传输选项。 然后,在 Set-PSSessionConfiguration
的 SessionOption 参数的值中使用传输选项。
例如:
$o = New-PSTransportOption -OutputBufferingMode Drop
Set-PSSessionConfiguration -Name Test -TransportOption $o
断开环回会话的连接
环回会话或本地会话是在同一台计算机上发起和终止的 PSSession。 与其他 PSSession 一样,活动环回会话保留在连接(本地计算机)的远程端的计算机上,因此你可以断开连接并重新连接到环回会话。
默认情况下,使用不允许在会话中运行的命令访问其他计算机的网络安全令牌创建环回会话。 可以从本地计算机或远程计算机上的任何会话重新连接到具有网络安全令牌的环回会话。
但是,如果使用 New-PSSession
、Enter-PSSession
或 Invoke-Command
cmdlet 的 EnableNetworkAccess 参数,则会使用交互式安全令牌创建环回会话。 交互式令牌允许在环回会话中运行的命令从其他计算机获取数据。
可以使用交互式令牌断开环回会话的连接,然后从同一台计算机上的同一会话或其他会话重新连接到它们。 但是,为了防止恶意访问,只能从创建交互式令牌的计算机重新连接到环回会话。
正在等待断开连接会话中的作业
Wait-Job
cmdlet 等待作业完成,然后返回到命令提示符或下一个命令。 默认情况下,如果正在运行作业的会话断开连接,则 Wait-Job
返回。 若要指示 Wait-Job
cmdlet 等待会话重新连接,请在打开状态下使用强制参数。 有关详细信息,请参阅 Wait-Job。
可靠的会话和无意断开连接
由于计算机故障或网络中断,PSSession 可能会意外断开连接。 PowerShell 尝试恢复 PSSession,但其成功取决于原因的严重性和持续时间。
意外断开连接的 PSSession 的状态可能会断开或关闭,但它也可能断开连接。 如果状态的值为断开连接,则可以使用与有意断开会话时相同的方法来管理 PSSession。 例如,可以使用 Connect-PSSession
cmdlet 重新连接到会话,并使用 Receive-PSSession
cmdlet 获取会话断开连接时运行的命令的结果。
如果关闭(退出)在 PSSession 中运行命令时创建 PSSession 的会话,PowerShell 会在远程计算机上的断开连接状态中维护 PSSession。 如果关闭(退出)创建 PSSession 的会话,但不在 PSSession 中运行任何命令,则 PowerShell 不会尝试维护 PSSession。
另请参阅
反馈
https://aka.ms/ContentUserFeedback。
即将发布:在整个 2024 年,我们将逐步淘汰作为内容反馈机制的“GitHub 问题”,并将其取代为新的反馈系统。 有关详细信息,请参阅:提交和查看相关反馈