レジストリはWindows環境を司るデータベースである。これを操作することで、さまざまな管理作業をスクリプトで自動化できる。
前回に引き続きWshShellオブジェクトについて解説する。
スクリプトによるバッチ処理を行う場合、指定時刻などに無人で処理が実行されるようにすることが多い。ユーザーがインタラクティブに利用する通常のアプリケーションなら、エラー発生時や処理完了時は、それぞれを表すメッセージを画面に表示すればよいが、無人実行時にエラー・メッセージを画面表示したところで何の役にもたたない。一般にこのような場合は、メール送信やイベント・ログへの書き込みなどの方法により、状況を管理者に伝えることになる。スクリプトを利用してメール通知を行うには、CDO(Collaboration Data Objects)というコンポーネントが使える(詳細は関連記事を参照)。一方、WshShellオブジェクトのLogEventメソッドを使えば、スクリプトを利用して、任意の情報をアプリケーション・イベント・ログに記録することができる。
イベント・ログはWindows OSの各種状況をログとして記録するためのしくみで、Windows NTカーネル・ベースのOS(Windows NT、Windows 2000、Windows XP、Windows Server 2003)で利用可能だ。記録されたログの内容は、専用ツールである「イベント・ビューア」で確認できる(コントロール・パネルの[管理ツール]−[イベント ビューア]アイテムから起動する)。
画面から分かるとおり、イベントは「アプリケーション」「セキュリティ」「システム」といったカテゴリ別に記録されている(デフォルト時。サーバOSなどでは、これら以外にも「DNS サーバー」や「ディレクトリ サービス」「ファイル レプリケーション サービス」などのカテゴリが追加されていることもある)。このうちWSHスクリプトから記録できるのは「アプリケーション」カテゴリのイベント・ログである。
イベント・ログに記録される各ログには、「情報」「警告」「エラー」などの分類がある。イベント・ビューアでは、情報の種類を示すアイコンを表示することで、必要な情報を素早く見つけられるようにしている。設定可能なログの種類は以下の6種類である。(実際には、「成功」はイベント・ビューアでは「種類なし」となり、一覧表示中では「情報」として表示される)
WSHスクリプトでは、表中のこの「種類」を表す「値」と、ログに書き込む文字列をLogEventメソッドに渡すことで、アプリケーション・イベント・ログへの書き込みができる。具体的には次のようにする。
Set objShell = WScript.CreateObject("WScript.Shell")
objShell.LogEvent (種類), "(書き込む文字列)"
これだけでイベント・ログへの書き込みは完了だ。例えば次の例では、すべての種類のログを書き込んでいる。
Set objShell = WScript.CreateObject("WScript.Shell")
objShell.LogEvent 0,"成功のテストです。"
objShell.LogEvent 1,"エラーのテストです。"
objShell.LogEvent 2,"警告のテストです。"
objShell.LogEvent 4, "情報のテストです。"
objShell.LogEvent 8, "成功の監査のテストです。"
objShell.LogEvent 16, "失敗の監査のテストです。"
このコードを実行してイベント・ビューアを開くと、6個のログが追加されているのが確認できる。こうしてイベント・ログに情報を記録しておけば、イベント・ビューアを始めとするイベント・ログ関連ツールやコマンド(eventcreate.exeやeventquery.vbs、eventtriggers.exeなど。これらはWindows XP/Windows Server 2003で利用可能)を利用して、後で情報を確認したり、整理したりできる。
また、第3パラメータとしてコンピュータ名を指定することで、権限があればほかのコンピュータのイベント・ログに書き込みを行うこともできる。この機能を使う場合、コードは次のようになる。
objShell.LogEvent (種類), "(書き込む文字列)" , "(コンピュータ名)"
Windowsでは、OSの状態(起動時アプリケーション、システムに追加されたコンポーネントなど)や各種アプリケーション設定など、さまざまな情報がレジストリ(registry)と呼ばれるデータベースに保存されている。従ってこのレジストリの値を参照してOSやアプリケーションの現在の状態を知ることができるし、レジストリの値を変更してOSやアプリケーションの挙動を変えることもできる。WSHスクリプトを利用してシステム管理を行うという意味では、レジストリ操作は中心となる作業の1つだろう。
WshShellオブジェクトのRegReadメソッドやRegWriteメソッド、RegDeleteメソッドを利用することにより、WSHスクリプトからレジストリの値を取得/設定/削除することができる。
各メソッドの使い方を説明する前に、WSHスクリプトでレジストリを扱う際の基本について簡単に解説しておこう。
レジストリは、フォルダ構造と似たツリー構造となっており、特定の項目を指定するには、ルート・キーからのパスをバックスラッシュで区切って表現する。例えば「HKEY_CLASSES_ROOT\.html\Content Type」という項目は、ルート・キー「HKEY_CLASSES_ROOT」中の「.html」キーにある「Content Type」という値を示す。「キー」がフォルダ、「値」がファイルに対応すると考えれば分かりやすいだろう。
ルート・キーには下の表に示す5種類があるが、そのうち「HKEY_CURRENT_USER」「HKEY_LOCAL_MACHINE」「HKEY_CLASSES_ROOT」については「HKCU」「HKLM」「HKCR」という略記が許されている(スクリプトでも略記できる)。この略記法を使うと、例えば「HKCR\.html\Content Type」などと短い表記で項目を表すことができて便利だ。
ルート・キー | 略記 |
---|---|
HKEY_CURRENT_USER | HKCU |
HKEY_LOCAL_MACHINE | HKLM |
HKEY_CLASSES_ROOT | HKCR |
HKEY_USERS | HKEY_USERS |
HKEY_CURRENT_CONFIG | HKEY_CURRENT_CONFIG |
1つのキーには、名前のない「既定」の値が1つあり、それ以外に名前の付いた値がいくつか設定される。WSHでは、バックスラッシュで終わるパスは既定値であると認識される。例えば「HKEY_CLASSES_ROOT\.html\」は「.html」キーの既定値を示す。名前付きの値を指定する場合は末尾に「\」を付けてはならず、既定値を指定する場合には「\」を最後に付けなければならないので注意が必要である。
それぞれの値には型があり、文字列、整数、2進数値、環境変数で展開可能な文字列、文字列の配列をそれぞれ格納できる。型の一覧とVBScriptで対応する型を次の表で示す。
型名 | 意味 | VBScriptでの型 |
---|---|---|
REG_SZ | 文字列 | 文字列 |
REG_DWORD | 整数 | 整数 |
REG_BINARY | 2進数値 | 整数のVBArray |
REG_EXPAND_SZ | 展開可能な文字列 | 文字列 |
REG_MULTI_SZ | 文字列の配列 | 文字列のVBArray |
VBScriptでは、「2進数値」は1byteごとに区切られた数値の配列として扱われる(実例については後述する)。「展開可能な文字列」には「%SystemRoot%」など、環境変数を“%”で囲んだ表記が使える。最終的には、前回で解説したExpandEnvironmentStringsメソッドにより展開されて利用される。
Copyright© Digital Advantage Corp. All Rights Reserved.