【テクニカル・上級編】【システム復元ポイント作成】WMI SystemRestore クラスを活用したスクリプト実行直前の自動バックアップ制御 – VBScript (Visual Basic Scripting Edition)解析バイブル

スポンサーリンク

VBScriptで制御する「安全圏」:WMI SystemRestoreによる復元ポイントの自動生成

システム管理者にとって、大規模なバッチ処理やレガシーシステムの設定変更は、常に「破壊」と隣り合わせの緊張感を伴う。特にWSH(Windows Script Host)を用いた自動化において、スクリプトが予期せぬエラーで異常終了した際、その復旧コストは計り知れない。

今回は、VBScriptのポテンシャルを最大限に引き出し、WMI(Windows Management Instrumentation)の`SystemRestore`クラスを叩いて、スクリプト実行直前に「安全圏」を動的に確保するアーキテクチャを解説する。

1. WMI SystemRestoreという「最後の砦」

Windowsの復元ポイント機能は、バックエンドで`SystemRestore`というWMIクラスが制御している。これは単なるバックアップではなく、OSのレジストリやシステムファイルの整合性を維持するためのカーネルレベルに近い制御だ。

VBScriptからこれを叩く際、最も注意すべきは「権限」と「同期」である。WMIは非同期呼び出しが基本だが、本稿ではスクリプトの整合性を保つため、同期実行の作法を徹底する。

2. 実装:SystemRestore制御スクリプト

以下のコードは、単なるスニペットではない。オブジェクトのライフサイクル管理と、システムリソースを解放する際の「作法」を盛り込んだ実戦仕様である。

‘ —————————————————————————
‘ Script Name: CreateRestorePoint.vbs
‘ Description: 実行直前にシステム復元ポイントを生成する管理用ルーチン
‘ —————————————————————————
Option Explicit

‘ 定数定義:Windows XP/7/10/11共通のSystemRestore定数
Const BEGIN_SYSTEM_CHANGE = 100
Const RESTORE_POINT_TYPE_CLIENT_EVENT = 0

Call Main()

Sub Main()
Dim objService, objSystemRestore, intResult

‘ WMI接続:root\default名前空間へ接続
Set objService = GetObject(“winmgmts:{impersonationLevel=impersonate}!\\.\root\default:SystemRestore”)

‘ 復元ポイント作成の実行
‘ CreateRestorePoint(説明文, イベントタイプ, 変更タイプ)
‘ 戻り値 0 は成功を意味する
intResult = objService.CreateRestorePoint(“Automated_Backup_By_VBScript”, RESTORE_POINT_TYPE_CLIENT_EVENT, BEGIN_SYSTEM_CHANGE)

If intResult = 0 Then
WScript.Echo “Success: Restore point created.”
Else
‘ ここでエラーハンドリングを厳格に行うことがシニアの責務
WScript.Echo “Error: Failed to create restore point. Code: ” & intResult
WScript.Quit 1
End If

‘ オブジェクトの明示的解放
‘ VBScriptのGCは必ずしも即時ではない。大規模ループ内で多用する場合は必須
Set objService = Nothing
End Sub

3. チーフアーキテクトが語る「極限の知見」

① オブジェクトのライフサイクルとメモリ解放

VBScriptにおいて `Set obj = Nothing` を書かないエンジニアがいるが、これはメモリリークを招く悪手だ。特にWMIオブジェクトはCOMインターフェースをラップしているため、参照カウントが残るとバックエンドの`WmiPrvSE.exe`(WMIプロバイダホスト)が肥大化し続ける。大規模環境では、処理終了ごとに確実にメモリを解放せよ。

② 実行権限の壁

WMI `SystemRestore`を操作するには、管理者権限での実行が不可欠である。VBScript自体に昇格機能はないため、実行用のラッパースクリプト(PowerShellで`Start-Process -Verb RunAs`を呼ぶなど)を介して呼び出すのが、レガシー環境における最も堅牢な設計パターンとなる。

③ パフォーマンスへの配慮

復元ポイントの生成には、ディスクI/OとCPU負荷が伴う。これをメインの処理ループ内で何度も呼び出すのは愚の骨頂だ。あくまで「スクリプト全体の開始前」という、クリティカルセクションの入り口でのみ使用すること。

結論

VBScriptは「古い」と言われるが、Windows OSの深層部を叩くためのインターフェースとしては、依然として極めて軽量かつ強力だ。WMIと適切に向き合うことで、現代の複雑なクラウドネイティブな環境においても、ローカルの安全性を担保する「番犬」としての役割を十分に果たせる。

技術に新旧はない。あるのは「使いこなせるか、否か」だけだ。次回の自動化タスクでは、この復元ポイント生成を標準装備とし、君のスクリプトを「壊れないプログラム」へと昇華させてほしい。