【入門編】【レジストリ改変リアルタイム検知】WMI RegistryTreeChangeEvent による特定レジストリキー監視と自動復旧 – VBScript (Visual Basic Scripting Edition)解析バイブル

スポンサーリンク

VBScriptでレジストリを「守護」する:WMIイベント駆動型のリアルタイム監視術

こんにちは。自動化の世界へようこそ。
普段、Excelマクロの記録から一歩踏み出し、「システムそのものを制御したい」と願うエンジニアの皆さん。今日はVBScriptを使って、Windowsの心臓部である「レジストリ」を不正な改変から守る、「リアルタイム監視・自動復旧システム」を構築しましょう。

多くの初心者が「ポーリング(一定時間ごとに値を確認しに行く)」という非効率な方法を選びますが、それはCPUを無駄に浪費する愚策です。今回は、WMI(Windows Management Instrumentation)の真髄である「イベント駆動」を使い、OSが変更を検知した瞬間に介入するプロの技術を伝授します。

1. なぜ「ポーリング」ではなく「イベント監視」なのか

皆さんがVBScriptで何かを監視しようとしたとき、まず思いつくのは`Do…Loop`の中に`Sleep`を入れる方法かもしれません。しかし、それは「泥棒が入っていないか、1分おきに玄関を見に行く」のと同じです。

今回紹介する `RegistryTreeChangeEvent` を使えば、「泥棒がドアノブに触れた瞬間に警報を鳴らす」ことができます。これがプロの自動化です。

2. 実装コード:レジストリの「番人」

このスクリプトは、特定のレジストリキーを監視し、変更が検知された瞬間に元の値へ書き戻すという「自己修復機能」を持っています。

‘ 監視対象のレジストリパスと値(適宜書き換えてください)
Const MONITOR_PATH = “SOFTWARE\MySecretApp”
Const TARGET_KEY = “Enabled”
Const CORRECT_VALUE = 1

Set objWMIService = GetObject(“winmgmts:{impersonationLevel=impersonate}!\\.\root\default”)

‘ WMIの監視クエリを生成(レジストリ変更イベントをリクエスト)
query = “SELECT FROM RegistryTreeChangeEvent ” & _
“WHERE Hive = ‘HKEY_LOCAL_MACHINE’ ” & _
“AND RootPath = ‘” & MONITOR_PATH & “‘”

‘ 非同期イベントリスナーの設定
Set eventSink = WScript.CreateObject(“WbemScripting.SWbemSink”, “SINK_”)
objWMIService.ExecNotificationQueryAsync eventSink, query

WScript.Echo “監視を開始しました。この画面を閉じないでください。”
‘ 無限ループでイベントを待ち受ける(ここが心臓部です)
Do
WScript.Sleep 1000
Loop

‘ イベントが発生したときに呼び出されるサブルーチン
Sub SINK_OnObjectReady(objEvent, objContext)
WScript.Echo “変更を検知!自動復旧を実行します…”

‘ WScript.Shellを使って値を強制書き戻し
Set WshShell = CreateObject(“WScript.Shell”)
WshShell.RegWrite “HKLM\” & MONITOR_PATH & “\” & TARGET_KEY, CORRECT_VALUE, “REG_DWORD”

WScript.Echo “復旧完了。”
End Sub

3. コードのポイントと陥りやすい罠

このコードを動かす上で、いくつか「知っておくべき極意」があります。

① 権限の壁(管理者特権)

レジストリの `HKEY_LOCAL_MACHINE` を監視・修正する場合、スクリプトには管理者権限が必要です。

  • 対策: スクリプトを直接ダブルクリックするのではなく、コマンドプロンプトを「管理者として実行」してから `cscript script.vbs` と打ち込んでください。

② WMIは「非同期」である

`ExecNotificationQueryAsync` メソッドを使っています。「Async」は「非同期」を意味します。スクリプトが停止せずに背後で待機し続けるため、`Do…Loop`によるメインスレッドの維持が不可欠です。これを忘れると、スクリプトは一瞬で終了してしまいます。

③ レジストリパスの記述ルール

WMIのレジストリプロバイダは、パス指定に少々癖があります。`HKEY_LOCAL_MACHINE` は `HKEY_LOCAL_MACHINE` と書くのがルールですが、`WScript.Shell` の `RegWrite` で書き戻す際は `HKLM` と省略しても通ります。この微妙な揺らぎが初心者を悩ませるポイントです。

4. さあ、次のステップへ

このスクリプトをマスターすれば、皆さんは「Windowsの動作を監視するエージェント」を書けるようになったと言えます。

次の課題:
今のコードでは「復旧」しか行っていませんが、これを応用して「ログファイルに誰がいつ変更したか記録する」あるいは「管理者へメールを飛ばす」という機能を付け加えてみてください。

VBScriptは「古い言語」と揶揄されることもありますが、OSの深いレイヤーに直接触れられる、非常に強力で軽量なツールです。この「監視」の考え方を身につければ、将来的にPowerShellやPythonへステップアップした際も、圧倒的な理解速度の違いを感じるはずです。

さあ、あなたの環境でこの「番人」を走らせてみてください。何か詰まったら、いつでも戻ってきてくださいね。応援しています!

タイトルとURLをコピーしました