簡単な説明
PowerShell セッション (PSSession) を切断して再接続する方法について説明します。
長い説明
PowerShell 3.0 以降では、PSSession から切断し、同じコンピューターまたは別のコンピューターから PSSession に再接続できます。 セッションの状態は維持され、セッションが切断されている間も PSSession 内のコマンドは引き続き実行されます。
切断されたセッション機能を使用すると、PSSession が作成されたセッションを閉じ、リモート PSSession で実行されているコマンドを中断せずにコンピューターをシャットダウンできます。 切断されたセッションは、完了に時間がかかるコマンドを実行する場合に便利です。
Enter-PSSession コマンドレットを使用して開始された対話型セッションから切断することはできません。
切断されたセッションを使用して、コンピューターまたはネットワークの停止の結果として意図せずに切断された PSSession を管理できます。
切断されたセッション コマンドレット
次のコマンドレットは、切断されたセッション機能をサポートしています。
-
Connect-PSSession: 切断された PSSession に接続します。 -
Disconnect-PSSession: PSSession を切断します。 -
Get-PSSession: ローカル コンピューターまたはリモート コンピューター上の PSSession を取得します。 -
Receive-PSSession: 切断されたセッションで実行されたコマンドの結果を取得します。 -
Invoke-Command: InDisconnectedSession パラメーターは PSSession を作成し、直ちに切断します。
切断されたセッション機能のしくみ
PowerShell 3.0 以降、PSSession は作成されるセッションとは無関係です。 アクティブな PSSession は、接続のリモート コンピューターまたはサーバー側クライアント側コンピューターがシャットダウンまたはネットワークから切断されている場合でも維持されます。
PowerShell 2.0 では、PSSession は、元のセッションから切断されたとき、または作成されたセッションが終了すると、リモート コンピューターから削除されます。
PSSession を切断しても、PSSession はアクティブなままであり、リモート コンピューター上で維持されます。 セッションの状態が Running から Disconnected に変わります。 切断された PSSession には、次の場所から再接続できます。
- 同じコンピューター上の現在のセッション
- 同じコンピューター上の別のセッション
- 別のコンピューター上のセッションから
セッションを維持するリモート コンピューターが実行されていて、ネットワークに接続されている必要があります。
切断された PSSession 内のコマンドは、コマンドが完了するか出力バッファーがいっぱいになるまで、リモート コンピューター上で中断なく実行されます。 出力バッファー全体でコマンドが中断されないようにするには、、Disconnect-PSSession、またはNew-PSSessionOptionコマンドレットの New-PSTransportOption パラメーターを使用します。
切断されたセッションは、リモート コンピューター上で切断された状態で維持されます。
Remove-PSSession コマンドレットを使用するなどして PSSession を削除するまで、または PSSession のアイドル タイムアウトが期限切れになるまで再接続できます。 PSSession のアイドル タイムアウトは、、、またはDisconnect-PSSessionコマンドレットの New-PSSessionOption または New-PSTransportOption パラメーターを使用して調整できます。
別のユーザーは、作成した PSSession に接続できますが、セッションの作成に使用された資格情報を提供できる場合、またはセッション構成の RunAs 資格情報を使用できる場合に限ります。
PSSessions を取得する方法
PowerShell 3.0 以降、 Get-PSSession コマンドレットはローカル コンピューターとリモート コンピューター上の PSSession を取得します。 また、現在のセッションで作成された PSSession を取得することもできます。
ローカル コンピューターまたはリモート コンピューターで PSSession を取得するには、 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 パラメーターの値が localhost の場合、Get-PSSessionはローカル コンピューターで終了し、維持される PSSession を取得します。 ローカル コンピューターで起動された場合でも、Server01 コンピューターでは PSSession は取得されません。
Get-PSSession -ComputerName localhost
現在のセッションで作成されたセッションを取得するには、パラメーターを指定せずに Get-PSSession コマンドレットを使用します。 この例では、 Get-PSSession 現在のセッションで作成された PSSession を取得し、Server01 コンピューターに接続します。
Get-PSSession
Id Name ComputerName State ConfigurationName Availability
-- ---- ------------ ----- ----------------- ------------
2 Session2 Server01 Opened Microsoft.PowerShell Available
セッションを切断する方法
セッションを切断するには、 Disconnect-PSSession コマンドレットを使用します。 PSSession を識別するには、 Session パラメーターを使用するか、 New-PSSession または Get-PSSession コマンドレットから PSSession オブジェクトをパイプ処理して Disconnect-PSSessionします。
次のコマンドは、PSSession を Server01 コンピューターに切断します。 State プロパティの値が DisconnectedAvailability が None であることに注意してください。
Get-PSSession -ComputerName Server01 | Disconnect-PSSession
Id Name ComputerName State ConfigurationName Availability
-- ---- ------------ ----- ----------------- ------------
2 Session2 Server01 Disconnected Microsoft.PowerShell None
切断されたセッションを作成するには、 コマンドレットの Invoke-Command パラメーターを使用します。 セッションを作成し、コマンドを開始し、コマンドが出力を返す前に直ちに切断します。
次のコマンドは、リモート コンピューター 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 または ConnectionUri パラメーターでコマンドレットを使用します。 または、 Get-PSSession の出力をパイプ処理して Connect-PSSessionすることもできます。
次の例では、Server02 コンピューター上のセッションを取得します。 出力には、2 つの切断されたセッションが含まれます。
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 コマンドレットを使用します。
Receive-PSSession コマンドレットを使用するのではなく、Connect-PSSessionを使用できます。 セッションが既に再接続されている場合、 Receive-PSSession はセッションが切断されたときに実行されたコマンドの結果を取得します。 PSSession がまだ切断されている場合は、 Receive-PSSession が接続し、切断中に実行されたコマンドの結果を取得します。
Receive-PSSession は、ジョブ (非同期) またはホスト プログラム (同期的) に結果を返すことができます。
OutTarget パラメーターを使用して、Job または Host を選択します。 既定値は Host です。 ただし、受信しているコマンドが現在のセッションで Job として開始された場合、既定では Job として返されます。
次の例では、 Receive-PSSession コマンドレットを使用して Server02 上のセッションに再接続し、 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 コマンドレットを使用します。
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 の State プロパティと Availability プロパティは、セッションを再接続できるかどうかを示します。
PSSession が現在のセッションに接続されている場合、その状態は Opened その可用性は Available。 PSSession から切断すると、PSSession 状態は Disconnected その可用性は None になります。
State プロパティの値は、現在のセッションに対して相対的です。 Disconnected の値は、PSSession が現在のセッションに接続されていないことを意味します。 ただし、PSSession がすべてのセッションから切断されているわけではありません。 別のセッションに接続されている可能性があります。
PSSession に接続または再接続できるかどうかを判断するには、 Availability プロパティを使用します。 None の値は、セッションに接続できることを示します。 Busy の値は、別のセッションに接続されているため、PSSession に接続できないことを示します。
次の例は、同じコンピューター上の 2 つの PowerShell セッションで実行されます。 PSSession が切断され再接続されると、各セッションの State プロパティと Availability プロパティの値が変化する点に注意してください。
# 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 コマンドレットを使用して削除するか、タイムアウトするまで、リモート コンピューター上で維持されます。PSSession の IdleTimeout プロパティは、切断されたセッションが削除されるまでの保持期間を決定します。
アイドル タイムアウト値
pssessions は、 heartbeat スレッド が応答を受け取っていない場合にアイドル状態になります。 セッションを切断するとアイドル状態になり、 IdleTimeout クロックが開始されます(切断されたセッションでコマンドがまだ実行されている場合でも)。 PowerShell では、切断されたセッションはアクティブですが、アイドル状態であると見なされます。
セッションを作成して切断する場合は、PSSession のアイドル タイムアウトが、必要に応じてセッションを維持するのに十分な長さであり、リモート コンピューター上の不要なリソースが消費されるほど長くないことを確認します。
セッション構成の IdleTimeoutMs プロパティは、セッション構成を使用するセッションの既定のアイドル タイムアウトを決定します。 既定値はオーバーライドできますが、その値はセッション構成の MaxIdleTimeoutMs プロパティを超えることはできません。
次のコマンドを使用して、セッション構成の IdleTimeoutMs および MaxIdleTimeoutMs の値を取得します。
Get-PSSessionConfiguration |
Format-Table Name, IdleTimeoutMs, MaxIdleTimeoutMs
リモート コンピューターの Administrators グループのメンバーである場合は、セッション構成を作成するときにこれらの値を設定できます。 また、切断時に値を変更することもできます。
セッション構成とセッション オプションのアイドル タイムアウト値はミリ秒単位です。 セッションとセッション構成オプションのアイドル タイムアウト値は秒単位です。
PSSession (New-PSSession、 Invoke-Command) を作成するとき、および PSSession から切断する (Disconnect-PSSession) ときに、PSSession のアイドル タイムアウトを設定できます。 ただし、PSSession () に接続したり、結果を取得したり (Connect-PSSession)、Receive-PSSession 値を変更することはできません。
Connect-PSSessionおよびReceive-PSSessionコマンドレットには、 コマンドレットによって返されるオブジェクトなど、PSSessionOption オブジェクトを受け取る New-PSSessionOption パラメーターがあります。
SessionOption オブジェクトのIdleTimeout値と基本設定変数の$PSSessionOption値は、またはConnect-PSSessionコマンドのReceive-PSSessionの値を変更しません。
特定のアイドル タイムアウト値を持つ PSSession を作成するには、 $PSSessionOption 基本設定変数を作成します。
IdleTimeout プロパティの値を目的の値 (ミリ秒単位) に設定します。
PSSession を作成すると、 $PSSessionOption 変数内の値がセッション構成の値よりも優先されます。
たとえば、次のコマンドはアイドル タイムアウトを 48 時間に設定します。
$PSSessionOption = New-PSSessionOption -IdleTimeoutMSec 172800000
特定のアイドル タイムアウト値を持つ PSSession を作成するには、 コマンドレットの New-PSSessionOption パラメーターを使用します。 次に、またはNew-PSSessionコマンドレットの Invoke-Command パラメーターの値にセッション オプションを使用します。
セッションの作成時に設定された値は、 $PSSessionOption 基本設定変数とセッション構成で設定された値よりも優先されます。
例えば:
$o = New-PSSessionOption -IdleTimeoutMSec 172800000
New-PSSession -SessionOption $o
切断時の PSSession のアイドル タイムアウトを変更するには、 コマンドレットの Disconnect-PSSession パラメーターを使用します。
例えば:
Disconnect-PSSession -IdleTimeoutSec 172800
特定のアイドル タイムアウトと最大アイドル タイムアウトを持つセッション構成を作成するには、 コマンドレットの IdleTimeoutSec および New-PSTransportOption パラメーターを使用します。 次に、の Register-PSSessionConfiguration パラメーターの値にトランスポート オプションを使用します。
例えば:
$o = New-PSTransportOption -IdleTimeoutSec 172800 -MaxIdleTimeoutSec 259200
Register-PSSessionConfiguration -Name Test -TransportOption $o
セッション構成の既定のアイドル タイムアウトと最大アイドル タイムアウトを変更するには、 コマンドレットの IdleTimeoutSec パラメーターと New-PSTransportOption パラメーターを使用します。 次に、の Set-PSSessionConfiguration パラメーターの値にトランスポート オプションを使用します。
例えば:
$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 の出力バッファリング モードを設定できます。
リモート コンピューターの Administrators グループのメンバーである場合は、セッション構成の出力バッファリング モードを作成および変更できます。
Dropの出力バッファリング モードで PSSession を作成するには、$PSSessionOption プロパティの値がされるDrop基本設定変数を作成します。
PSSession を作成すると、 $PSSessionOption 変数内の値がセッション構成の値よりも優先されます。
例えば:
$PSSessionOption = New-PSSessionOption -OutputBufferingMode Drop
コマンドレットの New-PSSessionOption パラメーターを使用して、Dropの値を持つセッション オプションを作成します。 次に、またはコマンドレットの New-PSSession パラメーターの値として、Invoke-Command オブジェクトを使用します。
セッションの作成時に設定された値は、 $PSSessionOption 基本設定変数とセッション構成で設定された値よりも優先されます。
例えば:
$o = New-PSSessionOption -OutputBufferingMode Drop
New-PSSession -SessionOption $o
切断時に PSSession の出力バッファリング モードを変更するには、 コマンドレットの Disconnect-PSSession パラメーターを使用します。
例えば:
Disconnect-PSSession -OutputBufferingMode Drop
再接続時に PSSession の出力バッファリング モードを変更するには、 コマンドレットの New-PSSessionOption パラメーターを使用します。 次に、 または Connect-PSSession の Receive-PSSession パラメーターの値にセッション オプションを使用します。
例えば:
$o = New-PSSessionOption -OutputBufferingMode Drop
Connect-PSSession -ComputerName Server01 -Name Test -SessionOption $o
Dropの既定の出力バッファリング モードでセッション構成を作成するには、 コマンドレットの New-PSTransportOption パラメーターを使用して、Dropの値を持つトランスポート オプション オブジェクトを作成します。 次に、の Register-PSSessionConfiguration パラメーターの値にトランスポート オプションを使用します。
例えば:
$o = New-PSTransportOption -OutputBufferingMode Drop
Register-PSSessionConfiguration -Name Test -TransportOption $o
セッション構成の既定の出力バッファリング モードを変更するには、 コマンドレットの New-PSTransportOption パラメーターを使用して、Dropの値を持つトランスポート オプションを作成します。 次に、の Set-PSSessionConfiguration パラメーターの値に Transport オプションを使用します。
例えば:
$o = New-PSTransportOption -OutputBufferingMode Drop
Set-PSSessionConfiguration -Name Test -TransportOption $o
ループバック セッションの切断
ループバック セッション (ローカル セッション) は、同じコンピューターで開始および終了される PSSession です。 他の PSSession と同様に、アクティブなループバック セッションは接続のリモート側 (ローカル コンピューター) 上のコンピューター上に保持されるため、ループバック セッションから切断して再接続できます。
既定では、ループバック セッションは、他のコンピューターにアクセスするためのコマンドの実行を許可しないネットワーク セキュリティ トークンを使用して作成されます。 ローカル コンピューターまたはリモート コンピューター上の任意のセッションから、ネットワーク セキュリティ トークンを持つループバック セッションに再接続できます。
ただし、、New-PSSession、またはEnter-PSSessionコマンドレットの Invoke-Command パラメーターを使用する場合、ループバック セッションは対話型のセキュリティ トークンで作成されます。 対話型トークンを使用すると、ループバック セッションで実行されるコマンドで、他のコンピューターからデータを取得できます。
対話型トークンを使用してループバック セッションを切断し、同じコンピューター上の同じセッションまたは別のセッションから再接続できます。 ただし、悪意のあるアクセスを防ぐために、作成されたコンピューターからのみ、対話型トークンを使用してループバック セッションに再接続できます。
切断されたセッションでのジョブの待機
Wait-Job コマンドレットは、ジョブが完了するまで待機し、コマンド プロンプトまたは次のコマンドに戻ります。 既定では、ジョブが実行されているセッションが切断された場合、 Wait-Job が返されます。 セッションが再接続されるまで待機するように Wait-Job コマンドレットに指示するには、 Opened 状態で、 Force パラメーターを使用します。 詳細については、「 Wait-Job」を参照してください。
堅牢なセッションと意図しない切断
コンピューターの障害またはネットワークの停止により、PSSession が意図せずに切断される可能性があります。 PowerShell は PSSession の回復を試みますが、成功は原因の重大度と期間によって異なります。
誤って切断された PSSession の状態は、 Broken または Closed である可能性がありますが、 Disconnected。
State の値がdisconnected場合は、セッションが意図的に切断された場合と同じ手法を使用して PSSession を管理できます。 たとえば、 Connect-PSSession コマンドレットを使用してセッションに再接続し、 Receive-PSSession コマンドレットを使用して、セッションの切断中に実行されたコマンドの結果を取得できます。
PSSession でコマンドが実行されている間に PSSession が作成されたセッションを閉じる (終了する) と、PowerShell は PSSession をリモート コンピューターの Disconnected 状態に維持します。 PSSession が作成されたセッションを閉じる (終了する) が、PSSession で実行されているコマンドがない場合、PowerShell は PSSession の維持を試みません。
こちらも参照ください
PowerShell