about_Remote_FAQ

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

トピック

about_Remote_FAQ

概要

Windows PowerShell® のリモート コマンドの実行に関する質問と回答を示します。

詳細説明

リモートでコマンドを入力する場合は、あるコンピューター (「ローカル コンピューター」と呼びます) 上の 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 を実行しているコンピューターをリモートで相互に接続して、リモート コマンドを実行できます。ただし、一部の機能 (セッションから切断して再接続する機能など) は両方のコンピューターで Windows PowerShell 3.0 が実行されている場合にのみ動作します。

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

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

リモート処理はどのように動作しますか。

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

Windows PowerShell は、コマンドを送信して出力を受信するために WS-Management プロトコルを使用します。WS-Management プロトコルの詳細については、MSDN (Microsoft Developer Network) ライブラリの WS-Management プロトコルに関するページ (https://go.microsoft.com/fwlink/?LinkId=144634) を参照してください。

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 はその接続を使用して現在のコマンドのみを実行し、接続を閉じます。これは、単一のコマンドや関連性のない複数のコマンドを多くのリモート コンピューターで実行するための非常に効率的な方法です。

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

しかし、ほとんどのライブ オブジェクトはネットワーク経由で送信できないため、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_Remote_Jobs」を参照してください。

リモート コンピューターで 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-SessionConfigurationFile コマンドレットでテキスト ファイルを使用してカスタム セッション構成を作成できます。このファイルには、言語モードを設定するためのオプションと、そのセッション構成を使用するセッションで使用できるコマンドレットとモジュールを指定するためのオプションが含まれています。

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

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

        Get-Command *PSSessionConfiguration

ファンイン構成およびファンアウト構成とは何ですか。トピック

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

しかし、企業によっては、多くのクライアント コンピューターが Windows PowerShell を実行している 1 台のリモート コンピューター (ファイル サーバーやキオスクなど) に接続する多対 1 の構成になります。これは、"ファンイン" 構成と呼ばれます。

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 は、指定されたアプリケーション名を含むすべての要求をそのアプリケーションに転送します。既定は、Windows PowerShell をホストできる WS-Management です。

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

(ドメイン内にない) 単独のコンピューターでリモート処理をテストできますか。

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

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

注意:これらの設定によって、システム上のすべてのユーザーが影響を受け、場合によってはシステムが悪意のある攻撃を受けやすくなります。これらの変更を行うときは注意してください。

Windows XP SP2 の場合:

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

Windows Vista、Windows 7、Windows 8 の場合:

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

次の Windows PowerShell コマンドを使用して、このエントリを追加できます。

        New-ItemProperty `
        –Path HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System `
        –Name LocalAccountTokenFilterPolicy –propertyType DWord –Value 1

Windows Server 2003、Windows Server 2008、Windows Server 2012、Windows Server 2012 R2 の場合:

[ネットワークアクセス: ローカル アカウントの共有とセキュリティ モデル] の既定の設定が [クラシック] であるため、変更の必要はありません。変更されている場合もあるので、設定を確認してください。

別のドメイン内のコンピューターでリモート コマンドを実行できますか。

はい。通常、コマンドはエラーなしで実行されますが、Invoke-Command、New-PSSession、または Enter-PSSession コマンドレットの Credential パラメーターを使用してリモート コンピューター上の Administrators グループのメンバーの資格情報を指定する必要があります。これは、現在のユーザーがローカルおよびリモート コンピューターの 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