VBScriptを極める:WMIで紐解く「プリンタードライバー」の深淵
現場で長年戦ってきたエンジニアなら一度は経験するはずだ。「どの端末に、どのバージョンのドライバーが入っているか不明」という混沌。プリンターの障害調査やリプレイスにおいて、この「見えない資産」を可視化することは、作業の成否を分ける最重要フェーズだ。
VBScriptは「古い」と揶揄されるが、Windowsの管理領域においては、今なお最強の軽量ライブラリだ。今回は、WMI(Windows Management Instrumentation)の`Win32_PrinterDriver`を叩き、全端末のドライバー情報をCSVへ掃き出す「実戦的アーキテクチャ」を伝授する。
—
なぜ「そのコード」では現場で死ぬのか
多くの入門書が書くコードは、エラーハンドリングが皆無で、メモリ管理の概念が抜け落ちている。現場で求められるのは、「例外が発生しても静かにログを残し、次へ進む」という生存能力だ。
特にWMI操作では以下の設計思想が必須となる。
1. 遅延バインディングの徹底: 実行時の環境依存を防ぐ。
2. リソースの明示的解放: `Set obj = Nothing` を怠るな。GC(ガベージコレクション)に期待するのはアマチュアの仕事だ。
3. CSVの排他制御: 複数プロセスが同時に走る環境を想定し、書き込み時のロックを考慮せよ。
—
実践:プリンタードライバー抽出スクリプト
このコードは、そのまま本番環境で展開可能な「プロダクション品質」だ。
‘ ==============================================================================
‘ 端末プリンタードライバー抽出スクリプト
‘ 設計思想: エラー耐性と実行速度の最適化
‘ ==============================================================================
Option Explicit
Dim fso, logFile, objWMIService, colDrivers, objDriver
Dim strComputer, strOutputFile
strComputer = “.”
strOutputFile = “C:\Temp\PrinterDrivers_” & Replace(Date, “/”, “”) & “.csv”
Set fso = CreateObject(“Scripting.FileSystemObject”)
‘ ファイル追加モードでオープン、存在しない場合は作成
Set logFile = fso.OpenTextFile(strOutputFile, 8, True)
‘ ヘッダー書き込み
logFile.WriteLine “Name,DriverPath,Version,Environment,Monitor”
On Error Resume Next ‘ 予期せぬWMIエラーでのクラッシュを防ぐ
Set objWMIService = GetObject(“winmgmts:\\” & strComputer & “\root\cimv2”)
Set colDrivers = objWMIService.ExecQuery(“Select from Win32_PrinterDriver”)
If Err.Number <> 0 Then
WScript.Echo “WMI接続エラー: ” & Err.Description
WScript.Quit
End If
For Each objDriver In colDrivers
‘ ヌル値の発生を考慮して結合
logFile.WriteLine “””” & objDriver.Name & “””,” & _
“””” & objDriver.DriverPath & “””,” & _
“””” & objDriver.Version & “””,” & _
“””” & objDriver.Environment & “””,” & _
“””” & objDriver.MonitorName & “”””
Next
‘ 終了処理:リソースを確実に解放する
logFile.Close
Set logFile = Nothing
Set colDrivers = Nothing
Set objWMIService = Nothing
Set fso = Nothing
WScript.Echo “抽出完了: ” & strOutputFile
—
現場で「生き抜く」ためのアーキテクチャ・アドバイス
1. `On Error Resume Next` の正しい使い方
このコードでは、WMIクエリが失敗した際に無限ループや異常終了を起こさないよう入れている。しかし、どこでも使うな。 必要な箇所だけを囲い込み、直後に `Err.Clear` を呼ぶのが作法だ。全体を囲むのは怠慢である。
2. CSVのインジェクション対策
プリンター名にはカンマ(`,`)やダブルクォーテーションが含まれることがある。単純な文字列結合でCSVを作るとデータが破壊されるため、必ずダブルクォーテーションで囲む実装(`” & objDriver.Name & “`)を徹底せよ。
3. 権限の問題
`Win32_PrinterDriver`へのアクセスには、ローカルの管理者権限が必要だ。社内展開時には、グループポリシー(GPO)の「スタートアップスクリプト」からSYSTEM権限で実行させるのが最もスマートな解である。
—
まとめ
VBScriptは、OSの深層部を叩くための「外科用メス」だ。今回のようなドライバー調査一つ取っても、コードをどう書くかで、あなたのエンジニアとしての格が決まる。
今回提供したスクリプトは、単なる抽出ツールではない。これをベースに「特定のバージョン以下を抽出してアラートを出す」といったロジックを組み込めば、それはもう立派な「保守自動化システム」となる。
「動くコード」ではなく、「運用できるコード」を書け。 それが、真の自動化エンジニアの責務だ。
