about_PSSession_Details

適用対象: Windows PowerShell 2.0, Windows PowerShell 3.0, Windows PowerShell 4.0, Windows PowerShell 5.0

トピック

about_PSSession_Details

概要

Windows PowerShell セッションとリモート コマンドでセッションが果たす役割について詳しく説明します。

詳細説明

セッションとは、Windows PowerShell が実行される環境のことです。Windows PowerShell を起動するたびに、1 つのセッションが作成されます。ユーザーは、"Windows PowerShell セッション" または "PSSession" と呼ばれる追加のセッションを自分のコンピューターまたは別のコンピューター上に作成できます。

Windows PowerShell によって自動的に作成されるセッションとは異なり、ユーザーが作成した PSSession は自分で制御および管理できます。

PSSession は、リモート コンピューティングで重要な役割を果たします。リモート コンピューターに接続される PSSession を作成すると、Windows PowerShell は PSSession をサポートするためにリモート コンピューターへの永続的な接続を確立します。PSSession を使用して、データを共有する一連のコマンド、関数、およびスクリプトを実行できます。

このトピックでは、Windows PowerShell におけるセッションと PSSession について詳しく説明します。セッションで実行できるタスクに関する基本情報については、「about_PSSessions」を参照してください。

セッションについて

セッションとは、技術的には Windows PowerShell が実行される実行環境のことです。各セッションには、System.Management.Automation エンジンのインスタンスと、Windows PowerShell が実行されるホスト プログラムが含まれています。ホストには、使い慣れた Windows PowerShell コンソールや、コマンドを実行する別のプログラム (cmd.exe など)、または Windows PowerShell をホストするために作成されたプログラム (Windows PowerShell Integrated Scripting Environment (ISE) など) を使用できます。Windows の側から見ると、セッションはターゲット コンピューター上の Windows プロセスです。

各セッションは個別に構成されます。これには、固有のプロパティ、固有の実行ポリシー、および固有のプロファイルが含まれます。セッションの作成時に存在した環境は、ユーザーがコンピューター上の環境を変更した場合でも、セッションが存在するかぎり持続します。スクリプト内で作成されたセッションを含むすべてのセッションは、グローバル スコープで作成されます。

セッション内では、一度に 1 つのコマンド (またはコマンド パイプライン) のみを実行できます。同期的に (一度に 1 つずつ) 実行された 2 つ目のコマンドは、1 つ目のコマンドが完了するのを最大 4 分間待機します。非同期に (同時に) 実行された 2 つ目のコマンドは失敗します。

PSSession について

セッションは、Windows PowerShell を起動するたびに作成されます。また、個々のコマンドを実行するための一時的なセッションが Windows PowerShell によって作成されます。しかし、ユーザーが自分で制御および管理できるセッション ("Windows PowerShell セッション" または "PSSession" と呼ばれる) を作成することもできます。

PSSession はリモート コマンドに不可欠です。Invoke-Command または Enter-PSSession コマンドレットの ComputerName パラメーターを使用すると、Windows PowerShell はコマンドを実行するために一時的なセッションを確立し、コマンドまたは対話型セッションが完了するとすぐにそのセッションを閉じます。

しかし、New-PSSession コマンドレットを使用して PSSession を作成すると、Windows PowerShell はリモート コンピューター上に複数のコマンドまたは対話型セッションを実行できる永続的なセッションを確立します。ユーザーが作成した PSSession は、ユーザーがそれを削除するか、またはそれを作成するときに使用したセッションを閉じるまで、開かれた使用可能な状態で維持されます。

リモート コンピューター上で PSSession を作成すると、リモート コンピューター上に PowerShell プロセスが作成され、ローカル コンピューターからリモート コンピューター上のプロセスへの接続が確立されます。ローカル コンピューター上で PSSession を作成すると、ローカル コンピューター上に新しいプロセスと接続の両方が作成されます。

PSSession が必要なのはどのような場合ですか。

Invoke-Command および Enter-PSSession コマンドレットには、ComputerName と Session の両方のパラメーターが用意されています。これらのいずれかを使用してリモート コマンドを実行できます。

ComputerName パラメーターは、単独のコマンドや関連性のない一連のコマンドを 1 台または複数台のコンピューターで実行するために使用します。

データを共有するコマンドを実行するには、リモート コンピューターへの永続的な接続が必要です。その場合は、PSSession を作成し、Session パラメーターを使用して PSSession 内でコマンドを実行します。

リモート コンピューターからデータを取得するその他の多くのコマンドレット (Get-Process、Get-Service、Get-EventLog、Get-WmiObject など) には、ComputerName パラメーターのみが用意されています。これらは、Windows PowerShell リモート処理以外のテクノロジを使用してデータをリモート収集します。これらのコマンドレットに PSSession パラメーターはありませんが、Invoke-Command コマンドレットを使用して PSSession 内でこれらのコマンドを実行できます。

PSSession はどのように作成しますか。

PSSession を作成するには、New-PSSession コマンドレットを使用します。New-PSSession を使用して、ローカルまたはリモート コンピューター上に PSSession を作成できます。

任意のコンピューター上に PSSession を作成できますか。

リモート コンピューターに接続される PSSession を作成するには、コンピューターを Windows PowerShell リモート処理用に構成する必要があります。現在のユーザーは、リモート コンピューター上の Administrators グループのメンバーであるか、または Administrators グループのメンバーの資格情報を提供できる必要があります。詳細については、「about_Remote_Requirements」を参照してください。

他のセッションで自分の PSSession を認識できますか。

Windows PowerShell 3.0 以降では、Get-PSSession コマンドレットの ComputerName パラメーターによって、指定されたリモート コンピューター上に作成された PSSession を取得します。

アクティブな PSSession は、リモート コンピューター (接続の "サーバー側") に保持されており、任意のコンピューター上の任意のセッションから取得できます。

たとえば、Server01 コンピューターから Server02 コンピューターへの PSSession を作成し、Server03 コンピューターに切り替えた場合は、次のようなコマンドを使用してそのセッションを取得できます。

      Get-PSSession -ComputerName Server02

ユーザーがセッションから切断しても、セッションが削除されるかタイムアウトするまで、そのセッションはリモート コンピューター上で維持されます。

Windows PowerShell 2.0 では、現在のセッションで作成した PSSession のみを取得できます。他のセッションで作成した PSSession を取得することはできません。

詳細については、「Get-PSSession」を参照してください。

自分のコンピューター上で他のユーザーが作成した PSSession を認識できますか。

他のユーザーが作成した PSSession を取得および管理できるのは、PSSession を作成したユーザーの資格情報を指定できる場合と、PSSession で使用されるセッション構成に RunAs の資格情報が含まれている場合だけです。それ以外の場合は、自分が作成した PSSession のみを取得、接続、使用、および管理できます。

別のコンピューターから PSSession に接続できますか。

Windows PowerShell 3.0 以降では、PSSession はそれを作成するときに使用したセッションから独立しています。アクティブな PSSession は、接続のリモートまたは "サーバー側" のコンピューターで維持されます。

PSSession から切断するには、Disconnect-PSSession コマンドレットを使用します。PSSession は、ローカル セッションからは切断されますが、リモート コンピューター上では維持されます。切断された PSSession 内のコマンドは実行され続けます。PSSession を中断せずに、Windows PowerShell を閉じて元のコンピューターをシャット ダウンできます。

その後は、数時間が経過した場合でも、Get-PSSession コマンドレットを使用して PSSession を取得したり、Connect-PSSession コマンドレットを使用して別のコンピューター上の新しいセッションから PSSession に接続したりできます。

詳細については、「about_Remote_Disconnected_Sessions」(https://go.microsoft.com/fwlink/?LinkID=252847) を参照してください。

自分のコンピューターが停止した場合、PSSession はどうなりますか。

切断された PSSession は、それを作成するときに使用したセッションから独立しています。PSSession を切断し、元のコンピューターを閉じた場合、その PSSession はリモート コンピューター上で維持されます。

さらに、Windows PowerShell はコンピューターの再起動、一時的な停電、ネットワークの中断などで意図せずに切断されたアクティブな PSSession を回復しようとします。Windows PowerShell は、PSSession を開かれた状態 (元のセッションがまだ使用可能な場合) または切断された状態 (それ以外の場合) に維持または回復しようとします。

「アクティブな」PSSession とは、コマンドを実行している PSSession のことです。PSSession が接続されていて (切断されておらず)、接続されているセッションが閉じるときに PSSession 内でコマンドが実行されている場合、Windows PowerShell はリモート コンピューター上で PSSession を維持しようとします。しかし、PSSession 内でコマンドが実行されていない場合、Windows PowerShell は接続されているセッションが閉じるときに PSSession を閉じます。

詳細については、「about_Remote_Disconnected_Sessions」(https://go.microsoft.com/fwlink/?LinkID=252847) を参照してください。

PSSession 内でバックグラウンド ジョブを実行できますか。

はい。バックグラウンド ジョブとは、現在のセッションと対話せずにバックグラウンドで非同期的に実行されるコマンドのことです。ジョブを開始するコマンドを送信すると、そのコマンドはジョブ オブジェクトを返しますが、ジョブは完了するまでバックグラウンドで実行され続けます。

ローカル コンピューターでバックグラウンド ジョブを開始するには、Start-Job コマンドを使用します。バックグラウンド ジョブは、(ComputerName パラメーターを使用して) 一時的な接続で、または (Session パラメーターを使用して) PSSession 内で実行できます。

リモート コンピューターでバックグラウンド ジョブを開始するには、AsJob パラメーターと共に Invoke-Command コマンドレットを使用するか、Invoke-Command コマンドレットを使用してリモート コンピューターで Start-Job コマンドを実行します。AsJob パラメーターを使用する場合は、ComputerName または Session パラメーターを使用できます。

Invoke-Command を使用して Start-Job コマンドを実行する場合は、PSSession 内でコマンドを実行する必要があります。ComputerName パラメーターを使用した場合は、ジョブ オブジェクトが返されるか、ジョブが中断されたときに Windows PowerShell が接続を終了します。

詳細については、「about_Jobs」を参照してください。

対話型セッションを実行できますか。

はい。リモート コンピューターとの対話型セッションを開始するには、Enter-PSSession コマンドレットを使用します。対話型セッションでは、入力したコマンドが、リモート コンピューターで直接入力した場合と同じようにリモート コンピューターで実行されます。

対話型セッションは、(ComputerName パラメーターを使用して) 一時的なセッション内で、または (Session パラメーターを使用して) PSSession 内で実行できます。PSSession を使用する場合、PSSession には以前のコマンドのデータが保持されており、対話型セッション中に生成されたデータもそれ以降のコマンドで使用できるように保持されます。

対話型セッションを終了すると、PSSession は開かれた使用可能な状態で維持されます。

詳細については、「Enter-PSSession」および「Exit-PSSession」を参照してください。

PSSession を削除する必要がありますか。

はい。PSSession はプロセスであり、ユーザーが使用しないときでもメモリやその他のリソースを使用する自己完結型の環境です。PSSession での作業を完了したら、PSSession を削除してください。複数の PSSession を作成した場合は、使用していないものを閉じ、現在使用中のものだけを維持してください。

PSSession を削除するには、Remove-PSSession コマンドレットを使用します。これにより、PSSession が削除され、使用されていたすべてのリソースが解放されます。

New-PSSessionOption の IdleTimeOut パラメーターを使用して、指定した間隔の後でアイドル状態の PSSession を閉じることもできます。詳細については、「New-PSSessionOption」を参照してください。

PSSession オブジェクトを変数に保存し、PSSession を削除するかタイムアウトさせた場合、その変数には PSSession オブジェクトが引き続き格納されていますが、PSSession はアクティブでなく、使用または修復できません。

セッションや PSSession はすべて同じものですか。

いいえ。開発者は、選択したプロバイダーとコマンドレットのみを含むカスタム セッションを作成できます。コマンドが、あるセッションで動作するのに別のセッションで動作しない場合は、セッションが制限されている可能性があります。

関連項目

about_Jobs

about_PSSessions

about_Remote に関するページ

about_Remote_Disconnected_Sessions

about_Remote_Requirements

Invoke-Command

New-PSSession

Get-PSSession

Remove-PSSession

Enter-PSSession

Exit-PSSession