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-PSSessionNew-PSSessionOptionNew-PSTransportOption OutputBufferingMode パラメーターを使用します。

切断されたセッションはメインリモート コンピューター上の切断された状態で保持されます。 コマンドレットを使用 Remove-PSSession するなどして PSSession を削除するまで、または PSSession のアイドル タイムアウトが期限切れになるまで再接続できます。 PSSession のアイドル タイムアウトは、またはコマンドレットの IdleTimeoutSec パラメーターまたは IdleTimeout パラメーターをDisconnect-PSSessionNew-PSSessionOptionNew-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-PSSessionGet-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-PSSessionConnect-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-PSSessionConnect-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 プロパティを超えることはできません。

次のコマンドを使用して、セッション構成の IdleTimeoutMsMaxIdleTimeoutMs の 値を取得します。

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

既定の出力バッファリング モードを使用してセッション構成を作成するには、コマンドレットの DropOutputBufferingMode パラメーター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-PSSessionEnter-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 のメインを試行しません。

関連項目