關於遠端中斷連線的會話
簡短描述
說明如何中斷連線並重新連線到 PowerShell 會話 (PSSession) 。
完整描述
從 PowerShell 3.0 開始,您可以從 PSSession 中斷連線,並重新連線到相同電腦或不同電腦上的 PSSession。 會話狀態會維持,而且 PSSession 中的命令會在會話中斷聯機時繼續執行。
只有在遠端電腦執行 PowerShell 3.0 或更新版本時,才能使用已中斷連線的會話功能。
已中斷連線的會話功能可讓您關閉 PSSession 建立所在的會話,甚至關閉 PowerShell,並關閉電腦,而不會中斷 PSSession 中執行的命令。 中斷連線的會話適用於執行需要較長時間才能完成的命令,並提供 IT 專業人員所需的時間和裝置彈性。
您無法中斷與使用 Enter-PSSession
Cmdlet 啟動的互動式作業階段連線。
您可以使用已中斷連線的工作階段來管理因為電腦或網路中斷而意外中斷的 PSSession。
在真實世界使用中,「已中斷連線的會話」功能可讓您開始解決問題、將注意力轉向優先順序較高的問題,然後在解決方案上繼續工作,即使是在不同位置的不同計算機上也一樣。
已中斷連線的會話 Cmdlet
下列 Cmdlet 支援已中斷連線的工作階段功能:
Connect-PSSession
:連線到已中斷連線的 PSSession。Disconnect-PSSession
:中斷 PSSession 的連線。Get-PSSession
:取得本機計算機或遠端電腦上的 PSSession。Receive-PSSession
:取得在中斷聯機會話中執行的命令結果。Invoke-Command
: InDisconnectedSession 參數會立即建立 PSSession 並中斷連線。
中斷聯機會話功能的運作方式
從 PowerShell 3.0 開始,PSSession 與建立它們的會話無關。 即使建立 PSSession 的工作階段已關閉,而且原始電腦已關閉或中斷與網路連線,作用中的 PSSession 仍會在連線的遠端電腦或 伺服器端 維護。
在 PowerShell 2.0 中,當 PSSession 與原始工作階段中斷連線或建立所在的工作階段結束時,會從遠端電腦中刪除。
當您中斷 PSSession 的連線時,PSSession 會保持作用中狀態,並且會保留在遠端電腦上。 會話狀態會從 [ 執行 ] 變更為 [已中斷連線]。 您可以從目前的會話,或從同一部計算機上的不同會話,或從不同的計算機重新連線到中斷連線的 PSSession。 維護會話的遠端電腦必須執行並連線到網路。
中斷連線 PSSession 中的命令會繼續在遠端電腦上執行,直到命令完成或輸出緩衝區填滿為止。 若要防止完整輸出緩衝區暫停命令,請使用 、 New-PSSessionOption
或 New-PSTransportOption
Cmdlet 的 Disconnect-PSSession
OutputBufferingMode 參數。
已中斷連線的會話會維持在遠端電腦上的已中斷連線狀態。 它們可供您重新連線,直到您刪除 PSSession,例如使用 Remove-PSSession
Cmdlet,或直到 PSSession 的閒置逾時到期為止。 您可以使用 、 New-PSSessionOption
或 New-PSTransportOption
Cmdlet 的 IdleTimeoutSec 或 IdleTimeout 參數來調整 PSSession 的Disconnect-PSSession
閒置逾時。
另一個使用者可以連線到您所建立的 PSSession,但只有在他們可以提供用來建立會話的認證,或使用 RunAs
會話組態的認證時。
如何取得 PSSessions
從 PowerShell 3.0 開始, Get-PSSession
Cmdlet 會在本機電腦和遠端電腦上取得 PSSession。 它也可以取得在目前會話中建立的 PSSession。
若要在本機計算機或遠端電腦上取得 PSSessions,請使用 ComputerName 或 ConnectionUri 參數。 如果沒有參數, Get-PSSession
則取得在本機會話中建立的 PSSession,不論它們終止的位置為何。
取得 PSSessions 時,請記得在維護的電腦上尋找它們,也就是遠端或 伺服器端 電腦。
例如,如果您建立 Server01 計算機的 PSSession,請從 Server01 計算機取得會話。 如果您從另一部計算機建立 PSSession 到本機電腦,請從本機計算機取得會話。
下列命令順序顯示運作方式 Get-PSSession
。
第一個命令會建立 Server01 計算機的會話。 會話位於 Server01 計算機上。
New-PSSession -ComputerName Server01
Id Name ComputerName State ConfigurationName Availability
-- ---- ------------ ----- ----------------- ------------
2 Session2 Server01 Opened Microsoft.PowerShell Available
若要取得會話,請使用 的 ComputerName 參數 Get-PSSession
搭配 Server01 值。
Get-PSSession -ComputerName Server01
Id Name ComputerName State ConfigurationName Availability
-- ---- ------------ ----- ----------------- ------------
2 Session2 Server01 Opened Microsoft.PowerShell Available
如果 的 ComputerName 參數 Get-PSSession
值為 localhost, Get-PSSession
取得在 本機計算機上終止並維護的 PSSession。 即使已在本機計算機上啟動 PSSession,它也不會在 Server01 計算機上取得 PSSession。
Get-PSSession -ComputerName localhost
若要取得在目前會話中建立的會話,請使用不含參數的 Get-PSSession
Cmdlet。 在此範例中, Get-PSSession
取得在目前會話中建立的 PSSession,並聯機到 Server01 計算機。
Get-PSSession
Id Name ComputerName State ConfigurationName Availability
-- ---- ------------ ----- ----------------- ------------
2 Session2 Server01 Opened Microsoft.PowerShell Available
如何中斷會話連線
若要中斷 PSSession 的連線,請使用 Disconnect-PSSession
Cmdlet。 若要識別 PSSession,請使用 Session 參數,或從 New-PSSession
或 Get-PSSession
Cmdlet 管線 PSSession 至 Disconnect-PSSession
。
下列命令會將 PSSession 中斷連線到 Server01 計算機。 請注意, State 屬性的值是 Disconnected , 可用性 是 None。
Get-PSSession -ComputerName Server01 | Disconnect-PSSession
Id Name ComputerName State ConfigurationName Availability
-- ---- ------------ ----- ----------------- ------------
2 Session2 Server01 Disconnected Microsoft.PowerShell None
若要建立已中斷連線的會話,請使用 Cmdlet 的 Invoke-Command
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
如何連線到已中斷連線的會話
您可以從建立 PSSession 的工作階段,或從本機電腦或其他電腦上的其他會話連線到任何可用的中斷連線 PSSession。
您可以建立 PSSession、在 PSSession 中執行命令、中斷與 PSSession 的連線、關閉 PowerShell,以及關閉電腦。 之後,您可以開啟不同的計算機、取得 PSSession、與其連線,以及取得在 PSSession 中執行命令的結果,同時中斷連線。 然後,您可以在會話中執行更多命令。
若要連線中斷連線的 PSSession,請使用 Connect-PSSession
Cmdlet。 使用 ComputerName 或 ConnectionUri 參數來識別 PSSession,或從 Get-PSSession
Connect-PSSession
到 的 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 參數來選取 [作業 ] 或 [ 主機]。 預設值為 Host。 不過,如果接收的命令是以 作業的形式在目前會話中啟動,則預設會傳回為 Job 。
下列命令會 Receive-PSSession
使用 Cmdlet 連線到 Server02 電腦上的 PSSession,並取得在 Session3 會話中執行的命令結果 Get-WinEvent
。 此命令會使用 OutTarget 參數來取得 Job 的結果。
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 狀態為 [已中斷 連線],其可用性為 [無]。
State 屬性的值是相對於目前工作階段。 [ 已中斷連線 ] 的值表示 PSSession 未連線到目前的會話。 但是,這並不表示 PSSession 已中斷與所有會話的連線。 它可能連線不同的工作階段。
若要判斷您是否可以連線或重新連線到 PSSession,請使用 Availability 屬性。 [ 無 ] 值表示您可以連線到會話。 [忙碌] 的值表示您無法連線到 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
# Idle Timeout
已中斷連線的會話會保留在遠端電腦上,直到您刪除它們為止,例如使用 Remove-PSSession
Cmdlet 或逾時。PSSession 的 IdleTimeout 屬性會決定中斷聯機的會話在刪除之前所維護的時間長度。
當 活動訊號線程 收到沒有回應時,PSSession 會閑置。 中斷會話聯機會讓會話處於閑置狀態,並啟動 IdleTimeout 時鐘,即使命令仍在中斷連線的會話中執行也一樣。 PowerShell 會將已中斷連線的會話視為作用中,但閑置。
建立和中斷聯機會話時,請確認 PSSession 中的閑置逾時夠長,足以維護您所需的會話,但不會太長,因為它會耗用遠端電腦上的不必要的資源。
會話組態的 IdleTimeoutMs 屬性會決定使用會話組態之會話的預設閒置逾時。 您可以覆寫預設值,但您所使用的值不能超過會話組態的 MaxIdleTimeoutMs 屬性。
若要尋找會話組態的 IdleTimeoutMs 和 MaxIdleTimeoutMs 值的值,請使用下列命令格式。
Get-PSSessionConfiguration |
Format-Table Name, IdleTimeoutMs, MaxIdleTimeoutMs
您可以在會話組態中覆寫預設值,並在建立 PSSession 和中斷連線時設定 PSSession 的閑置逾時。
如果您是遠端電腦上的 Administrators 群組成員,您可以建立和變更會話組態的 IdleTimeoutMs 和 MaxIdleTimeoutMs 屬性。
閑置逾時值
會話組態和會話選項的閑置逾時值以毫秒為單位。 工作階段和工作階段組態選項的閒置逾時值為秒。
當您建立 PSSession (New-PSSession
時,您可以設定 PSSession 的閒置逾時, Invoke-Command
) 和中斷連線 () Disconnect-PSSession
。 不過,當您連線到 PSSession () Connect-PSSession
或取得結果時,您無法變更 IdleTimeout 值 (Receive-PSSession
) 。
和 Cmdlet 具有採用 SessionOption 物件的 SessionOption 參數,例如 Cmdlet 所傳回的物件New-PSSessionOption
。Receive-PSSession
Connect-PSSession
SessionOption 物件中的 IdleTimeout 值和喜好設定變數中的 IdleTimeout 值$PSSessionOption
不會變更 或 Receive-PSSession
命令中 Connect-PSSession
PSSession 的 IdleTimeout 值。
若要建立具有特定閑置逾時值的 PSSession,請建立 $PSSessionOption
喜好設定變數。 將 IdleTimeout 屬性的值設定為所需值,以毫秒為單位) (。
當您建立 PSSessions 時,變數中的 $PSSessionOption
值會優先於會話組態中的值。
例如,下列命令會設定閑置逾時 48 小時:
$PSSessionOption = New-PSSessionOption -IdleTimeoutMSec 172800000
若要建立具有特定閑置逾時值的 PSSession,請使用 Cmdlet 的 New-PSSessionOption
IdleTimeoutMSec 參數。 然後,在 或 Invoke-Command
Cmdlet 的 SessionOption 參數New-PSSession
值中使用會話選項。
建立工作階段時所設定的值優先於喜好設定變數和工作階段組態中 $PSSessionOption
設定的值。
例如:
$o = New-PSSessionOption -IdleTimeoutMSec 172800000
New-PSSession -SessionOption $o
若要在中斷連線時變更 PSSession 的閒置逾時,請使用 Cmdlet 的 Disconnect-PSSession
IdleTimeoutSec 參數。
例如:
Disconnect-PSSession -IdleTimeoutSec 172800
若要建立具有特定閑置逾時和最大閑置逾時的會話組態,請使用 Cmdlet 的 New-PSTransportOption
IdleTimeoutSec 和 MaxIdleTimeoutSec 參數。 然後,在的 Register-PSSessionConfiguration
TransportOption 參數值中使用傳輸選項。
例如:
$o = New-PSTransportOption -IdleTimeoutSec 172800 -MaxIdleTimeoutSec 259200
Register-PSSessionConfiguration -Name Test -TransportOption $o
若要變更會話組態的默認閑置逾時和最大閑置逾時,請使用 Cmdlet 的 New-PSTransportOption
IdleTimeoutSec 和 MaxIdleTimeoutSec 參數。 然後,在的 Set-PSSessionConfiguration
TransportOption 參數值中使用傳輸選項。
例如:
$o = New-PSTransportOption -IdleTimeoutSec 172800 -MaxIdleTimeoutSec 259200
Set-PSSessionConfiguration -Name Test -TransportOption $o
輸出緩衝模式
PSSession 的輸出緩衝模式會決定當 PSSession 的輸出緩衝區已滿時,命令輸出的管理方式。
在中斷連線的會話中,輸出緩衝模式會有效地判斷命令是否在會話中斷連線時繼續執行。
有效值,如下所示:
- 封鎖。 當輸出緩衝區已滿時,會暫停執行直到清除緩衝區為止。 預設值。
- 卸除: 當輸出緩衝區已滿時,會繼續執行。 產生新的輸出時,會捨棄最舊的輸出。
[封鎖 ] 會保留數據,但可能會中斷命令。 Drop 值允許命令完成,但可能會遺失資料。 使用 Drop 值時,請將命令輸出重新導向至磁碟上的檔案。 建議針對已中斷連線的會話使用此值。
會話組態的 OutputBufferingMode 屬性會決定使用工作階段組態之工作階段的預設輸出緩衝模式。
若要尋找 OutputBufferingMode 的工作階段組態值,您可以使用下列其中一種命令格式:
(Get-PSSessionConfiguration <ConfigurationName>).OutputBufferingMode
Get-PSSessionConfiguration | Format-Table Name, OutputBufferingMode
您可以在會話組態中覆寫預設值,並在建立 PSSession、中斷連線時,以及重新連線時設定 PSSession 的輸出緩衝模式。
如果您是遠端電腦上的 Administrators 群組成員,您可以建立和變更工作階段設定的輸出緩衝模式。
若要使用 Drop的輸出緩衝模式建立 PSSession,請建立 $PSSessionOption
喜好設定變數,其中 OutputBufferingMode 屬性的值是 Drop。
當您建立 PSSessions 時,變數中的 $PSSessionOption
值會優先於會話組態中的值。
例如:
$PSSessionOption = New-PSSessionOption -OutputBufferingMode Drop
若要使用Drop的輸出緩衝模式建立 PSSession,請使用 Cmdlet 的 New-PSSessionOption
OutputBufferingMode 參數來建立具有 Drop 值的會話選項。 然後,在 或 Invoke-Command
Cmdlet 的 SessionOption 參數New-PSSession
值中使用會話選項。
建立工作階段時所設定的值優先於喜好設定變數和工作階段組態中 $PSSessionOption
設定的值。
例如:
$o = New-PSSessionOption -OutputBufferingMode Drop
New-PSSession -SessionOption $o
若要在中斷連線時變更 PSSession 的輸出緩衝模式,請使用 Cmdlet 的 Disconnect-PSSession
OutputBufferingMode 參數。
例如:
Disconnect-PSSession -OutputBufferingMode Drop
若要在重新連線時變更 PSSession 的輸出緩衝模式,請使用 Cmdlet 的 New-PSSessionOption
OutputBufferingMode 參數來建立具有 Drop 值的會話選項。 然後,在 或Receive-PSSession
的 SessionOption 參數Connect-PSSession
值中使用會話選項。
例如:
$o = New-PSSessionOption -OutputBufferingMode Drop
Connect-PSSession -ComputerName Server01 -Name Test -SessionOption $o
若要建立具有Drop預設輸出緩衝模式的會話組態,請使用 Cmdlet 的 New-PSTransportOption
OutputBufferingMode 參數,建立具有Drop值的傳輸選項物件。 然後,在的 Register-PSSessionConfiguration
TransportOption 參數值中使用傳輸選項。
例如:
$o = New-PSTransportOption -OutputBufferingMode Drop
Register-PSSessionConfiguration -Name Test -TransportOption $o
若要變更會話組態的默認輸出緩衝模式,請使用 Cmdlet 的 New-PSTransportOption
OutputBufferingMode 參數來建立具有 Drop 值的傳輸選項。 然後,在的 SessionOption 參數 Set-PSSessionConfiguration
值中使用 Transport 選項。
例如:
$o = New-PSTransportOption -OutputBufferingMode Drop
Set-PSSessionConfiguration -Name Test -TransportOption $o
中斷回送會話的連線
回送會話或本機會話是源自於同一部電腦上的 PSSession。 與其他 PSSession 一樣,使用中的回送會話會在連線的遠端端維護, (本機電腦) ,因此您可以中斷連線並重新連線到回送會話。
根據預設,會使用不允許在會話中執行命令的網路安全性令牌來建立回送會話,以存取其他計算機。 您可以從本機電腦或遠端電腦上的任何會話,重新連線到具有網路安全性令牌的回送會話。
不過,如果您使用 、 Enter-PSSession
或 Invoke-Command
Cmdlet 的 New-PSSession
EnableNetworkAccess 參數,則會使用互動式安全性令牌來建立回送會話。 互動式令牌可讓在回送會話中執行的命令,以從其他計算機取得數據。
您可以使用互動式令牌中斷回送會話的連線,然後從相同會話或相同電腦上的不同會話重新連線。 不過,若要防止惡意存取,您只能從建立互動式令牌的計算機,重新連線到具有互動式令牌的回送會話。
等候中斷聯機會話中的作業
Cmdlet Wait-Job
會等候作業完成,然後返回命令提示字元或下一個命令。 根據預設,如果正在執行作業的工作階段已中斷連線, Wait-Job
則傳回 。 若要指示 Wait-Job
Cmdlet 等到會話重新連線後,請以 Opened 狀態使用 Force 參數。 如需詳細資訊,請參閱 Wait-Job。
強固的會話和意外中斷連線
PSSession 可能會因為電腦失敗或網路中斷而意外中斷。 PowerShell 嘗試復原 PSSession,但其成功取決於原因的嚴重性和持續時間。
意外中斷的 PSSession 狀態可能是 中斷 或 已關閉,但也可能是 [已中斷]。 如果 State 的值是 [已中斷連線],您可以使用相同的技術來管理 PSSession,就像會話刻意中斷連線時一樣。 例如,您可以使用 Connect-PSSession
Cmdlet 重新連線到工作階段,而 Receive-PSSession
Cmdlet 可取得作業階段中斷連線時所執行的命令結果。
如果您關閉 (結束) 在命令在 PSSession 中執行命令時建立 PSSession 的會話,PowerShell 會維持遠端電腦上已 中斷 連線狀態的 PSSession。 如果您關閉 (結束) 建立 PSSession 的會話,但 PSSession 中沒有執行任何命令,PowerShell 不會嘗試維護 PSSession。