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
: ローカル コンピューターまたはリモート コンピューター上の PSSession を取得します。Receive-PSSession
: 切断されたセッションで実行されたコマンドの結果を取得します。Invoke-Command
: InDisconnectedSession パラメーターは PSSession を作成し、直ちに切断します。
切断されたセッション機能のしくみ
PowerShell 3.0 以降、PSSession は作成されるセッションとは無関係です。 アクティブな PSSession は、クライアント側のコンピューターがシャットダウンまたはネットワークから切断された場合でも、接続のリモート コンピューターまたはサーバー側にメインされます。
PowerShell 2.0 では、PSSession は、元のセッションから切断されたとき、または作成されたセッションが終了すると、リモート コンピューターから削除されます。
PSSession を切断すると、PSSession が再メインアクティブになり、リモート コンピューターにメインされます。 セッションの状態が [実行中] から [切断] に変わります。 から切断された PSSession に再接続できます。
- 同じコンピューター上の現在のセッション
- 同じコンピューター上の別のセッション
- 別のコンピューター上のセッションから
セッションをメインするリモート コンピューターが実行されていて、ネットワークに接続されている必要があります。
切断された PSSession 内のコマンドは、コマンドが完了するか出力バッファーがいっぱいになるまで、リモート コンピューター上で中断なく実行されます。 完全な出力バッファーでコマンドが中断されないようにするには、またはコマンドレットの Disconnect-PSSession
New-PSSessionOption
New-PSTransportOption
OutputBufferingMode パラメーターを使用します。
切断されたセッションはメインリモート コンピューター上の切断された状態で保持されます。 コマンドレットを使用 Remove-PSSession
するなどして PSSession を削除するまで、または PSSession のアイドル タイムアウトが期限切れになるまで再接続できます。 PSSession のアイドル タイムアウトは、またはコマンドレットの IdleTimeoutSec パラメーターまたは IdleTimeout パラメーターを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
ComputerName パラメーターの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 パラメーターを使用するか、または PSSession オブジェクトをNew-PSSession
Get-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
切断されたセッションを作成するには、コマンドレットの 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
切断されたセッションに接続する方法
切断されたセッションを接続するには、ComputerName パラメーターまたは ConnectionUri パラメーターを指定してコマンドレットを使用Connect-PSSession
します。 または、次の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 パラメーターを使用して、ジョブまたはホストを選択します。 既定値は 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 状態は切断され、その可用性は 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 プロパティは、切断されたセッションが削除されるまでのメイン保持期間を決定します。
アイドル タイムアウト値
PSSession は、ハートビート スレッドが応答を受信しない場合にアイドル状態になります。 セッションを切断すると、切断されたセッションでコマンドがまだ実行されている場合でも、セッションがアイドル状態になり、IdleTimeout クロックが開始されます。 PowerShell では、切断されたセッションはアクティブですが、アイドル状態であると見なされます。
セッションを作成して切断する場合は、PSSession のアイドル タイムアウトが、必要に応じてセッションをメインするのに十分な長さであり、リモート コンピューター上の不要なリソースを消費するほど長くないことを確認します。
セッション構成の IdleTimeoutMs プロパティは、セッション構成を使用するセッションの既定のアイドル タイムアウトを決定します。 既定値をオーバーライドできますが、その値がセッション構成の MaxIdleTimeoutMs プロパティを超えることはできません。
次のコマンドを使用して、セッション構成の IdleTimeoutMs と MaxIdleTimeoutMs の 値を取得します。
Get-PSSessionConfiguration |
Format-Table Name, IdleTimeoutMs, MaxIdleTimeoutMs
リモート コンピューターの 管理istrators グループのメンバーである場合は、セッション構成を作成するときにこれらの値を設定できます。 また、切断時に値を変更することもできます。
セッション構成とセッション オプションのアイドル タイムアウト値はミリ秒単位です。 セッションとセッション構成オプションのアイドル タイムアウト値は秒単位です。
PSSession (,Invoke-Command
) を作成するとき、および PSSession からNew-PSSession
切断Disconnect-PSSession
するときに、PSSession のアイドル タイムアウトを設定できます。 ただし、PSSession () に接続したり、結果Receive-PSSession
(Connect-PSSession
) を取得したりするときに IdleTimeout 値を変更することはできません。
Connect-PSSession
コマンドレットとReceive-PSSession
コマンドレットには、PSSessionOption オブジェクトを受け取る SessionOption パラメーターがあります (コマンドレットによってNew-PSSessionOption
返されるオブジェクトなど)。
SessionOption オブジェクトの IdleTimeout 値と基本設定変数の IdleTimeout 値$PSSessionOption
は、またはReceive-PSSession
コマンドの IdleTimeout の値をConnect-PSSession
変更しません。
特定のアイドル タイムアウト値を持つ PSSession を作成するには、基本設定変数を $PSSessionOption
作成します。 IdleTimeout プロパティの値を目的の値 (ミリ秒単位) に設定します。
PSSession を作成すると、変数の $PSSessionOption
値がセッション構成の値よりも優先されます。
たとえば、次のコマンドはアイドル タイムアウトを 48 時間に設定します。
$PSSessionOption = New-PSSessionOption -IdleTimeoutMSec 172800000
特定のアイドル タイムアウト値を持つ PSSession を作成するには、コマンドレットの IdleTimeoutMSec パラメーターを New-PSSessionOption
使用します。 次に、セッション オプションを使用して、またはコマンドレットの SessionOption パラメーターの値を New-PSSession
指定 Invoke-Command
します。
セッションの作成時に設定された値は、基本設定変数とセッション構成で $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 の出力バッファリング モードを設定できます。
リモート コンピューターの 管理istrators グループのメンバーである場合は、セッション構成の出力バッファリング モードを作成および変更できます。
出力バッファリング モードDrop
を使用して PSSession を作成するには、OutputBufferingMode プロパティDrop
の値が指定された基本設定変数を作成$PSSessionOption
します。
PSSession を作成すると、変数の $PSSessionOption
値がセッション構成の値よりも優先されます。
次に例を示します。
$PSSessionOption = New-PSSessionOption -OutputBufferingMode Drop
コマンドレットの OutputBufferingMode パラメーターを New-PSSessionOption
使用して、値が < a0/> の Drop
セッション オプションを作成します。 次に、PSSessionOption オブジェクトを、またはInvoke-Command
コマンドレットの SessionOption パラメーターの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 パラメーターの値に session オプションをConnect-PSSession
使用します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
を使用して、値が < a0/> の 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 パラメーターを使用します。 詳細については、「待機ジョブ」を参照してください。
堅牢なセッションと意図しない切断
コンピューターの障害またはネットワークの停止により、PSSession が意図せずに切断される可能性があります。 PowerShell は PSSession の回復を試みますが、成功は原因の重大度と期間によって異なります。
誤って切断された PSSession の状態は、壊れているか閉じている可能性がありますが、切断されている可能性もあります。 State の値が Disconnected の場合、セッションが意図的に切断された場合と同じ手法を使用して PSSession を管理できます。 たとえば、コマンドレットを Connect-PSSession
使用してセッションに再接続し、コマンドレットを Receive-PSSession
使用して、セッションが切断されている間に実行されたコマンドの結果を取得できます。
PSSession でコマンドが実行されている間に PSSession が作成されたセッションを閉じる (終了する) 場合、PowerShell メインリモート コンピューターの切断状態の PSSession が保持されます。 PSSession が作成されたセッションを閉じる (終了する) が、PSSession で実行されているコマンドがない場合、PowerShell は PSSession のメインを試行しません。
関連項目
PowerShell