リモート切断セッションについて
簡単な説明
PowerShell セッション (PSSession) を切断して再接続する方法について説明します。
長い説明
PowerShell 3.0 以降では、PSSession から切断し、同じコンピューターまたは別のコンピューター上の PSSession に再接続できます。 セッションの状態は維持され、セッションが切断されている間、PSSession のコマンドは引き続き実行されます。
切断されたセッション機能は、リモート コンピューターが PowerShell 3.0 以降のバージョンを実行している場合にのみ使用できます。
切断されたセッション機能を使用すると、PSSession が作成されたセッションを閉じ、POWERShell を閉じても、PSSession で実行されているコマンドを中断することなく、コンピューターをシャットダウンできます。 切断されたセッションは、完了までの時間が長く、IT プロフェッショナルが必要とする時間とデバイスの柔軟性を提供するコマンドを実行する場合に便利です。
コマンドレットを使用 Enter-PSSession
して開始された対話型セッションから切断することはできません。
切断されたセッションを使用して、コンピューターまたはネットワークの停止の結果として意図せずに切断された PSSession を管理できます。
実際の使用では、切断されたセッション機能を使用すると、問題の解決を開始し、優先順位の高い問題に注意を向け、別の場所にある別のコンピューターでもソリューションの作業を再開できます。
切断されたセッション コマンドレット
次のコマンドレットは、切断されたセッション機能をサポートしています。
Connect-PSSession
: 切断された PSSession に接続します。Disconnect-PSSession
: PSSession を切断します。Get-PSSession
: ローカル コンピューターまたはリモート コンピューター上の PSSessions を取得します。Receive-PSSession
: 切断されたセッションで実行されたコマンドの結果を取得します。Invoke-Command
: InDisconnectedSession パラメーターは PSSession を作成し、直ちに切断します。
切断されたセッション機能のしくみ
PowerShell 3.0 以降、PSSessions は作成されるセッションとは無関係です。 アクティブな PSSession は、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 を取得します。
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 を取得します。 ローカル コンピューターで起動された場合でも、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
セッションを切断する方法
PSSession を切断するには、 コマンドレットを使用します Disconnect-PSSession
。 PSSession を識別するには、Session パラメーターを使用するか、 または コマンドレットDisconnect-PSSession
から New-PSSession
Get-PSSession
に 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
切断されたセッションに接続する方法
PSSession を作成したセッション、またはローカル コンピューターまたは他のコンピューター上の他のセッションから、使用可能な切断された PSSession に接続できます。
PSSession の作成、PSSession でのコマンドの実行、PSSession からの切断、PowerShell の終了、コンピューターのシャットダウンを行うことができます。 数時間後に、別のコンピューターを開き、PSSession を取得し、それに接続し、切断中に PSSession で実行されたコマンドの結果を取得できます。 その後、セッションでさらに多くのコマンドを実行できます。
切断された PSSession を接続するには、 コマンドレットを使用します Connect-PSSession
。 ComputerName パラメーターまたは ConnectionUri パラメーターを使用して PSSession を識別するか、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
。
コマンドレットを使用する代わりに をConnect-PSSession
使用Receive-PSSession
できます。 セッションが既に再接続されている場合は、 Receive-PSSession
セッションが切断されたときに実行されたコマンドの結果を取得します。 PSSession がまだ切断されている場合は、接続し、 Receive-PSSession
切断中に実行されたコマンドの結果を取得します。
Receive-PSSession
は、ジョブ内の結果を (非同期的に) またはホスト プログラムに (同期的に) 返すことができます。 OutTarget パラメーターを使用して、ジョブまたはホストを選択します。 既定値は Host です。 ただし、受信されているコマンドがジョブとして現在のセッションで開始された 場合、既定では ジョブ として返されます。
次のコマンドでは、 コマンドレットを Receive-PSSession
使用して Server02 コンピューター上の PSSession に接続し、Session3 セッションで実行されたコマンドの 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
# Idle Timeout
切断されたセッションは、コマンドレットを使用して削除するか、タイムアウトするまで、リモート コンピューター上 Remove-PSSession
で維持されます。PSSession の IdleTimeout プロパティは、切断されたセッションが削除されるまでの期間を決定します。
PSSessions は、 ハートビート スレッド が応答を受信しない場合にアイドル状態になります。 セッションを切断すると、切断されたセッションでコマンドがまだ実行されている場合でも、アイドル状態になり、 IdleTimeout クロックが開始されます。 PowerShell では、切断されたセッションはアクティブだがアイドル状態であると見なされます。
セッションを作成して切断する場合は、PSSession のアイドル タイムアウトが、必要に応じてセッションを維持するのに十分な長さであり、リモート コンピューター上の不要なリソースを消費する長さではないことを確認します。
セッション構成の IdleTimeoutMs プロパティは、セッション構成を使用するセッションの既定のアイドル タイムアウトを決定します。 既定値はオーバーライドできますが、使用する値はセッション構成の MaxIdleTimeoutMs プロパティを超えることはできません。
セッション構成の IdleTimeoutMs 値と MaxIdleTimeoutMs 値を検索するには、次のコマンド形式を使用します。
Get-PSSessionConfiguration |
Format-Table Name, IdleTimeoutMs, MaxIdleTimeoutMs
セッション構成の既定値をオーバーライドし、PSSession の作成時と切断時に PSSession のアイドル タイムアウトを設定できます。
リモート コンピューターの Administrators グループのメンバーである場合は、セッション構成の IdleTimeoutMs プロパティと MaxIdleTimeoutMs プロパティを作成および変更できます。
アイドル タイムアウト値
セッション構成とセッション オプションのアイドル タイムアウト値はミリ秒単位です。 セッションとセッション構成オプションのアイドル タイムアウト値は秒単位です。
PSSession (、Invoke-Command
) を作成するとき、および PSSession から切断するときに、PSSession のアイドル タイムアウトを設定できます ()。New-PSSession
Disconnect-PSSession
ただし、PSSession (Connect-PSSession
) に接続するとき、または結果Receive-PSSession
() を取得するときに IdleTimeout 値を変更することはできません。
Connect-PSSession
コマンドレットと Receive-PSSession
コマンドレットには、SessionOption オブジェクトを受け取る SessionOption パラメーターがあります (コマンドレットによってNew-PSSessionOption
返されるオブジェクトなど)。 SessionOption オブジェクトの IdleTimeout 値と基本設定変数の IdleTimeout 値$PSSessionOption
は、 または Receive-PSSession
コマンドの 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 の出力バッファーがいっぱいになったときのコマンド出力の管理方法を決定します。
切断されたセッションでは、出力バッファリング モードによって、セッションの切断中にコマンドの実行が継続されるかどうかが効果的に決定されます。
有効な値を次に示します。
- [ブロック] 。 出力バッファーがいっぱいのとき、バッファーが空くまで実行が中断されます。 既定値。
- [削除] 。 出力バッファーがいっぱいのとき、実行は続行されます。 新しい出力が生成されると、最も古い出力が破棄されます。
[ブロック] ではデータが保持されますが、コマンドが中断される可能性があります。 値が 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
出力バッファリング モードが Drop の PSSession を作成するには、コマンドレットの OutputBufferingMode パラメーター New-PSSessionOption
を使用して、Drop の値を持つセッション オプションを作成 します。 次に、 または Invoke-Command
コマンドレットの SessionOption パラメーターの値に session オプションをNew-PSSession
使用します。
セッションの作成時に設定された値は、ユーザー設定変数とセッション構成で $PSSessionOption
設定された値よりも優先されます。
例:
$o = New-PSSessionOption -OutputBufferingMode Drop
New-PSSession -SessionOption $o
切断時に PSSession の出力バッファリング モードを変更するには、コマンドレットの OutputBufferingMode パラメーターをDisconnect-PSSession
使用します。
例:
Disconnect-PSSession -OutputBufferingMode Drop
再接続時に PSSession の出力バッファリング モードを変更するには、コマンドレットの OutputBufferingMode パラメーター New-PSSessionOption
を使用して、 値が Drop のセッション オプションを作成します。 次に、 または の 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 の維持を試みません。