連載
» 2009年10月15日 00時00分 公開

Windows Server 2008 R2の真価:第3回 進化したPowerShell 2.0 (3/4)

[牟田口大介(Microsoft MVP for Data Center Management - PowerShell),著]

進化したPowerShell 2.0

 PowerShellはVer.2.0になってさまざまな機能が追加された。PowerShell 2.0はPowerShell 1.0の上位互換なので、1.0の機能を完全に内包している。そのため、1.0をすでに習熟している人は新たな要素を概観することで2.0をも楽に習熟することが可能であろう。もちろん、1.0をまだ習熟していなかった人も、前ページの内容とこのページで紹介する2.0の新機能を併せて読むことで、PowerShell 2.0の全貌を概観することができるだろう。それではこれから2.0の新機能のうち重要なものを紹介しよう。

バックグラウンド処理とリモート機能

 PowerShell 1.0では、時間のかかる処理をバックグラウンドで走らせて、その間に別の処理(ユーザーがコンソールで行う処理、あるいはスクリプト中で実行される別の処理)を行うことができなかった。それがPowerShell 2.0では新たに追加された*-Jobコマンドレットを用いることで可能となった。

Start-Job {<実行する処理>}

のようにすると、<実行する処理>に書かれた内容がバックグラウンドで非同期に実行される。このようにして起動したバックグランド・ジョブが実行されている間も、ユーザーがコマンドを入力したり、スクリプト中で次の処理を実行したりすることが可能となる。バックグラウンド・ジョブは複数起動することもでき、それらの一覧および実行状況(実行中か、終了したか、など)はGet-Jobコマンドレットにより取得できる。ジョブが終了するとReceive-Jobコマンドレットで、バックグラウンド・ジョブの出力結果を受け取り、表示することが可能となる。

バックグラウンド・ジョブ処理
Start-Jobでバックグランド・ジョブを開始後、Get-Jobでジョブの稼働状況をチェックし、結果をReceive-Jobで受け取る。

 またPowerShell 1.0ではWMIに関してのみ同期リモート処理が可能であったものの、任意の処理をリモート・サーバ上で実行させるための仕組みがなかった。これがPowerShell 2.0ではPSRemotingという機能が追加されることで実現可能となった。

 PSRemotingはWinRM 2.0というWS-Management(異なるコンピュータ間で通信を行い、管理情報の取得、あるいはリモート操作を行うための共通規格)のMicrosoft版の実装を用いて通信を行う。WinRM 2.0は通信の認証にKerberos認証を用いるため、通常は操作する側と操作される側の両方が同一のActive Directoryドメインに属していることが必要となる。さらに操作される側では、PSRemotingのリスナとしてシステムを構成する必要がある。これはEnable-PSRemotingコマンドレットを用いると容易に行える。このコマンドレットを実行することで、WinRM サービスが自動実行されるようになり、リスナ・ポート(TCP 80番)が解放されコマンド要求を待ち受けるようになる(操作する側はリスナにする必要はないが、当然だがPowerShell 2.0がインストールされている必要がある)。

 環境が整えば、操作する側からInvoke-Commandコマンドレットを用いることで、リスナにしたサーバに対して任意の処理を実行できる。Invoke-Commandコマンドレットは複数のリスナに対し、同時に同じ処理を実行させることもできる。通常は同期処理がされ、実行が終了するまで待機するが、-asJobパラメータを指定することで、処理をサーバ上のバックグラウンド・ジョブとして非同期実行させることもできる。

 さらにNew-PSSessionというコマンドレットを用いると、リモート・サーバ上にPSSessionと呼ばれる固定接続セッション(これはPowerShellのインスタンスそのものと考えて差し支えない)を作成し、同じPSSessionに対して何度もInvoke-Commandコマンドレットで処理を実行できる。Enter-PSSessionコマンドレットを用い、PSSessionに入ることで、対話型のコマンド実行も可能になる。

リモートのPowerShellを対話的に操作する例
New-PSSessionというコマンドレットを用いると、リモート・サーバ上にPSSessionと呼ばれる固定接続セッションを作成して、同じPSSessionに対して何度もInvoke-Commandコマンドレットで処理を実行できる。ここではWindows 7クライアントから実施している。
  (1)リモート・サーバのコンピュータ名を指定してPSSessionを作成する(検証した環境では認証が必要なため、Get-Credentialコマンドレットを併用し、認証用ダイアログを表示させている)。
  (2)PSSessionが作成され、現在のPSSessionの一覧が表示される。
  (3)Enter-PSSessionコマンドレットにより、先ほど作成したPSSessionに入る。
  (4)プロンプトの先頭に「[<リモート・サーバ名>]: 」が付加され、リモートのPowerShellの操作をしていることが分かる。ここで入力しているコマンドレットはリモート・サーバ上で実行されている。なお、PSSessionを抜けるにはexitと入力する。

モジュール機能

 PowerShell 2.0では「モジュール」の機能がサポートされた。これにより複数のスクリプト・ファイルから実行したい共通処理群、あるいはコンソールから何度も実行したい処理群を、モジュールとして1つにまとめることが可能となった。PowerShell 1.0でも、スクリプト・ファイルをほかのスクリプト・ファイルから読み込んだり、コンソールに読み込んだりすることで、そこに定義された関数などを実行することが可能であったが、モジュールではスクリプト・ファイルのみならず、コマンドレットやPSプロバイダを含むDLLファイル、ヘルプ・テキストなどを複数含むことができる

 PowerShell 1.0ではコマンドレットやPSプロバイダを追加するにはPSスナップインというDLLファイルをInstallUtil.exeというコマンドでシステムにインストールしたうえ、利用する際にはAdd-PSSnapinコマンドレットを用いる必要があった。


 モジュールの実体は、powershell.exeが置かれているフォルダ内のModulesフォルダに含まれているファイル群である。例えば、PowerShell 2.0にデフォルトで付属するPSDiagnosticsという診断ツール群は、「%windir%\system32\WindowsPowerShell\v1.0\Modules\PSDiagnostics」に含まれる。このフォルダ名がモジュール名となり、中にモジュールの本体が含まれている。その中に含まれる.psm1ファイルはPowerShellスクリプトでモジュールを記述するための専用の拡張子を持ったファイルだ。

モジュールの例
これはPSDiagnosticsモジュールの例。PSDiagnostics.psm1の先頭部分。

 なお、ここには関数が記述されているが、これらはただの関数ではなく、これもPowerShell 2.0で新しく追加された機能である「Advanced Functions」である。この機能はPowerShell 2.0の開発時にはScript Cmdletと呼ばれていたもので、文字通りPowerShellスクリプトでコマンドレットを記述するための仕組みである。従来はコマンドレットを作成するには、プログラム言語であるC#を用いる必要があったが、PowerShellの関数の機能を拡張させたことで、PowerShellスクリプトを用いてコマンドレットを記述することも可能になったのである。

 タスク・バー・アイコンをクリックしてPowerShellを起動した場合、モジュールはロードされないので、必要に応じてImport-Moduleコマンドレットを用い、読み込む必要がある。これが手間ならば、プロファイル(PowerShell起動時に実行されるスクリプト・ファイル)に記述しておくか、PowerShellのショートカットに実行時パラメータとして記述することも可能だ。後者の方法では、「○○モジュールを読み込むPowerShell」のような形で複数のショートカットを使い分けることもできる。逆に使用可能なモジュールをすべて読み込んだ状態で起動することも可能で、その場合は[スタート]メニューの[管理ツール]−[Windows PowerShell Modules]のショートカットもしくはタスク・バーのジャンプ・リストの[システム モジュールをインポートする]を利用する。

 さて、Windows Server 2008 R2にはPowerShell 2.0付属のモジュール以外にも、Windows Server 2008 R2独自のモジュールがいくつか存在する。その中でも使用頻度が高いと思われる2つを紹介しよう。

1.Active Directory モジュール
 Active Directory モジュールにはActive Directoryを簡便に管理するためのコマンドレット群およびPSプロバイダが含まれている。Active Directory ドメイン サービスの役割を追加することで使用可能になる。利用するにはコンソールまたはスクリプト内で

Import-Module ActiveDirectory

を実行する。あらかじめこのモジュールが読み込まれたPowerShellを実行するには、[スタート]メニューの[管理ツール]−[Windows PowerShell 用の Active Directory モジュール]のショートカットを利用する。このモジュールの詳細に関しては、今後、Windows Server 2008 R2のActive Directory機能の解説時に取り上げる予定である。

2.Web Administration モジュール
 Web Administration モジュールにはIISを簡便に管理するためのコマンドレット群およびPSプロバイダが含まれている。Webサーバーの役割を追加することで使用可能となる。利用するにはコンソールまたはスクリプト内で

Import-Module WebAdministration

を実行する。先ほど述べたWindows PowerShell Modulesを使うことでも使用可能だが、この場合、システムのスクリプト実行を許可しておく必要がある。それにはあらかじめ管理者権限でPowerShellを起動し、

Set-ExecutionPolicy RemoteSigned

を実行する。これによって、スクリプト実行ポリシーがシステムのデフォルトである「Restricted(不許可)」から「RemoteSigned(ローカルにあるスクリプトは無条件に実行可能、リモートにあるスクリプトは署名されているもののみ実行可能)」になり、「Windows PowerShell Modules」を正しく実行できる(TIPS「PowerShellスクリプトの実行セキュリティ・ポリシーを変更する」参照)。

Copyright© Digital Advantage Corp. All Rights Reserved.

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。