Disconnect-PSSession

断开与会话的连接。

语法

Disconnect-PSSession
          [-Session] <PSSession[]>
          [-IdleTimeoutSec <Int32>]
          [-OutputBufferingMode <OutputBufferingMode>]
          [-ThrottleLimit <Int32>]
          [-WhatIf]
          [-Confirm]
          [<CommonParameters>]
Disconnect-PSSession
          [-IdleTimeoutSec <Int32>]
          [-OutputBufferingMode <OutputBufferingMode>]
          [-ThrottleLimit <Int32>]
          -Name <String[]>
          [-WhatIf]
          [-Confirm]
          [<CommonParameters>]
Disconnect-PSSession
          [-IdleTimeoutSec <Int32>]
          [-OutputBufferingMode <OutputBufferingMode>]
          [-ThrottleLimit <Int32>]
          -InstanceId <Guid[]>
          [-WhatIf]
          [-Confirm]
          [<CommonParameters>]
Disconnect-PSSession
          [-IdleTimeoutSec <Int32>]
          [-OutputBufferingMode <OutputBufferingMode>]
          [-ThrottleLimit <Int32>]
          [-Id] <Int32[]>
          [-WhatIf]
          [-Confirm]
          [<CommonParameters>]

说明

此 cmdlet 仅在 Windows 平台上可用。

Disconnect-PSSession cmdlet 将 PowerShell 会话 (PSSession)(例如使用 New-PSSession cmdlet 启动的会话)与当前会话断开连接。 因此,PSSession 将处于已断开连接状态。 可以从当前会话或者本地计算机或另一台计算机上的另一个会话连接已断开的 PSSession

Disconnect-PSSession cmdlet 仅断开连接到当前会话的打开的 PSSessionDisconnect-PSSession 无法断开已损坏或关闭的 PSSession 或使用 Enter-PSSession cmdlet 启动的交互式 PSSession,也无法断开连接到其他设备的 PSSession 会话。

要重新连接到已断开连接的 PSSession,请使用 Connect-PSSessionReceive-PSSession cmdlet。

当断开与 PSSession 的连接时,PSSession 中的命令将继续运行直到完成,除非 PSSession 超时或完整输出缓冲区阻止了 PSSession 中的命令。 若要更改空闲超时,请使用 IdleTimeoutSec 参数。 要更改输出缓冲模式,请使用 OutputBufferingMode 参数。还可以使用 Invoke-Command cmdlet 的 InDisconnectedSession 参数在断开连接的会话中运行命令。

有关断开连接会话的功能的详细信息,请参阅 about_Remote_Disconnected_Sessions

此 cmdlet 是在 Windows PowerShell 3.0 中引入的。

示例

示例 1 - 按名称断开会话的连接

此命令会断开 Server01 计算机上的 UpdateSessionPSSession 与当前会话的连接。 该命令使用 Name 参数来标识 PSSession

PS> Disconnect-PSSession -Name UpdateSession
Id Name            ComputerName    State         ConfigurationName     Availability
-- ----            ------------    -----         -----------------     ------------
1  UpdateSession   Server01        Disconnected  Microsoft.PowerShell          None

输出显示断开连接的尝试已成功。 会话状态为 Disconnected可用性None,这表示会话不忙并且可以重新连接。

示例 2 - 断开与特定计算机的会话连接

此命令会断开 Server12 计算机上的 ITTaskPSSession 与当前会话的连接。 在当前会话中创建 ITTask 会话并将其连接到 Server12 计算机。 该命令使用 Get-PSSession cmdlet 获取会话,并使用 Disconnect-PSSession cmdlet 断开会话连接。

PS> Get-PSSession -ComputerName Server12 -Name ITTask |
  Disconnect-PSSession -OutputBufferingMode Drop -IdleTimeoutSec 86400
Id Name            ComputerName    State         ConfigurationName     Availability
-- ----            ------------    -----         -----------------     ------------
1  ITTask          Server12        Disconnected  ITTasks               None

Disconnect-PSSession 命令使用 OutputBufferingMode 参数将输出模式设置为 Drop。 此设置确保会话中运行的脚本可以继续运行,即使会话输出缓冲区已满也是如此。 因为该脚本将其输出写入文件共享上的报告,所以其他输出可能在不产生后果的情况下丢失。

该命令还使用 IdleTimeoutSec 参数来将会话的空闲超时扩展到 24 小时。 此设置为此管理员或其他管理员重新连接到会话,以验证脚本是否已运行和解决问题(如果需要)提供了时间。

示例 3 - 在多台计算机上使用多个 PSSession

这一系列的命令演示 Disconnect-PSSession cmdlet 在企业方案中的可能的使用方式。 在这种情况下,新的技术人员在远程计算机上的会话中启动一个脚本并遇到了问题。 该技术人员将断开到该会话的连接,以便更有经验的经理可以连接到该会话并解决该问题。

PS> $s = New-PSSession -ComputerName Srv1, Srv2, Srv30 -Name ITTask
PS> Invoke-Command $s -FilePath \\Server01\Scripts\Get-PatchStatus.ps1
PS> Get-PSSession -Name ITTask -ComputerName Srv1 | Disconnect-PSSession
Id Name            ComputerName    State         ConfigurationName     Availability
-- ----            ------------    -----         -----------------     ------------
1 ITTask           Srv1            Disconnected  Microsoft.PowerShell          None

PS> Get-PSSession -ComputerName Srv1, Srv2, Srv30 -Name ITTask
Id Name            ComputerName    State         ConfigurationName     Availability
-- ----            ------------    -----         -----------------     ------------
 1 ITTask          Srv1            Disconnected  Microsoft.PowerShell          None
 2 ITTask          Srv2            Opened        Microsoft.PowerShell     Available
 3 ITTask          Srv30           Opened        Microsoft.PowerShell     Available

PS> Get-PSSession -ComputerName Srv1 -Name ITTask -Credential Domain01\User01
Id Name            ComputerName    State         ConfigurationName     Availability
-- ----            ------------    -----         -----------------     ------------
 1 ITTask          Srv1            Disconnected  Microsoft.PowerShell          None

PS> $s = Connect-PSSession -ComputerName Srv1 -Name ITTask -Credential Domain01\User01
PS> Invoke-Command -Session $s {dir $HOME\Scripts\PatchStatusOutput.ps1}
PS> Invoke-Command -Session $s {mkdir $HOME\Scripts\PatchStatusOutput}
PS> Invoke-Command -Session $s -FilePath \\Server01\Scripts\Get-PatchStatus.ps1
PS> Disconnect-PSSession -Session $s

该技术人员首先在多台远程计算机上创建会话并在每个会话中运行脚本。 第一个命令使用 New-PSSession cmdlet 在三台远程计算机上创建 ITTask 会话。 该命令将会话保存在 $s 变量中。 第二个命令使用 Invoke-Command cmdlet 的 FilePath 参数在 $s 变量的会话中运行脚本。

在 Srv1 计算机上运行的脚本生成了意外的错误。 技术人员联系经理并请求协助。 经理指示技术人员断开与会话的连接,以便他可以进行调查。第二个命令使用 Get-PSSession cmdlet 获取 Srv1 计算机上的 ITTask 会话,并使用 Disconnect-PSSession cmdlet 断开连接。 此命令不影响其他计算机上的 ITTask 会话。

第三个命令使用 Get-PSSession cmdlet 获取 ITTask 会话。 输出显示 Srv2 和 Srv30 计算机上的 ITTask 会话并未受用于断开连接的命令的影响。

经理登录到他的家庭计算机,连接到公司网络,启动 PowerShell,并使用 Get-PSSession cmdlet 获取 Srv1 计算机上的 ITTask 会话。 他使用技术人员的凭据来访问该会话。

接下来,经理使用 Connect-PSSession cmdlet 连接到 Srv1 计算机上的 ITTask 会话。 该命令将该会话保存在 $s 变量中。

经理使用 Invoke-Command cmdlet 在会话中的 $s 变量中运行一些诊断命令。 他认识到脚本失败是因为脚本找不到所需目录。 该经理使用 MkDir 函数创建目录,然后重新启动 Get-PatchStatus.ps1 脚本并断开到会话的连接。该经理向技术人员报告其发现,建议他重新连接会话以完成任务,并要求他将命令添加到创建所需目录(如果不存在)的 Get-PatchStatus.ps1 脚本。

示例 4 - 更改 PSSession 的超时值

此示例演示如何更正会话的 IdleTimeout 属性的值,以便可以断开到它的连接。

会话的空闲超时属性对已断开连接的会话至关重要,因为它将确定在删除已断开连接的会话之前维护该会话多长时间。 当你创建会话以及断开到它的连接时,可以设置空闲超时选项。 将在本地计算机上的 $PSSessionOption 首选项变量,以及远程计算机上的会话配置中设置会话的空闲超时默认值。 为会话设置的值优先于在会话配置中设置的值,但会话值不能超过会话配置中的配额设置,如 MaxIdleTimeoutMs 值。

PS> $Timeout = New-PSSessionOption -IdleTimeout 172800000
PS> $s = New-PSSession -Computer Server01 -Name ITTask -SessionOption $Timeout
PS> Disconnect-PSSession -Session $s
Disconnect-PSSession : The session ITTask cannot be disconnected because the specified
idle timeout value 172800(seconds) is either greater than the server maximum allowed
43200 (seconds) or less that the minimum allowed60(seconds).  Choose an idle time out
value that is within the allowed range and try again.

PS> Invoke-Command -ComputerName Server01 {Get-PSSessionConfiguration Microsoft.PowerShell} |
 Format-List -Property *

Architecture                  : 64
Filename                      : %windir%\system32\pwrshplugin.dll
ResourceUri                   : http://schemas.microsoft.com/powershell/microsoft.powershell
MaxConcurrentCommandsPerShell : 1000
UseSharedProcess              : false
ProcessIdleTimeoutSec         : 0
xmlns                         : http://schemas.microsoft.com/wbem/wsman/1/config/PluginConfiguration
MaxConcurrentUsers            : 5
lang                          : en-US
SupportsOptions               : true
ExactMatch                    : true
RunAsUser                     :
IdleTimeoutms                 : 7200000
PSVersion                     : 3.0
OutputBufferingMode           : Block
AutoRestart                   : false
SecurityDescriptorSddl        : O:NSG:BAD:P(A;;GA;;;BA)S:P(AU;FA;GA;;;WD)(AU;SA;GXGW;;;WD)
MaxMemoryPerShellMB           : 1024
MaxIdleTimeoutms              : 2147483647
Uri                           : http://schemas.microsoft.com/powershell/microsoft.powershell
SDKVersion                    : 2
Name                          : microsoft.powershell
XmlRenderingType              : text
Capability                    : {Shell}
RunAsPassword                 :
MaxProcessesPerShell          : 15
ParentResourceUri             : http://schemas.microsoft.com/powershell/microsoft.powershell
Enabled                       : true
MaxShells                     : 25
MaxShellsPerUser              : 25
Permission                    : BUILTIN\Administrators AccessAllowed
PSComputerName                : localhost
RunspaceId                    : aea84310-6dbf-4c21-90ac-13980039925a
PSShowComputerName            : True


PS> $s.Runspace.ConnectionInfo
ConnectionUri                     : http://Server01/wsman
ComputerName                      : Server01
Scheme                            : http
Port                              : 80
AppName                           : /wsman
Credential                        :
ShellUri                          : http://schemas.microsoft.com/powershell/Microsoft.PowerShell
AuthenticationMechanism           : Default
CertificateThumbprint             :
MaximumConnectionRedirectionCount : 5
MaximumReceivedDataSizePerCommand :
MaximumReceivedObjectSize         : 209715200
UseCompression                    : True
NoMachineProfile                  : False
ProxyAccessType                   : None
ProxyAuthentication               : Negotiate
ProxyCredential                   :
SkipCACheck                       : False
SkipCNCheck                       : False
SkipRevocationCheck               : False
NoEncryption                      : False
UseUTF16                          : False
OutputBufferingMode               : Drop
IncludePortInSPN                  : False
Culture                           : en-US
UICulture                         : en-US
OpenTimeout                       : 180000
CancelTimeout                     : 60000
OperationTimeout                  : 180000
IdleTimeout                       : 172800000

PS> Disconnect-PSSession $s -IdleTimeoutSec 43200
Id Name            ComputerName    State         ConfigurationName     Availability
-- ----            ------------    -----         -----------------     ------------
 4 ITTask          Server01        Disconnected  Microsoft.PowerShell          None

PS> $s.Runspace.ConnectionInfo.IdleTimeout
43200000

第一个命令使用 New-PSSessionOption cmdlet 创建会话选项对象。 它使用 IdleTimeout 参数将空闲超时设置为 48 小时(172800000 毫秒)。 该命令将会话选项对象保存在 $Timeout 变量中。

第二个命令使用 New-PSSession cmdlet 在 Server01 计算机上创建 ITTask 会话。 该命令将该会话保存在 $s 变量中。 SessionOption 参数的值是 $Timeout 变量中的 48 小时空闲超时。

第三个命令断开 $s 变量中的 ITTask 会话。 该命令失败是因为会话的空闲超时值超出会话配置中的 MaxIdleTimeoutMs 配额。 由于断开此会话之前未使用空闲超时,因此当会话在使用中时可能检测不到此超额行为。

第四个命令使用 Invoke-Command cmdlet 为 Server01 计算机上的 Microsoft.PowerShell 会话配置运行 Get-PSSessionConfiguration 命令。 该命令使用 Format-List cmdlet 在列表中显示会话配置的所有属性。输出显示 MaxIdleTimeoutMS 属性,该属性为会话建立允许的最大 IdleTimeout 值 使用会话配置,为 43200000 毫秒(12 小时)。

第五个命令将获取 $s 变量中的会话的会话选项值。 许多会话选项的值是会话的 Runspace 属性的 ConnectionInfo 属性的属性。输出显示,会话的 IdleTimeout 属性的值为 172800000 毫秒(48 小时),这违反了会话配置中 12 小时的 MaxIdleTimeoutMs 配额。要解决此冲突,可以使用 ConfigurationName 参数来选择不同的会话配置或使用 IdleTimeout 参数来减少会话的空闲超时。

第六个命令将断开到会话的连接。 该命令使用 IdleTimeoutSec 参数将最大空闲超时设置为 12 小时。

第七个命令将获取已断开连接的会话的 IdleTimeout 属性的值(以毫秒为单位)。 输出确认命令已成功。

参数

-Confirm

提示你在运行 cmdlet 之前进行确认。

Type:SwitchParameter
Aliases:cf
Position:Named
Default value:False
Required:False
Accept pipeline input:False
Accept wildcard characters:False

-Id

断开与具有指定会话 ID 的会话的连接。 键入一个或多个 ID,用逗号分隔,或使用范围运算符 (..) 指定一系列 ID。

若要获取某个会话的 ID,请使用 Get-PSSession cmdlet。 将实例 ID 存储在会话的 ID 属性中。

Type:Int32[]
Position:1
Default value:None
Required:True
Accept pipeline input:True
Accept wildcard characters:False

-IdleTimeoutSec

更改已断开连接的 PSSession 的空闲超时值。 输入一个值(以秒为单位)。 最小值为 60(1 分钟)。

空闲超时确定已断开连接的 PSSession 在远程计算机上保留多长时间。 当超时到期时,将删除 PSSession

从已断开连接的 PSSession 断开连接那一刻起,就将其视为空闲,即使命令是在已断开连接的会话中运行也是如此。

会话的空闲超时默认值由会话配置的 IdleTimeoutMs 属性的值设置。 默认值为 7200000 毫秒(2 小时)。

此参数的值优先于 $PSSessionOption 首选项变量的 IdleTimeout 属性的值和会话配置中的默认空闲超时值。 但是,此值不能超过会话配置的 MaxIdleTimeoutMs 属性的值。 MaxIdleTimeoutMs 的默认值为 12 小时(43200000 毫秒)。

Type:Int32
Position:Named
Default value:60
Required:False
Accept pipeline input:False
Accept wildcard characters:False

-InstanceId

断开与具有指定实例 ID 的会话的连接。

实例 ID 是一个 GUID,用于在本地或远程计算机上唯一标识某个会话。 实例 ID 是唯一的,即使在多台计算机上跨多个会话也是如此。

若要获取某个会话的实例 ID,请使用 Get-PSSession cmdlet。 实例 ID 存储在会话的 InstanceID 属性中。

Type:Guid[]
Position:Named
Default value:None
Required:True
Accept pipeline input:True
Accept wildcard characters:False

-Name

断开与具有指定友好名称的会话的连接。 允许使用通配符。

若要获取会话的易记名称,请使用 Get-PSSession cmdlet。 友好名称存储在会话的 Name 属性中。

Type:String[]
Position:Named
Default value:None
Required:True
Accept pipeline input:True
Accept wildcard characters:True

-OutputBufferingMode

确定输出缓冲区已满时如何在已断开连接的会话中管理命令输出。 默认值为 Block

如果已断开连接的会话中的命令返回输出时输出缓冲区已满,则此参数的值将有效地确定当会话已断开连接时该命令是否继续运行。 值 Block 将挂起命令,直到重新连接会话。 值 Drop 允许命令完成,但是可能会丢失数据。 当使用 Drop 值时,请将命令输出重定向到磁盘上的文件。

有效值为:

  • Block:当输出缓冲区已满时,将挂起执行,直到清除此缓冲区。
  • Drop:当输出缓冲区已满时,执行将继续。 由于已保存新的输出,因此将丢弃最早的输出。
  • None:未指定任何输出缓冲模式。 会话配置的 OutputBufferingMode 属性的值用于已断开连接的会话。
Type:OutputBufferingMode
Position:Named
Default value:Block
Required:False
Accept pipeline input:False
Accept wildcard characters:False

-Session

断开与指定的 PSSession 的连接。 输入 PSSession 对象,例如 New-PSSession cmdlet 返回的对象。 也可以将 PSSession 对象通过管道传递给 Disconnect-PSSession

Get-PSSession 可以获取终止于远程计算机的所有 PSSession,包括已断开连接的 PSSession 和与其他计算机上的其他会话连接的 PSSessionDisconnect-PSSession 仅断开与已连接到当前会话的 PSSession 的连接。 如果通过管道将其他 PSSessions 传递给 Disconnect-PSSession,则 Disconnect-PSSession 命令将失败。

Type:PSSession[]
Position:1
Default value:None
Required:True
Accept pipeline input:True
Accept wildcard characters:False

-ThrottleLimit

设置 Disconnect-PSSession 命令的限制。

中止值为运行此命令可建立的并发连接的最大数目。 如果省略此参数或输入 0 值,则使用默认值 32

节流限制仅适用于当前命令,而不适用于会话或计算机。

Type:Int32
Position:Named
Default value:32
Required:False
Accept pipeline input:False
Accept wildcard characters:False

-WhatIf

显示运行该 cmdlet 时会发生什么情况。 cmdlet 未运行。

Type:SwitchParameter
Aliases:wi
Position:Named
Default value:False
Required:False
Accept pipeline input:False
Accept wildcard characters:False

输入

PSSession

可以将会话通过管道传递给此 cmdlet。

输出

PSSession

此 cmdlet 会返回一个表示它断开连接的会话的对象。

备注

PowerShell 包含以下 Disconnect-PSSession 别名:

  • Windows:
    • dnsn

此 cmdlet 仅在 Windows 平台上可用。

  • 仅当本地和远程计算机运行 PowerShell 3.0 或更高版本时,Disconnect-PSSession cmdlet 才有效。

  • 如果对已断开连接的会话使用 Disconnect-PSSession cmdlet,则该命令不会对会话产生任何影响,也不会生成错误。

  • 对于具有交互式安全令牌(使用 EnableNetworkAccess 参数创建的安全令牌)的已断开连接的环回会话,只可以从创建该会话的计算机上重新连接该会话。 此限制可使计算机免遭恶意访问。

  • 断开 PSSession 的连接时,会话状态为 Disconnected,可用性为 None

    State 属性的值相对于当前会话。 因此,值 Disconnected 表示 PSSession 未连接到当前会话。 但是,它并不意味着 PSSession 会与所有会话断开连接。 它可能连接到另一个会话。 若要确定是否可以连接或重新连接到该会话,请使用 Disconnected 属性。

    可用性的值为 None,表示可连接会话。 值 Busy 表述无法连接 PSSession,因为它已连接另一个会话。

    有关会话 State 属性的值的详细信息,请参阅 RunspaceState 枚举

    有关会话 Availability 属性的值的详细信息,请参阅 RunspaceState 枚举