PowerShell が提供する最も優れた機能の 1 つは、サーバーをリモートで管理できることです。複数のファイルを一度に管理することもできます。
このシリーズの以前の記事を必ずお読みください。
今週はシリーズの残りの部分もお楽しみに。
リモーティングとは何ですか?
サーバーの一括管理は面倒な場合があります。これまでに 50 台の Web サーバーで IIS 構成を変更しなければならなかったことがあれば、私の言いたいことがわかるでしょう。このような状況では、PowerShell リモート処理と言語のスクリプト機能が役に立ちます。 PowerShell Remoting では、HTTP またはより安全な HTTPS を使用して、ネットワーク上のリモート マシンにコマンドを送信できます。次に、マシンがコマンドを実行して出力を送り返し、その出力が画面に表示されます。
技術的なことを学びましょう
PowerShell Remoting の中核には、単一の Windows サービス、Windows リモート管理 (WinRM サービス) として知られるようになりました。 WinRM を使用すると、1 つ以上のセッション構成 (エンドポイントとも呼ばれます) をセットアップできます。セッション構成は基本的に、リモート PowerShell インスタンスに接続するユーザーに提供するエクスペリエンスに関する情報を含むファイルです。具体的には、セッション構成ファイルを使用して、インスタンスに接続できるユーザーと接続できないユーザー、実行できるコマンドレットとスクリプト、およびセッションを実行する必要があるセキュリティ コンテキストを定義できます。 WinRM サービスを使用して、受信 PowerShell 要求をリッスンする「リスナー」もセットアップします。これらの「リスナー」は HTTP または HTTPS のいずれかであり、マシン上の単一の IP アドレスにバインドできます。別のマシンへの PowerShell 接続を開くと (技術的には、これは HTTP に基づく WS-MAN プロトコルを使用して行われます)、接続はこれらの「リスナー」の 1 つにバインドされます。 「リスナー」は、適切なセッション構成ファイルに関連付けられたアプリケーションにトラフィックを送信する役割を果たします。アプリケーション (通常は PowerShell ですが、必要に応じて他のホスティング アプリケーションを使用することもできます) がコマンドを実行し、その結果が「リスナー」を介してネットワーク経由でマシンにフィードバックされます。
どうするか教えて
最初に行う必要があるのは、接続先のマシンでリモート処理を有効にすることです。これは、次のコマンドを実行することで実行できます。
Enable-PSRemoting
すべてのプロンプトに対して「はい」と答える必要があります。 Enable-PSRemoting を実行すると、PC にいくつかの変更が加えられます。
- WinRM サービスが起動します。
- WinRM サービスが手動起動モードから自動起動モードに変わります。
- すべてのネットワーク カードにバインドされる HTTP リスナーを作成します。
- また、WS-MAN プロトコルの受信ファイアウォール例外も作成されます。
- いくつかのデフォルトのセッション構成が作成されます
Windows 7 を実行していて、ネットワーク カードの場所がパブリックに設定されている場合、PowerShell リモート処理を有効にすると失敗します。これを修正するには、自宅または職場のネットワークの場所に切り替えるだけです。あるいは、次の方法を使用してネットワーク チェックをスキップすることもできます。
Enable-PSRemoting –SkipNetworkProfileCheck
ただし、ネットワークの場所を変更することをお勧めします。
PowerShell を使用して別のマシンに接続するには 2 つの方法があります。 SSH の使用によく似た 1 対 1 の方法と、1 対多の方法があります。
PowerShell セッションの使用
PowerShell を使用してリモート マシンに接続する最初の方法は、PowerShell セッションと呼ばれるものを使用することです。簡単に言うと、セッションを使用すると、自分のマシンで行うのとほぼ同じように、リモート マシン上で対話型の方法でコマンドを実行できます。セッションを開くには、次のように入力するだけです。
Enter-PSSession –ComputerName “Darlah”
プロンプトには、コマンドレットを実行しているマシンを示すプレフィックスが付けられます。
ここからは、実際にリモート マシンの前に座っているかのようにプロンプトを扱うことができます。たとえば、C:\ ドライブ上のすべてのファイルを表示したい場合は、次の簡単な操作を行うことができます。
Get-ChildItem – パス C:\
Linux を使用している場合は、SSH の代わりに PowerShell としてこの 1 対 1 のリモート処理方法を使用することを考えることができます。
Invoke-Command の使用
リモート マシンで PowerShell を使用する 2 番目の方法は、Invoke-Command を使用することです。 Invoke-Command を使用する利点は、複数のマシンで同じコマンドを同時に実行できることです。ご想像のとおり、これはサーバーからイベント ログを収集するようなことを行う場合に特に便利です。 Invoke-Command は次の構文に従います。
Invoke-Command -ComputerName Darlah,localhost -ScriptBlock {Get-EventLog Application -Newest 2}
コマンドはすべてのマシンで並行して実行されるため、特定の結果がどの PC から来たのかを確認する何らかの方法が必要になります。これを行うには、PSComputerName プロパティを調べます。
Invoke-Command を使用すると、パイプラインに予期されるオブジェクトが存在しなくなります。 PowerShell がリモート マシンから情報を取得して自分のマシンに戻すには、リモート マシン上で実行したコマンドが出力するオブジェクトを表す何らかの方法が必要です。最近では、階層データ構造を表現するために XML を使用することが選ばれているようです。つまり、Invoke-Command を使用してコマンドを発行すると、結果はマシンに送り返される前にまず XML にシリアル化されます。それらがマシンに戻ると、逆シリアル化されてオブジェクトに戻されます。ここでの問題は、逆シリアル化されると、ToString() メソッドを除く、オブジェクトが持っていたすべてのメソッドがオブジェクトから削除されることです。
注: このルールにはいくつかの例外があります。たとえば、整数などのほとんどのプリミティブ型は、そのメソッドを含めて逆シリアル化できます。いくつかのメソッドを逆シリアル化されたオブジェクトに追加し直すことができる、リハイドレーションと呼ばれるプロセスもあります。したがって、Get-Member があなたの友達であることを忘れないように注意してください。





