次の方法で共有


about_Remote_FAQ

概要

Windows PowerShellでのリモート コマンドの実行に関する質問と回答が含まれています。

詳細説明

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

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

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

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

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

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

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

リモート処理のしくみ

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

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

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

WINDOWS POWERSHELL リモート処理は安全ですか?

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

追加の保護を追加するには、HTTP ではなく Secure Sockets Layer (SSL) を使用して Windows リモート管理 (WinRM) 要求をリッスンするようにリモート コンピューターを構成します。 その後、ユーザーは接続を確立するときに Invoke-Command、New-PSSession、および Enter-PSSession コマンドレットの UseSSL パラメーターを使用できます。 このオプションでは、HTTP ではなく、より安全な HTTPS チャネルが使用されます。

すべてのリモート コマンドに WINDOWS POWERSHELL リモート処理が必要ですか?

いいえ。 いくつかのコマンドレットには、リモート コンピューターからオブジェクトを取得できる ComputerName パラメーターがあります。

これらのコマンドレットでは、リモート処理Windows PowerShell使用されません。 そのため、コンピューターがWindows PowerShellリモート処理用に構成されていない場合や、コンピューターがWindows PowerShellリモート処理の要件を満たしていない場合でも、Windows PowerShellを実行している任意のコンピューターで使用できます。

これらのコマンドレットには、次のものが含まれます。

  • Get-Process
  • Get-Service
  • Get-WinEvent
  • Get-EventLog
  • Get-WmiObject
  • Test-Connection

ComputerName パラメーターを持つすべてのコマンドレットを検索するには、次のように入力します。

Get-Help * -Parameter ComputerName
# or
Get-Command -ParameterName ComputerName

特定のコマンドレットの ComputerName パラメーターにリモート処理Windows PowerShell必要があるかどうかを確認するには、パラメーターの説明を参照してください。 パラメーターの説明を表示するには、次のように入力します。

Get-Help <cmdlet-name> -Parameter ComputerName

例:

Get-Help Get-Process -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 コマンドレットを使用して、リモート コンピューターとの対話型セッションを開始できます。

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

Enter-PSSession <ComputerName>

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

<ComputerName>\C:>

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

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

Exit-PSSession

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

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

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

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

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

New-PSSession コマンドレットを使用して PSSession を作成すると、WINDOWS POWERSHELLは PSSession の永続的な接続を確立します。 その後、PSSession で複数のコマンド (データを共有するコマンドを含む) を実行できます。

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

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

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

はい。 Invoke-Command コマンドレットの ComputerName パラメーターは複数のコンピューター名を受け入れ、Session パラメーターは複数の PSSession を受け入れます。

Invoke-Command コマンドを実行すると、Windows PowerShellは、指定したすべてのコンピューターまたは指定したすべての PSSession でコマンドを実行します。

Windows PowerShellでは、数百の同時リモート接続を管理できます。 ただし、送信できるリモート コマンドの数は、コンピューターのリソースと、複数のネットワーク接続を確立して維持するための容量によって制限される場合があります。

詳細については、「Invoke-Command ヘルプ」トピックの例を参照してください。

プロファイルはどこにありますか?

Windows 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で使用できるようになります。

セッション構成でスタートアップ スクリプトを使用して、セッション構成を使用するすべてのリモート セッションでプロファイルを実行することもできます。

Windows PowerShell プロファイルの詳細については、「about_Profiles」を参照してください。 セッション構成の詳細については、「Register-PSSessionConfiguration」を参照してください。

リモート コマンドでの調整のしくみ

ローカル コンピューター上のリソースの管理に役立つWindows PowerShellには、コマンドごとに確立される同時リモート接続の数を制限できるコマンドごとの調整機能が含まれています。

既定値は 32 の同時接続ですが、コマンドレットの ThrottleLimit パラメーターを使用して、特定のコマンドのカスタム スロットル制限を設定できます。

調整機能を使用する場合は、セッション全体またはコンピューターではなく、各コマンドに適用されることを覚えておいてください。 複数のセッションまたは PSSession でコマンドを同時に実行している場合、同時実行接続の数は、すべてのセッションの同時接続の合計です。

ThrottleLimit パラメーターを持つコマンドレットを検索するには、次のように入力します。

Get-Help * -Parameter ThrottleLimit
-or-
Get-Command -ParameterName ThrottleLimit

リモート コマンドの出力はローカル出力と異なりますか?

Windows PowerShellをローカルで使用する場合は、"ライブ" .NET Framework オブジェクトを送受信します。"live" オブジェクトは、実際のプログラムまたはシステム コンポーネントに関連付けられているオブジェクトです。 メソッドを呼び出したり、ライブ オブジェクトのプロパティを変更したりすると、変更は実際のプログラムまたはコンポーネントに影響します。 また、プログラムまたはコンポーネントのプロパティが変更されると、それらを表すオブジェクトのプロパティも変更されます。

ただし、ほとんどのライブ オブジェクトはネットワーク経由で送信できないため、リモート コマンドで送信されるほとんどのオブジェクトを "シリアル化" するWindows PowerShell、つまり、各オブジェクトを一連の XML (XML [CLiXML]の制約言語) データ要素に変換して転送します。

Windows PowerShellは、シリアル化されたオブジェクトを受け取ると、XML を逆シリアル化されたオブジェクト型に変換します。 逆シリアル化されたオブジェクトは、以前のプログラムまたはコンポーネントのプロパティの正確なレコードですが、"ライブ" ではなくなります。つまり、コンポーネントに直接関連付けされなくなります。 また、メソッドは有効ではなくなったため削除されます。

通常、ライブ オブジェクトを使用するのと同じように逆シリアル化されたオブジェクトを使用できますが、それらの制限に注意する必要があります。 また、Invoke-Command コマンドレットによって返されるオブジェクトには、コマンドの発生元を特定するのに役立つ追加のプロパティがあります。

DirectoryInfo オブジェクトや GUID などの一部のオブジェクト型は、受信するとライブ オブジェクトに変換されます。 これらのオブジェクトには、特別な処理や書式設定は必要ありません。

リモート出力の解釈と書式設定の詳細については、「 about_Remote_Output」を参照してください。

バックグラウンド ジョブをリモートで実行できますか?

はい。 Windows PowerShellバックグラウンド ジョブは、セッションと対話せずに非同期的に実行されるWindows PowerShell コマンドです。 バックグラウンド ジョブを開始すると、コマンド プロンプトは直ちに戻り、長時間実行されていてもジョブの実行中はセッションで作業を続けることができます。

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

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

Windows PowerShell でのバックグラウンド ジョブの詳細については、「[about_Jobs(about_Jobs.md)]」および「[about_Remote_Jobs(about_Remote_Jobs.md)]」を参照してください。

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

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

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

リモート コンピューターで Windows プログラムを起動すると、コマンドは完了せず、プログラムが完了するまで、または Ctrl キーを押しながら C キーを押してコマンドを中断するまで、Windows PowerShellコマンド プロンプトは戻りません。 たとえば、リモート コンピューターで IpConfig プログラムを実行した場合、コマンド プロンプトは IpConfig が完了するまで戻りません。

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

たとえば、Windows PowerShell コマンドを使用してリモート コンピューターでメモ帳を実行すると、リモート コンピューターでメモ帳プロセスが開始されますが、メモ帳のユーザー インターフェイスは表示されません。 コマンドを中断してコマンド プロンプトを復元するには、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

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

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

ただし、一部の企業では、構成は多対一であり、多くのクライアント コンピューターは、ファイル サーバーやキオスクなど、Windows PowerShellを実行している単一のリモート コンピューターに接続します。 これは"ファンイン" 構成と呼ばれます。

Windows PowerShellリモート処理では、ファンアウト構成とファンイン構成の両方がサポートされます。

ファンアウト構成の場合、Windows PowerShellは Web Services for Management (WS-Management) プロトコルと、Ws-Management の Microsoft 実装をサポートする WinRM サービスを使用します。 ローカル コンピューターがリモート コンピューターに接続すると、WS-Management は接続を確立し、Windows PowerShell用のプラグインを使用して、リモート コンピューターでWindows PowerShell ホスト プロセス (Wsmprovhost.exe) を開始します。 ユーザーは、代替ポート、代替セッション構成、およびその他の機能を指定して、リモート接続をカスタマイズできます。

"ファンイン" 構成をサポートするために、Windows PowerShellはインターネット インフォメーション サービス (IIS) を使用して WS-Management をホストし、Windows PowerShell プラグインを読み込み、Windows PowerShellを開始します。 このシナリオでは、各Windows PowerShell セッションを個別のプロセスで開始する代わりに、すべてのWindows PowerShell セッションが同じホスト プロセスで実行されます。

IIS ホスティングとファンイン リモート管理は、Windows XP または Windows Server 2003 ではサポートされていません。

ファンイン構成では、ユーザーは接続 URI と HTTP エンドポイント (トランスポート、コンピューター名、ポート、アプリケーション名など) を指定できます。 IIS は、指定したアプリケーション名を持つすべての要求をアプリケーションに転送します。 既定値は WS-Management で、Windows PowerShellをホストできます。

認証メカニズムを指定し、HTTP および HTTPS エンドポイントからのリダイレクトを禁止または許可することもできます。

(ドメイン内ではなく) 1 台のコンピューターでリモート処理をテストできますか?

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

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

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

  • SP2 を使用した Windows XP:

    [セキュリティ設定] \[ローカル ポリシー]\[セキュリティ オプション] の [ネットワーク アクセス: ローカル アカウントの共有とセキュリティ モデル] ポリシーの設定を "クラシック" に変更するには、ローカル セキュリティ設定 (Secpol.msc) を使用します。

  • Windows Vista、Windows 7、Windows 8:

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

    次のWindows 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 のローカル コンピューターの信頼されたホストの一覧にリモート コンピューターを追加します。 Windows PowerShell プロンプトでコマンドを入力します。

Set-Item WSMan:\localhost\Client\TrustedHosts -Value <Remote-computer-name>

たとえば、ローカル コンピューター上の信頼されたホストの一覧に Server01 コンピューターを追加するには、Windows PowerShell プロンプトで次のコマンドを入力します。

Set-Item WSMan:\localhost\Client\TrustedHosts -Value Server01

関連項目

about_Remote

about_Profiles

about_PSSessions

about_Remote_Jobs

about_Remote_Variables

Invoke-Command

New-PSSession