リモートで作業する場合は、あるコンピューター ("ローカル コンピューター" と呼ばれます) で PowerShell にコマンドを入力しますが、コマンドは別のコンピューター ("リモート コンピューター" と呼ばれます) で実行されます。 リモートで作業する経験は、可能な限りリモート コンピューターで直接作業するのと同じようにする必要があります。
注
PowerShell リモート処理を使用するには、リモート処理用にリモート コンピューターを構成する必要があります。 詳細については、about_Remote_Requirementsを参照してください。
両方のコンピューターに PowerShell がインストールされている必要がありますか?
はい。 リモートで動作するには、ローカル コンピューターとリモート コンピューターに PowerShell、Microsoft .NET Framework、および Web Services for Management (WS-Management) プロトコルが必要です。 特定のコマンドを実行するために必要なファイルやその他のリソースは、リモート コンピューター上にある必要があります。
Windows PowerShell 3.0 を実行しているコンピューターと Windows PowerShell 2.0 を実行しているコンピューターは、相互にリモート接続してリモート コマンドを実行できます。 ただし、セッションから切断して再接続する機能など、一部の機能は、両方のコンピューターが Windows PowerShell 3.0 を実行している場合にのみ機能します。
リモート コンピューターに接続するためのアクセス許可、PowerShell を実行するアクセス許可、およびデータ ストア (ファイルやフォルダーなど)、およびリモート コンピューター上のレジストリにアクセスするアクセス許可が必要です。
詳細については、about_Remote_Requirementsを参照してください。
リモート処理のしくみ
リモート コマンドを送信すると、コマンドはネットワーク経由でリモート コンピューター上の PowerShell エンジンに送信され、リモート コンピューター上の PowerShell クライアントで実行されます。 コマンドの結果はローカル コンピューターに送り返され、ローカル コンピューターの PowerShell セッションに表示されます。
コマンドを送信して出力を受け取るために、PowerShell は WS-Management プロトコルを使用します。 WS-Management プロトコルの詳細については、Windows ドキュメントの「WS-Management プロトコル」を参照してください。
Windows PowerShell 3.0 以降では、リモート セッションはリモート コンピューターに格納されます。 これにより、コマンドを中断したり状態を失ったりすることなく、セッションから切断し、別のセッションまたは別のコンピューターから再接続できます。
PowerShell リモート処理はセキュリティで保護されていますか?
リモート コンピューターに接続すると、システムはローカル コンピューターのユーザー名とパスワードの資格情報、またはコマンドで指定した資格情報を使用してリモート コンピューターにログインします。 資格情報とその他の転送は暗号化されます。
さらに保護を追加するには、HTTP ではなく Secure Sockets Layer (SSL) を使用して Windows リモート管理 (WinRM) 要求をリッスンするようにリモート コンピューターを構成します。
その後、ユーザーは接続を確立するときに、Invoke-Command
、New-PSSession
、および Enter-PSSession
コマンドレットの UseSSL パラメーターを使用できます。 このオプションでは、HTTP ではなく、より安全な HTTPS チャネルが使用されます。
すべてのリモート コマンドに PowerShell リモート処理が必要ですか?
いいえ。 一部のコマンドレットには、リモート コンピューターからオブジェクトを取得できる ComputerName パラメーターがあります。
これらのコマンドレットでは、PowerShell リモート処理は使用されません。 そのため、コンピューターが PowerShell リモート処理用に構成されていない場合や、コンピューターが PowerShell リモート処理の要件を満たしていない場合でも、PowerShell を実行している任意のコンピューターで使用できます。
これらのコマンドレットには、次のものが含まれます。
Get-HotFix
Rename-Computer
Restart-Computer
Stop-Computer
ComputerName パラメーターを持つすべてのコマンドレットを検索するには、次のように入力します。
Get-Help * -Parameter ComputerName
# or
Get-Command -ParameterName ComputerName
特定のコマンドレットの ComputerName パラメーターに PowerShell リモート処理が必要かどうかを確認するには、パラメーターの説明を参照してください。 パラメーターの説明を表示するには、次のように入力します。
Get-Help <cmdlet-name> -Parameter ComputerName
次に例を示します。
Get-Help Get-HotFix -Parameter ComputerName
その他のすべてのコマンドについては、Invoke-Command
コマンドレットを使用します。
リモート コンピューターでコマンドを実行するにはどうすればよいですか?
リモート コンピューターでコマンドを実行するには、Invoke-Command
コマンドレットを使用します。
コマンドを中かっこ ({}
) で囲んでスクリプト ブロックにします。
Invoke-Command
の ScriptBlock パラメーターを使用して、コマンドを指定します。
Invoke-Command
の ComputerName パラメーターを使用して、リモート コンピューターを指定できます。 または、リモート コンピューター (セッション) への永続的な接続を作成し、Invoke-Command
の Session パラメーターを使用してセッションでコマンドを実行することもできます。
たとえば、次のコマンドは、Get-Process
コマンドをリモートで実行します。
Invoke-Command -ComputerName Server01, Server02 -ScriptBlock {Get-Process}
# - OR -
Invoke-Command -Session $s -ScriptBlock {Get-Process}
リモート コマンドを中断するには、Ctrl +C入力します。 中断要求はリモート コンピューターに渡され、リモート コマンドが終了します。
リモート コマンドの詳細については、リモート処理をサポートするコマンドレットのabout_Remoteとヘルプ トピックを参照してください。
リモート コンピューターに Telnet 接続することはできますか?
Enter-PSSession
コマンドレットを使用して、リモート コンピューターとの対話型セッションを開始できます。
PowerShell プロンプトで、次のように入力します。
Enter-PSSession <ComputerName>
コマンド プロンプトが変わり、リモート コンピューターに接続していることを示します。
<ComputerName>\C:>
入力したコマンドは、リモート コンピューターで直接入力したのと同じように、リモート コンピューターで実行されます。
対話型セッションを終了するには、次のように入力します。
Exit-PSSession
対話型セッションは、WS-Management プロトコルを使用する永続的なセッションです。 Telnet の使用と同じではありませんが、同様のエクスペリエンスが提供されます。
詳細については、Enter-PSSession
を参照してください。
永続的な接続を作成できますか?
はい。 リモート コンピューターの名前、その NetBIOS 名、またはその IP アドレスを指定して、リモート コマンドを実行できます。 または、リモート コンピューターに接続されている PowerShell セッション (PSSession) を指定して、リモート コマンドを実行することもできます。
Invoke-Command
または Enter-PSSession
の ComputerName パラメーターを使用すると、PowerShell によって一時的な接続が確立されます。 PowerShell は、接続を使用して現在のコマンドのみを実行し、接続を閉じます。 これは、多くのリモート コンピューターでも、1 つのコマンドまたは関連のない複数のコマンドを実行するための非常に効率的な方法です。
New-PSSession
コマンドレットを使用して PSSession を作成すると、PowerShell によって PSSession の永続的な接続が確立されます。 その後、データを共有するコマンドを含め、PSSession で複数のコマンドを実行できます。
通常、PSSession を作成して、データを共有する一連の関連コマンドを実行します。 それ以外の場合は、ほとんどのコマンドで、ComputerName パラメーターによって作成される一時的な接続で十分です。
セッションの詳細については、about_PSSessionsを参照してください。
一度に複数のコンピューターでコマンドを実行できますか?
はい。
Invoke-Command
コマンドレットの ComputerName パラメーターは複数のコンピューター名を受け入れ、Session パラメーターは複数の PSSession を受け入れます。
Invoke-Command
コマンドを実行すると、PowerShell は、指定されたすべてのコンピューターまたは指定されたすべての PSSession でコマンドを実行します。
PowerShell では、数百の同時リモート接続を管理できます。 ただし、送信できるリモート コマンドの数は、コンピューターのリソースと、複数のネットワーク接続を確立して維持する能力によって制限される場合があります。
詳細については、「Invoke-Command
ヘルプ」トピックの例を参照してください。
プロファイルはどこにありますか?
PowerShell プロファイルはリモート セッションでは自動的に実行されないため、プロファイルによって追加されるコマンドはセッションに存在しません。 さらに、$PROFILE
自動変数はリモート セッションでは設定されません。
セッションでプロファイルを実行するには、Invoke-Command
コマンドレットを使用します。
たとえば、次のコマンドは、$s
のセッション内のローカル コンピューターから CurrentUserCurrentHost プロファイルを実行します。
Invoke-Command -Session $s -FilePath $PROFILE
次のコマンドは、$s
のセッション内のリモート コンピューターから CurrentUserCurrentHost プロファイルを実行します。
$PROFILE
変数は設定されないため、コマンドはプロファイルへの明示的なパスを使用します。
Invoke-Command -Session $s {
. "$HOME\Documents\WindowsPowerShell\Microsoft.PowerShell_profile.ps1"
}
このコマンドを実行すると、プロファイルがセッションに追加するコマンドを $s
で使用できるようになります。
セッション構成でスタートアップ スクリプトを使用して、セッション構成を使用するすべてのリモート セッションでプロファイルを実行することもできます。
PowerShell プロファイルの詳細については、「about_Profiles」を参照してください。 セッション構成の詳細については、「Register-PSSessionConfiguration
」を参照してください。
リモート コマンドでの調整のしくみ
ローカル コンピューター上のリソースの管理に役立つ PowerShell には、コマンドごとに確立される同時リモート接続の数を制限できるコマンドごとの調整機能が含まれています。
既定値は 32 同時接続ですが、コマンドレットの ThrottleLimit パラメーターを使用して、特定のコマンドのカスタム スロットル制限を設定できます。
調整機能を使用する場合は、セッション全体やコンピューターではなく、各コマンドに適用されることを忘れないでください。 複数のセッションまたは PSSession でコマンドを同時に実行している場合、同時接続の数は、すべてのセッションのコンカレント接続の合計になります。
ThrottleLimit パラメーターを持つコマンドレットを検索するには、次のように入力します。
Get-Help * -Parameter ThrottleLimit
-or-
Get-Command -ParameterName ThrottleLimit
リモート コマンドの出力はローカル出力と異なりますか?
PowerShell をローカルで使用する場合は、"ライブ" の .NET Framework オブジェクトを送受信します。"live" オブジェクトは、実際のプログラムまたはシステム コンポーネントに関連付けられているオブジェクトです。 メソッドを呼び出すか、ライブ オブジェクトのプロパティを変更すると、変更は実際のプログラムまたはコンポーネントに影響します。 また、プログラムまたはコンポーネントのプロパティが変更されると、それらを表すオブジェクトのプロパティも変更されます。
ただし、ほとんどのライブ オブジェクトはネットワーク経由で送信できないため、PowerShell はリモート コマンドで送信されるほとんどのオブジェクトを "シリアル化" します。つまり、各オブジェクトを一連の XML (XML の制約言語 [CLiXML]) データ要素に変換して転送します。
PowerShell は、シリアル化されたオブジェクトを受け取ると、XML を逆シリアル化されたオブジェクト型に変換します。 逆シリアル化されたオブジェクトは、以前のプログラムまたはコンポーネントのプロパティの正確なレコードですが、"ライブ" ではなくなります。つまり、コンポーネントに直接関連付けされなくなります。 また、メソッドは無効になったため削除されます。
通常は、ライブ オブジェクトを使用する場合と同様に逆シリアル化されたオブジェクトを使用できますが、それらの制限に注意する必要があります。 また、Invoke-Command
コマンドレットによって返されるオブジェクトには、コマンドの発生元を特定するのに役立つ追加のプロパティがあります。
DirectoryInfo オブジェクトや GUID などの一部のオブジェクト型は、受信するとライブ オブジェクトに変換されます。 これらのオブジェクトには、特別な処理や書式設定は必要ありません。
リモート出力の解釈と書式設定については、about_Remote_Outputを参照してください。
バックグラウンド ジョブをリモートで実行できますか?
はい。 PowerShell バックグラウンド ジョブは、セッションと対話せずに非同期的に実行される PowerShell コマンドです。 バックグラウンド ジョブを開始すると、コマンド プロンプトはすぐに戻り、長時間実行されている場合でもジョブの実行中にセッションで作業を続けることができます。
バックグラウンド ジョブは常に一時セッションで非同期的に実行されるため、他のコマンドが実行されている間でもバックグラウンド ジョブを開始できます。
ローカル コンピューターまたはリモート コンピューターでバックグラウンド ジョブを実行できます。 既定では、バックグラウンド ジョブはローカル コンピューターで実行されます。 ただし、Invoke-Command
コマンドレットの AsJob パラメーターを使用して、任意のリモート コマンドをバックグラウンド ジョブとして実行できます。 また、Invoke-Command
を使用して、Start-Job
コマンドをリモートで実行できます。
PowerShell でのバックグラウンド ジョブの詳細については、「about_Jobs と about_Remote_Jobs」を参照してください。
リモート コンピューターで Windows プログラムを実行できますか?
PowerShell リモート コマンドを使用して、リモート コンピューターで Windows ベースのプログラムを実行できます。
たとえば、リモート コンピューターで Shutdown.exe
または Ipconfig.exe
を実行できます。
ただし、PowerShell コマンドを使用して、リモート コンピューター上のプログラムのユーザー インターフェイスを開くことはできません。
リモート コンピューターで Windows プログラムを起動すると、コマンドは完了せず、PowerShell コマンド プロンプトは、プログラムが完了するまで、または Ctrl +C キー押してコマンドを中断するまで戻りません。 たとえば、リモート コンピューターで Ipconfig.exe
プログラムを実行した場合、コマンド プロンプトは Ipconfig.exe
が完了するまで戻りません。
リモート・コマンドを使用して、ユーザー・インターフェースを持つプログラムを開始すると、プログラム・プロセスが開始されますが、ユーザー・インターフェースは表示されません。 PowerShell コマンドは完了せず、コマンド プロンプトは、プログラム プロセスを停止するまで、または Ctrl +C押すまで戻りません。これは、コマンドを中断してプロセスを停止します。
たとえば、PowerShell コマンドを使用してリモート コンピューターで Notepad
を実行すると、メモ帳プロセスはリモート コンピューターで開始されますが、メモ帳のユーザー インターフェイスは表示されません。 コマンドを中断してコマンド プロンプトを復元するには、Ctrl キー 押+Cします。
ユーザーが自分のコンピューターでリモートで実行できるコマンドを制限できますか?
はい。 すべてのリモート セッションでは、リモート コンピューター上のセッション構成のいずれかを使用する必要があります。 コンピューター上のセッション構成 (およびそれらのセッション構成に対するアクセス許可) を管理して、コンピューターでコマンドをリモートで実行できるユーザーと実行できるコマンドを決定できます。
セッション構成は、セッションの環境を構成します。 構成を定義するには、新しい構成クラスを実装するアセンブリを使用するか、セッションで実行されるスクリプトを使用します。 構成では、セッションで使用できるコマンドを決定できます。 また、構成には、セッションが 1 つのオブジェクトまたはコマンドでリモートで受信できるデータの量を制限する設定など、コンピューターを保護する設定を含めることができます。 構成を使用するために必要なアクセス許可を決定するセキュリティ記述子を指定することもできます。
Enable-PSRemoting
コマンドレットは、コンピューターに既定のセッション構成を作成します。Microsoft.PowerShell、Microsoft.PowerShell.Workflow、Microsoft.PowerShell32 (64 ビット オペレーティング システムのみ)。
Enable-PSRemoting
、コンピューター上の Administrators グループのメンバーのみが使用できるように、構成のセキュリティ記述子を設定します。
セッション構成コマンドレットを使用して、既定のセッション構成を編集したり、新しいセッション構成を作成したり、すべてのセッション構成のセキュリティ記述子を変更したりできます。
Windows PowerShell 3.0 以降、New-PSSessionConfigurationFile
コマンドレットを使用すると、テキスト ファイルを使用してカスタム セッション構成を作成できます。 このファイルには、言語モードを設定したり、セッション構成を使用するセッションで使用できるコマンドレットとモジュールを指定したりするためのオプションが含まれています。
ユーザーは、Invoke-Command
、New-PSSession
、または Enter-PSSession
コマンドレットを使用する場合、ConfigurationName パラメーターを使用して、セッションに使用されるセッション構成を示すことができます。 また、セッションで $PSSessionConfigurationName
基本設定変数の値を変更することで、セッションで使用される既定の構成を変更できます。
セッション構成の詳細については、セッション構成コマンドレットのヘルプを参照してください。 セッション構成コマンドレットを見つけるには、次のように入力します。
Get-Command *PSSessionConfiguration
ファンイン構成とファンアウト構成とは
複数のコンピューターを含む最も一般的な PowerShell リモート処理シナリオは、1 対多の構成です。この構成では、1 台のローカル コンピューター (管理者のコンピューター) が多数のリモート コンピューターで PowerShell コマンドを実行します。 これは"ファンアウト" シナリオと呼ばれます。
ただし、一部の企業では、多くのクライアント コンピューターが PowerShell を実行している単一のリモート コンピューター (ファイル サーバーやキオスクなど) に接続する多対 1 の構成です。 これは"ファンイン" 構成と呼ばれます。
PowerShell リモート処理では、ファンアウト構成とファンイン構成の両方がサポートされます。
ファンアウト構成の場合、PowerShell は Web Services for Management (WS-Management) プロトコルと、WS-Management の Microsoft 実装をサポートする WinRM サービスを使用します。 ローカル コンピューターがリモート コンピューターに接続すると、WS-Management 接続が確立され、PowerShell 用のプラグインを使用して、リモート コンピューター上の PowerShell ホスト プロセス (Wsmprovhost.exe) が開始されます。 ユーザーは、代替ポート、代替セッション構成、およびその他の機能を指定して、リモート接続をカスタマイズできます。
"ファンイン" 構成をサポートするために、PowerShell はインターネット インフォメーション サービス (IIS) を使用して WS-Management をホストし、PowerShell プラグインを読み込み、PowerShell を起動します。 このシナリオでは、各 PowerShell セッションを個別のプロセスで開始する代わりに、すべての PowerShell セッションが同じホスト プロセスで実行されます。
IIS ホスティングとファンイン リモート管理は、Windows XP または Windows Server 2003 ではサポートされていません。
ファンイン構成では、ユーザーは接続 URI と HTTP エンドポイント (トランスポート、コンピューター名、ポート、アプリケーション名など) を指定できます。 IIS は、指定したアプリケーション名を持つすべての要求をアプリケーションに転送します。 既定値は WS-Management で、PowerShell をホストできます。
認証メカニズムを指定し、HTTP および HTTPS エンドポイントからのリダイレクトを禁止または許可することもできます。
ドメインに含まれていない 1 台のコンピューターでリモート処理をテストできますか?
はい。 PowerShell リモート処理は、ローカル コンピューターがドメインにない場合でも使用できます。 リモート処理機能を使用してセッションに接続し、同じコンピューター上にセッションを作成できます。 これらの機能は、リモート コンピューターに接続する場合と同じように機能します。
ワークグループ内のコンピューターでリモート コマンドを実行するには、コンピューターで次の Windows 設定を変更します。
注意: これらの設定は、システム上のすべてのユーザーに影響を与え、悪意のある攻撃に対してシステムをより脆弱にすることができます。 これらの変更を行う場合は注意が必要です。
Windows Vista、Windows 7、Windows 8:
次のレジストリ エントリを作成し、その値を 1 に設定します。
HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System
の LocalAccountTokenFilterPolicy次の PowerShell コマンドを使用して、このエントリを追加できます。
$parameters = @{ Path='HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System' Name='LocalAccountTokenFilterPolicy' propertyType='DWord' Value=1 } New-ItemProperty @parameters
Windows Server 2003、Windows Server 2008、Windows Server 2012、Windows Server 2012 R2:
"ネットワーク アクセス: ローカル アカウントの共有とセキュリティ モデル" ポリシーの既定の設定は "クラシック" であるため、変更は必要ありません。 設定が変更された場合に備えて確認します。
別のドメイン内のコンピューターでリモート コマンドを実行できますか?
はい。 通常、コマンドはエラーなしで実行されますが、リモート コンピューターの Administrators グループのメンバーの資格情報を指定するには、Invoke-Command
、New-PSSession
、または Enter-PSSession
コマンドレットの Credential パラメーターを使用する必要があります。 これは、現在のユーザーがローカル コンピューターとリモート コンピューターの Administrators グループのメンバーである場合でも必要になることがあります。
ただし、リモート コンピューターがローカル コンピューターが信頼するドメインにない場合、リモート コンピューターはユーザーの資格情報を認証できない可能性があります。
認証を有効にするには、次のコマンドを使用して、WinRM のローカル コンピューターの信頼されたホストの一覧にリモート コンピューターを追加します。 PowerShell プロンプトでコマンドを入力します。
Set-Item WSMan:\localhost\Client\TrustedHosts -Value <Remote-computer-name>
たとえば、ローカル コンピューター上の信頼されたホストの一覧に Server01 コンピューターを追加するには、PowerShell プロンプトで次のコマンドを入力します。
Set-Item WSMan:\localhost\Client\TrustedHosts -Value Server01
PowerShell は SSH 経由のリモート処理をサポートしていますか?
はい。 詳細については、「SSH 経由の PowerShell リモート処理」を参照してください。