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

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

注意

PowerShell リモート処理を使用するには、リモート処理用にリモート コンピューターを構成する必要があります。 詳細については、「about_Remote_Requirements」を参照してください。

両方のコンピューターに PowerShell がインストールされている必要がありますか?

はい。 リモートで作業するには、ローカル コンピューターとリモート コンピューターに PowerShell、Microsoft .NET Framework、および Web Services for Management (WS-Management) プロトコルが必要です。 特定のコマンドを実行するために必要なファイルやその他のリソースは、リモート コンピューター上に存在する必要があります。

Windows PowerShell 3.0 を実行しているコンピューターと、Windows PowerShell 2.0 を実行しているコンピューターは、互いにリモートで接続し、リモート コマンドを実行できます。 ただし、セッションから切断して再接続する機能など、一部の機能は、両方のコンピューターが 3.0 Windows PowerShell実行されている場合にのみ機能します。

リモート コンピューターに接続するためのアクセス許可、PowerShell を実行するためのアクセス許可、およびデータ ストア (ファイルやフォルダーなど) とリモート コンピューター上のレジストリにアクセスするためのアクセス許可が必要です。

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

リモート処理のしくみ

リモート コマンドを送信すると、コマンドはネットワーク経由でリモート コンピューター上の PowerShell エンジンに送信され、リモート コンピューター上の PowerShell クライアントで実行されます。 コマンドの結果はローカル コンピューターに返送され、ローカル コンピューターの PowerShell セッションに表示されます。

コマンドを送信して出力を受け取るために、PowerShell は WS-Management プロトコルを使用します。 WS-Management プロトコルの詳細については、Windowsドキュメントの WS-Management プロトコルを参照してください。

Windows PowerShell 3.0 以降では、リモート セッションはリモート コンピューターに格納されます。 これにより、コマンドを中断したり状態を失ったりすることなく、セッションから切断し、別のセッションまたは別のコンピューターから再接続できます。

PowerShell リモート処理はセキュリティで保護されていますか?

リモート コンピューターに接続すると、システムはローカル コンピューターのユーザー名とパスワードの資格情報、またはコマンドで指定した資格情報を使用してリモート コンピューターにログインします。 資格情報と転送の残りの部分は暗号化されます。

追加の保護を追加するには、リモート管理 (WinRM) 要求をリッスンするために HTTP ではなく Secure Sockets Layer (SSL) を使用するようにリモート コンピューター Windows構成できます。 その後、ユーザーは、接続を確立するときに 、New-PSSessionおよびEnter-PSSessionコマンドレットの Invoke-CommandUseSSL パラメーターを使用できます。 このオプションでは、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 使用します。

コマンドを中かっこ ({}) で囲んでスクリプト ブロックにします。 コマンドを指定するには、 ScriptBlock パラメーター Invoke-Command を使用します。

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

たとえば、次のコマンドはコマンドをリモートで Get-Process 実行します。

Invoke-Command -ComputerName Server01, Server02 -ScriptBlock {Get-Process}

#  - OR -

Invoke-Command -Session $s -ScriptBlock {Get-Process}

リモート コマンドを中断するには、「CtrlC」と入力します+。 割り込み要求はリモート コンピューターに渡され、リモート コマンドが終了します。

リモート コマンドの詳細については、リモート処理をサポートするコマンドレットのabout_Remoteとヘルプ トピックを参照してください。

リモート コンピューターに telnet 接続することはできますか?

このコマンドレットを Enter-PSSession 使用して、リモート コンピューターとの対話型セッションを開始できます。

PowerShell プロンプトで次のように入力します。

Enter-PSSession <ComputerName>

コマンド プロンプトが変更され、リモート コンピューターに接続されていることを示します。

<ComputerName>\C:>

入力したコマンドは、リモート コンピューターで直接入力したのと同じように、リモート コンピューターで実行されます。

対話型セッションを終了するには、次のように入力します。

Exit-PSSession

対話型セッションは、WS-Management プロトコルを使用する永続的なセッションです。 Telnet の使用と同じではありませんが、同様のエクスペリエンスが提供されます。

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

永続的な接続を作成できますか?

はい。 リモート コンピューターの名前、その NetBIOS 名、またはその IP アドレスを指定して、リモート コマンドを実行できます。 または、リモート コンピューターに接続されている PowerShell セッション (PSSession) を指定してリモート コマンドを実行することもできます。

またはEnter-PSSession、PowerShell の ComputerName パラメーターInvoke-Commandを使用すると、一時的な接続が確立されます。 PowerShell は、接続を使用して現在のコマンドのみを実行し、接続を閉じます。 これは、多くのリモート コンピューターでも、1 つのコマンドまたは関連しない複数のコマンドを実行するための非常に効率的な方法です。

コマンドレットを New-PSSession 使用して PSSession を作成すると、PowerShell によって PSSession の永続的な接続が確立されます。 その後、データを共有するコマンドを含め、PSSession で複数のコマンドを実行できます。

通常、PSSession を作成して、データを共有する一連の関連コマンドを実行します。 それ以外の場合は、 ComputerName パラメーターによって作成された一時的な接続で、ほとんどのコマンドで十分です。

セッションの詳細については、 about_PSSessionsを参照してください。

一度に複数のコンピューターでコマンドを実行できますか?

はい。 コマンドレットの ComputerName パラメーターは複数のコンピューター名を Invoke-Command 受け取り、 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 コマンドです。 バックグラウンド ジョブを開始すると、コマンド プロンプトはすぐに戻り、ジョブが長時間実行された場合でも、ジョブの実行中はセッションで作業を続行できます。

バックグラウンド ジョブは常に一時セッションで非同期的に実行されるため、他のコマンドが実行されている間でもバックグラウンド ジョブを開始できます。

ローカル コンピューターまたはリモート コンピューターでバックグラウンド ジョブを実行できます。 既定では、バックグラウンド ジョブはローカル コンピューターで実行されます。 ただし、コマンドレットの AsJob パラメーターを使用して、任意の Invoke-Command リモート コマンドをバックグラウンド ジョブとして実行できます。 また、コマンドをリモートでStart-Job実行するために使用Invoke-Commandすることもできます。

PowerShell のバックグラウンド ジョブの詳細については、「 about_Jobsabout_Remote_Jobs」を参照してください。

リモート コンピューターで Windows プログラムを実行できますか?

PowerShell リモート コマンドを使用して、リモート コンピューターで Windows ベースのプログラムを実行できます。 たとえば、リモート コンピューターで実行またはIpconfig.exe実行Shutdown.exeできます。

ただし、PowerShell コマンドを使用してリモート コンピューター上のプログラムのユーザー インターフェイスを開くことはできません。

リモート コンピューターでWindows プログラムを起動すると、コマンドは完了せず、プログラムが完了するまで、または CtrlC キー+を押してコマンドを中断するまで、PowerShell コマンド プロンプトは返されません。 たとえば、リモート コンピューターでプログラムを Ipconfig.exe 実行した場合、コマンド プロンプトは完了するまで Ipconfig.exe 戻りません。

リモート・コマンドを使用して、ユーザー・インターフェースを持つプログラムを開始すると、プログラム・プロセスは開始しますが、ユーザー・インターフェースは表示されません。 PowerShell コマンドは完了せず、プログラム プロセスを停止するか CtrlC キーを押すまで、コマンド プロンプトは戻りません。CtrlC キー+を押すと、コマンドが中断され、プロセスが停止されます。

たとえば、PowerShell コマンドを使用してリモート コンピューターで実行Notepadする場合、メモ帳 プロセスはリモート コンピューターで開始されますが、メモ帳 ユーザー インターフェイスは表示されません。 コマンドを中断してコマンド プロンプトを復元するには、CtrlC キーを押します+。

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

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

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

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

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

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

ユーザーが 、New-PSSessionまたはEnter-PSSessionコマンドレットをInvoke-Command使用する場合、ConfigurationName パラメーターを使用して、セッションに使用されるセッション構成を示すことができます。 また、セッション内の基本設定変数の値を変更することで、セッションで使用される既定の $PSSessionConfigurationName 構成を変更できます。

セッション構成の詳細については、セッション構成コマンドレットのヘルプを参照してください。 セッション構成コマンドレットを見つけるには、次のように入力します。

Get-Command *PSSessionConfiguration

ファンイン構成とファンアウト構成とは

複数のコンピューターを含む最も一般的な PowerShell リモート処理シナリオは、1 台のローカル コンピューター (管理者のコンピューター) が多数のリモート コンピューターで PowerShell コマンドを実行する 1 対多構成です。 これは"ファンアウト" シナリオと呼ばれます。

ただし、一部の企業では、構成は多対一であり、多くのクライアント コンピューターは、ファイル サーバーやキオスクなど、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 に設定します。LocalAccountTokenFilterPolicy in HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System

    次の 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資格情報を指定するには、コマンドレットまたはEnter-PSSessionコマンドレットNew-PSSessionCredential パラメーターを使用する必要があります。 これは、現在のユーザーがローカル コンピューターとリモート コンピューターの 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 リモート処理」を参照してください。