PowerShell リモート処理に関する FAQ

リモートで作業する場合は、あるコンピューター ("ローカル コンピューター" と呼ばれる) の PowerShell でコマンドを入力しますが、そのコマンドは別のコンピューター ("リモート コンピューター" と呼ばれる) で実行されます。 リモート作業のエクスペリエンスは、可能な限りリモート コンピューターで直接作業するのと同じようにする必要があります。

Note

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-CommandNew-PSSessionEnter-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-CommandScriptBlock パラメーターを使用して、コマンドを指定します。

Invoke-CommandComputerName パラメーターを使用して、リモート コンピューターを指定できます。 または、リモート コンピューターへの固定接続 (セッション) を作成し、Invoke-CommandSession パラメーターを使用してセッションでコマンドを実行することもできます。

たとえば、次のコマンドでは 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-PSSessionComputerName パラメーターを使用すると、PowerShell によって一時的な接続が確立されます。 PowerShell では、その接続を使用して現在のコマンドのみを実行してから、接続を閉じます。 これは、多くのリモート コンピューターでも、単一のコマンドまたは関連のない複数のコマンドを実行するための非常に効率的な方法です。

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 オブジェクトを送受信します。"ライブ" オブジェクトは、実際のプログラムまたはシステム コンポーネントに関連付けられているオブジェクトです。 メソッドを呼び出すか、ライブ オブジェクトのプロパティを変更すると、変更は実際のプログラムまたはコンポーネントに影響します。 また、プログラムまたはコンポーネントのプロパティが変更されると、それらを表すオブジェクトのプロパティも変更されます。

ただし、ほとんどのライブ オブジェクトはネットワーク経由で送信できないため、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 キーを押します。

ユーザーが自分のコンピューターでリモートで実行できるコマンドを制限できますか?

はい。 すべてのリモート セッションでは、リモート コンピューター上のセッション構成のいずれかを使用する必要があります。 コンピューター上のセッション構成 (およびそれらのセッション構成に対する権限) を管理して、コンピューターでコマンドをリモートで実行できるユーザーと実行できるコマンドを決定できます。

セッション構成ではセッションの環境が構成されます。 構成を定義するには、新しい構成クラスを実装するアセンブリを使うか、セッションで実行されるスクリプトを使用します。 構成では、セッションで使用できるコマンドを決定できます。 また、構成には、セッションで単一のオブジェクトまたはコマンドでリモートで受信できるデータの量を制限する設定など、コンピューターを保護する設定を含めることができます。 構成を使用するために必要な権限を決定するセキュリティ記述子を指定することもできます。

Enable-PSRemoting コマンドレットでは、コンピューターに既定のセッション構成 (Microsoft.PowerShell、Microsoft.PowerShell.Workflow、Microsoft.PowerShell32 (64 ビット オペレーティング システムのみ)) を作成します。 Enable-PSRemoting では、コンピューター上の Administrators グループのメンバーのみが使用できるように、構成のセキュリティ記述子を設定します。

セッション構成コマンドレットを使用して、既定のセッション構成を編集したり、新しいセッション構成を作成したり、すべてのセッション構成のセキュリティ記述子を変更したりできます。

Windows PowerShell 3.0 以降では、New-PSSessionConfigurationFile コマンドレットを使用すると、テキスト ファイルを使ってカスタム セッション構成を作成できます。 このファイルには、言語モードを設定したり、セッション構成を使用するセッションで利用できるコマンドレットとモジュールを指定したりするためのオプションが含まれています。

ユーザーは、Invoke-CommandNew-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 エンドポイントからのリダイレクトを禁止または許可することもできます。

ドメインにない単一のコンピューターでリモート処理をテストできますか?

はい。 PowerShell リモート処理は、ローカル コンピューターがドメインにない場合でも使用できます。 リモート処理機能を使用してセッションに接続し、同じコンピューター上にセッションを作成できます。 これらの機能は、リモート コンピューターに接続する場合と同じように動作します。

ワークグループ内のコンピューターでリモート コマンドを実行するには、そのコンピューターで次の Windows 設定を変更します。

注意: これらの設定は、システム上のすべてのユーザーに影響を与え、悪意のある攻撃に対してシステムがより脆弱になる場合があります。 これらの変更を行う場合は注意が必要です。

  • Windows Vista、Windows 7、Windows 8:

    HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System にレジストリ エントリ LocalAccountTokenFilterPolicy を作成し、その値を 1 に設定します。

    次の 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-CommandNew-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 リモート処理」を参照してください。