VBScriptで掌握するWindows Updateの深淵:Microsoft.Update.Sessionによる未適用KBの自動診断
レガシーシステムの保守を担うエンジニアにとって、VBScriptは単なる過去の遺物ではない。OSの深層に直接アクセスし、軽量かつ爆速でタスクを完遂させるための「最小にして最強のツール」である。
今回は、Windows Update Agent (WUA) APIを呼び出し、端末に潜む未適用KBを抽出する手法を解説する。GUIに頼らず、メモリ消費を極限まで抑えながらシステムの状態を掌握する。これこそが、アーキテクトが追求すべき自動化の真髄だ。
—
WUA API:OSの心臓部を叩く
Windows Updateは、単なるWebサービスではない。COMインターフェースとして公開された`Microsoft.Update.Session`こそが、自動化の入り口である。
このアプローチの最大の利点は、`wuauclt`やモダンな`PSWindowsUpdate`モジュールを介さずとも、OSネイティブなCOMコンポーネントを通じて直接的に更新情報を取得できる点にある。
実装の要諦とメモリの断捨離
VBScriptにおけるCOMオブジェクトの扱いで最も重要なのは「ライフサイクルの管理」だ。`CreateObject`で生成したインスタンスは、明示的に`Nothing`を代入して解放しない限り、プロセス終了までメモリを占有する。大規模な自動化では、この「塵も積もれば山となるメモリリーク」が致命傷となる。
—
未適用KB取得の核心ロジック
以下のコードは、検索結果から「未インストール」かつ「インストールが必要」な更新プログラムのみをフィルタリングし、KB番号とタイトルを抽出するスクリプトである。
‘ Option Explicitは必須。変数の未定義はバグの温床である。
Option Explicit
Dim oSession, oSearcher, oResult, oUpdate
Dim strCriteria
‘ 1. オブジェクトの生成
Set oSession = CreateObject(“Microsoft.Update.Session”)
Set oSearcher = oSession.CreateUpdateSearcher()
‘ 2. 検索条件の定義
‘ “IsInstalled=0″ は未インストール、”Type=’Software'” はドライバ等を除外するフィルタ
strCriteria = “IsInstalled=0 and Type=’Software'”
WScript.Echo “— Windows Update 診断開始 —”
‘ 3. 検索の実行(同期処理)
Set oResult = oSearcher.Search(strCriteria)
If oResult.Updates.Count = 0 Then
WScript.Echo “すべての更新プログラムは適用済みです。”
Else
WScript.Echo “未適用プログラム数: ” & oResult.Updates.Count
‘ 4. 結果のイテレーション
For Each oUpdate In oResult.Updates
WScript.Echo “KB番号/タイトル: ” & oUpdate.Title
WScript.Echo “緊急度: ” & oUpdate.MsrcSeverity
WScript.Echo “—————————-”
Next
End If
‘ 5. オブジェクトの明示的破棄(メモリリーク防止の鉄則)
Set oUpdate = Nothing
Set oResult = Nothing
Set oSearcher = Nothing
Set oSession = Nothing
WScript.Echo “診断完了。”
—
シニアエンジニアが意識すべき「現場の罠」
このスクリプトを運用に乗せる際、以下の3点には注意が必要だ。
1. 検索時間のタイムアウト問題:
WUA APIの`Search`メソッドは、WSUSやMicrosoft Updateサーバーとの通信を伴う。ネットワーク環境によってはハングアップに近い挙動を示すことがある。本番環境での自動化には、タイムアウトを制御するためのラッパー設計が不可欠だ。
2. 権限の壁:
WUA APIは管理者権限を要求する。このVBScriptをタスクスケジューラ等で実行する場合、「最上位の権限で実行する」設定を忘れてはならない。
3. プロキシ環境の考慮:
社内プロキシを介した環境では、`WinHTTP`設定がWUAに反映されているか確認が必要である。`netsh winhttp import proxy source=ie`コマンドで、システムレベルのプロキシ設定を同期させておくのが定石だ。
結びに代えて
VBScriptは古びた言語ではない。むしろ、依存関係を極限まで排除し、OSの機能美をそのままコードに落とし込める「硬派なエンジニアのための言語」だ。
今回紹介した`Microsoft.Update.Session`を起点に、ログのCSV出力や、未適用KBの自動インストール実行機能へと拡張することで、貴殿の管理するサーバー環境はより強固なものとなるだろう。
コードを書くことは、システムとの対話である。無駄なメモリを抱えず、確実な制御を行うこと。その姿勢こそが、伝説的なアーキテクトたる条件である。
