VBScriptでWindowsの「健康診断」を自動化する:Microsoft.Update.Sessionの深淵
こんにちは。自動化の現場でVBScriptと長年付き合ってきたエンジニアです。
「VBScriptなんて古い」と言う人もいますが、OSの深層に触れ、管理者権限で環境を自在に操る力は、現代のどの言語にも負けない鋭さを持っています。今日は、Windows Updateが滞っている端末を即座に見抜く、「Microsoft.Update.Session」を用いた診断スクリプトの極意を伝授しましょう。
これは単なるコードのコピペではありません。Windowsの心臓部であるCOM(Component Object Model)に直接語りかける、プロの領域への入り口です。
—
1. なぜ「Microsoft.Update.Session」なのか?
Windowsには、OS自身がアップデートを管理するための強力なAPI群(Windows Update Agent API)が備わっています。これを利用すれば、GUIの「更新プログラムのチェック」ボタンをポチポチ押さずとも、プログラムが数秒で「何が足りていないか」を判断してくれます。
VBScriptでこれを行う最大の利点は、「インストール不要で、どのWindows端末でも即座に動作する」こと。これが自動化エンジニアにとっての最強の武器になります。
—
2. 未適用KB診断スクリプトの実装
以下のコードをメモ帳に貼り付け、拡張子を `.vbs` (例:`CheckUpdates.vbs`)で保存してください。
‘ Windows Update 未適用診断スクリプト
Option Explicit
Dim updateSession, updateSearcher, searchResult
Dim i, updateItem
‘ 1. セッションの作成(ここが全ての入り口です)
Set updateSession = CreateObject(“Microsoft.Update.Session”)
Set updateSearcher = updateSession.CreateUpdateSearcher()
WScript.Echo “更新プログラムを検索中…(数分かかる場合があります)”
‘ 2. 未適用の更新プログラムのみを検索(IsInstalled = 0 を指定)
Set searchResult = updateSearcher.Search(“IsInstalled=0 and Type=’Software'”)
‘ 3. 結果の集計と表示
WScript.Echo “— 診断結果: ” & searchResult.Updates.Count & ” 件の未適用プログラム —”
If searchResult.Updates.Count = 0 Then
WScript.Echo “おめでとうございます。この端末は最新です。”
Else
For i = 0 To searchResult.Updates.Count – 1
Set updateItem = searchResult.Updates.Item(i)
‘ タイトル(KB番号含む)と重要度を出力
WScript.Echo (i + 1) & “: ” & updateItem.Title
Next
End If
‘ メモリ解放の作法(VBScriptの美学です)
Set updateSearcher = Nothing
Set updateSession = Nothing
—
3. コードの「急所」を解説する
この短いコードには、VBScriptを使いこなすためのエッセンスが詰まっています。
- `CreateObject(“Microsoft.Update.Session”)`
WindowsのCOMコンポーネントを呼び出しています。VBScriptにおいて、この「外部オブジェクトの召喚」は最も重要な儀式です。
- `Search(“IsInstalled=0 …”)`
ここがこのAPIの最も賢いところです。SQLに近いクエリ言語を使って、OSに対して直接「インストールされていないものだけ持ってこい」と指示を出しています。
- `Option Explicit`
これは「変数の宣言を強制する」という、プロのエンジニアなら必ず書くべき一行です。これがないと、タイピングミスが原因のバグを探すのに一生を費やすことになります。
—
4. 陥りやすい罠と対策
現場でよくある失敗談を共有します。ここをクリアすれば、あなたはもう初学者ではありません。
1. 「権限不足」エラー:
このAPIは管理者権限を要求します。スクリプトを実行する際は、右クリックから「管理者として実行」することを忘れないでください。
2. 「応答なし」に見える現象:
検索には時間がかかります。大規模な環境では数分待たされることもあります。「フリーズした!」と焦らず、VBScriptが裏で必死に通信しているのを信じて待ってください。
3. オブジェクトの解放:
`Set obj = Nothing` を書かなくてもスクリプト終了時にメモリは解放されますが、大規模なループ処理の中でオブジェクトを生成し続ける場合は、明示的に解放しないとメモリリークの原因になります。行儀よくコードを書くことは、安定稼働の秘訣です。
—
さあ、自動化の世界へ
VBScriptは、GUIの向こう側にある「OSの真の姿」を覗き見るためのレンズです。
今回作成したスクリプトを応用すれば、全社内のPCから未適用KBをテキストファイルとして回収し、Excelで一覧化することも可能です。
まずは、このスクリプトをあなたのPCで実行してみてください。画面にずらりと並ぶKBのリストを見たとき、あなたはただのユーザーから、「システムを掌握するエンジニア」へと一歩進化しています。
何か不明な点があれば、いつでも聞いてください。応援していますよ。
