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

cmdlet 仅断开连接到当前会话的 PSSessions 打开 Disconnect-PSSession 无法断开或关闭 PSSessions,或者使用 Enter-PSSession cmdlet 启动的交互式 PSSessions 断开连接,并且无法断开连接到其他会话 PSSessions 的连接。

若要重新连接到断开连接 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 属性,该属性为使用会话配置的会话建立允许的最大 IdleTimeout43200000 毫秒(12 小时)。

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

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

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

参数

-Confirm

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

类型:SwitchParameter
别名:cf
Position:Named
默认值:False
必需:False
接受管道输入:False
接受通配符:False

-Id

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

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

类型:Int32[]
Position:1
默认值:None
必需:True
接受管道输入:True
接受通配符:False

-IdleTimeoutSec

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

空闲超时确定在远程计算机上维护断开连接 PSSession 多长时间。 超时到期后,将删除 PSSession

断开连接 PSSessions 被视为从断开连接的那一刻起处于空闲状态,即使命令在断开连接的会话中运行也是如此。

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

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

类型:Int32
Position:Named
默认值:60
必需:False
接受管道输入:False
接受通配符:False

-InstanceId

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

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

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

类型:Guid[]
Position:Named
默认值:None
必需:True
接受管道输入:True
接受通配符:False

-Name

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

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

类型:String[]
Position:Named
默认值:None
必需:True
接受管道输入:True
接受通配符:True

-OutputBufferingMode

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

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

有效值为:

  • Block:当输出缓冲区已满时,将挂起执行,直到缓冲区清除为止。
  • Drop:当输出缓冲区已满时,将继续执行。 保存新输出后,将丢弃最早的输出。
  • None:未指定输出缓冲模式。 会话配置的 OutputBufferingMode 属性的值用于断开连接的会话。
类型:OutputBufferingMode
Position:Named
默认值:Block
必需:False
接受管道输入:False
接受通配符:False

-Session

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

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

类型:PSSession[]
Position:1
默认值:None
必需:True
接受管道输入:True
接受通配符:False

-ThrottleLimit

设置 Disconnect-PSSession 命令的限制。

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

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

类型:Int32
Position:Named
默认值:32
必需:False
接受管道输入:False
接受通配符:False

-WhatIf

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

类型:SwitchParameter
别名:wi
Position:Named
默认值:False
必需:False
接受管道输入:False
接受通配符:False

输入

PSSession

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

输出

PSSession

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

备注

PowerShell 包含以下 Disconnect-PSSession别名:

  • 窗户:
    • dnsn

此 cmdlet 仅在 Windows 平台上可用。

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

  • 如果在断开连接的会话上使用 Disconnect-PSSession cmdlet,该命令对会话没有影响,并且不会生成错误。

  • 具有交互式安全令牌的断开连接环回会话(使用 EnableNetworkAccess 参数创建的会话)只能从创建会话的计算机重新连接。 此限制可保护计算机免受恶意访问。

  • 断开 PSSession时,会话状态为 Disconnected,可用性

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

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

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

    有关会话 可用性 属性的值的详细信息,请参阅 RunspaceAvailability 枚举