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