Windows PowerShell: 暗黙的なリモート処理

Don Jones

Windows PowerShell 2.0 には、簡単に環境の柔軟性を大幅に高められる機能がありますが、この機能については、ほとんど知られていません。社内の大半のクライアント コンピューターで Windows XP が実行され (これは、今でもごく一般的なシナリオです)、ドメイン コントローラーでは、Windows Server 2003 が実行されているとしましょう。

どちらの OS にも対応した Windows PowerShell 2.0 を入手することは可能ですが、Windows Server 2008 R2 付属の Active Directory モジュールなど、新しい Windows PowerShell コマンドレットのモジュールの一部は使用できない可能性があります。このようなモジュールは、以前のバージョンの Windows で動作しません。

ですが、問題ありません。社内にある 1 台のコンピューターに Windows 7 か Windows Server 2008 R2 をインストールすれば、このようなモジュールを使用できるようになります (Active Directory モジュールは、このどちらのバージョンでも動作します)。たとえば、Windows Server 2008 R2 を実行している 1 台のドメイン コントローラーを導入することもできます。Windows Server 2008 R2 ドメイン コントローラーを導入すると、Active Directory モジュールと、このモジュールの通信に使用する Active Directory 管理ゲートウェイ サービスの両方が提供されるようになります。このゲートウェイ サービスをダウンロードして、Windows Server 2008 や Windows Server 2003 にインストールします。

Windows PowerShell で Enable-PSRemoting コマンドレットを実行して、この新しいドメイン コントローラーでリモート処理と WinRM を有効にします。後は、Windows XP クライアント コンピューターで Windows PowerShell 2.0 を起動すれば、便利な機能を使用する準備完了です。

モジュールを作成する

まず、次のコマンドを実行して、新しいドメイン コントローラーへのリモート処理セッションを確立します。

$session = New-PSSession -computerName my-new-dc

もちろん、実際に使用する場合は my-new-dc の代わりに適切なコンピューター名を指定してください。代替の資格情報や代替の WinRM ポートなど、他のパラメーターを指定することもできます。詳細については、help new-pssession コマンドレットを実行してください。

次に、前の手順で指定した Windows PowerShell のリモート インスタンスに対し、次のコマンドを実行して、Active Directory コマンドレットを読み込むように指示します。

Invoke-command { import-module activedirectory } -session $session

ここからがすばらしい部分です。次のコマンドを実行して、Windows PowerShell のローカル インスタンスで、リモート セッションからクライアント コンピューターのローカル モジュールに Active Directory コマンドレットをエクスポートします。

Export-PSSession -session $session -commandname *-AD* -outputmodule RemAD -allowclobber

このコマンドでは、新しい Windows PowerShell モジュールを作成し、Documents フォルダーの WindowsPowerShell\Modules\RemAD フォルダーに保存します。*-AD* というパターンに一致する名前のコマンドレットだけがエクスポート対象に含まれます。これが、ほとんどのアドイン コマンドレットで、"AD" などのなんらかのプレフィックスがコマンドレット名の一部として使用されている最大の理由の 1 つです。このようにすると、特定の種類のコマンドレットだけを簡単に取得できます。

実際には、コマンドレットがローカル コンピューターにコピーされるわけではありません。ローカルに作成されたモジュール サービスは、一種のショートカットとして機能します。コマンドレットは必ずリモートのドメイン コントローラーで実行されますが、ユーザーにはローカルで実行されているように見えます。

コマンドレットを使用する

まず、次のコマンドを実行して、リモート ドメイン コントローラーへのセッションを削除します。

Remove-PSSession -session $session

続いて、次のコマンドを実行して、新しいモジュールを読み込みます。

Import-Module RemAD -prefix Rem

このコマンドでは、新しいモジュールをメモリに読み込み、このモジュールに含まれるすべてのコマンドレットの名前に Rem というプレフィックスを追加します。このプレフィックスは、これらのコマンドレットがリモートで実行されることを忘れないようにするのに役立ちます。任意のプレフィックスを追加できますが、私は普段リモート (Remote) で実行することを表す際には R や Rem などを使用しています。

次のコマンドを実行して、リモート コマンドレットのヘルプを参照してみましょう。

Help New-RemADUser

ローカル コンピューターと、これらのリモート コマンドレットが存在するドメイン コントローラーの間でアクティブなリモート処理セッションが確立されていないため、エラーが表示されます。リモート処理セッションを明示的に開始する必要はありません。次のようにいずれかのリモート コマンドレットを実行すると、暗黙的にリモート セッションを開始できます。

Get-RemADUser -filter "Name -like 'D*'"

このコマンドレットでは、ドメイン コントローラーへのリモート接続を再度インスタンス化し、実行するコマンドを送信して、ドメイン コントローラーでコマンドを実行します。続いて、名前が D で始まるすべてのユーザーを XML にシリアル化し、ネットワーク経由でローカル コンピューターに転送します。ローカル コンピューターでは、これらのユーザーのシリアル化を解除して、Windows PowerShell のパイプラインで操作できるオブジェクトに戻します。これで、リモート セッションがアクティブになったので、次のコマンドを実行して、ヘルプを参照できるようになります。

Help New-RemADUser

シェルのインスタンスを閉じるか次のコマンドレットでモジュールを削除するまで、セッションはアクティブな状態が維持されます。

Remove-Module RemAD

任意のリモート コマンドレットにアクセスして管理する

暗黙的なリモート処理を使用すると、リモート コンピューターでしか提供されていないコマンドレットを簡単に使用できるようになります。暗黙的にリモートで実行されたコマンドレットの動作は、ローカルにインストールした場合とほとんど同じです。このため、必要なときにいつでもこのようなコマンドレットを使用できます。リモート処理セッションにはローカル コンピューターやリモート コンピューターで必要なオーバーヘッドがほとんどないので、これは分散コンピューティングを実現する非常に実用的な手法です。

Don Jones は、Concentrated Technology の創設者で、ConcentratedTech.com (英語) で Windows PowerShell や他のテクノロジに関する質問に答えています。また、Nexus.Realtimepublishers.com (英語) の創設者でもあり、このサイトでは、彼の多くの著書が無料でオンライン ブックとして提供されています。

関連コンテンツ