枯れた技術を研ぎ澄ます:WMI `Win32_PrinterDriver` を駆使した高精度な構成管理術
システム管理の現場において、プリンタードライバーの不整合は、現代においても依然として「最も解決しにくいトラブルの一つ」である。特に大規模環境のリプレイスや、特定のOSパッチ適用後の印刷障害調査において、端末ごとのドライバーバージョンを正確に把握することは、泥臭いが避けては通れない関門だ。
今回は、VBScriptとWMI(Windows Management Instrumentation)を駆使し、レガシー環境からモダンOSまで、全端末のドライバー構成を確実に、かつメモリ消費を最小限に抑えて抽出する「真のプロフェッショナル向け」手法を伝授する。
—
なぜ今、WMIとVBScriptなのか
モダンなPowerShellやC#が台頭する中で、なぜあえてVBScriptか。それは、「依存関係の排除」という一点に尽きる。実行環境の制約が厳しいクローズドなネットワーク環境や、PowerShellの実行ポリシーが厳格に制限された現場において、WSH(Windows Script Host)はOS標準機能として最も信頼できる最後の砦だからだ。
しかし、雑なVBScriptはメモリリークを招き、WMIクエリは時としてシステムをフリーズさせる。これらを回避し、大規模環境でも安定して動作させるためのアーキテクチャ設計を解説する。
—
極限のパフォーマンスを追求した実装例
以下のコードは、単に情報を取得するだけでなく、`Set obj = Nothing` による明示的なオブジェクト解放を徹底し、ガベージコレクションに依存しない堅牢な設計となっている。
‘ —————————————————————–
‘ PrinterDriverAudit.vbs
‘ 目的: 端末内の全プリンタードライバー情報をCSVへ出力する
‘ 注意: 管理者権限(昇格)で実行すること。さもなくば空の結果が返る。
‘ —————————————————————–
Option Explicit
Dim objFSO, objFile, objWMIService, colDrivers, objDriver
Dim strFilePath, strLine
‘ 出力先定義(実行ディレクトリに生成)
strFilePath = Left(WScript.ScriptFullName, InStrRev(WScript.ScriptFullName, “\”)) & “PrinterDriverList.csv”
Set objFSO = CreateObject(“Scripting.FileSystemObject”)
Set objFile = objFSO.CreateTextFile(strFilePath, True)
‘ CSVヘッダーの書き込み
objFile.WriteLine “Name,Version,DriverPath,Environment,InfName”
‘ WMI接続:ローカル環境をターゲットとする
‘ 応答の遅い環境を考慮し、SWbemServices.ExecQueryで詳細なクエリを発行
Set objWMIService = GetObject(“winmgmts:\\.\root\cimv2”)
Set colDrivers = objWMIService.ExecQuery(“SELECT Name, Version, DriverPath, Environment, InfName FROM Win32_PrinterDriver”)
‘ データの抽出とメモリの適正なハンドリング
For Each objDriver In colDrivers
‘ ヌル値によるエラーを避けるためのトリミング処理
strLine = Chr(34) & objDriver.Name & Chr(34) & “,” & _
Chr(34) & objDriver.Version & Chr(34) & “,” & _
Chr(34) & objDriver.DriverPath & Chr(34) & “,” & _
Chr(34) & objDriver.Environment & Chr(34) & “,” & _
Chr(34) & objDriver.InfName & Chr(34)
objFile.WriteLine strLine
Next
‘ オブジェクトの明示的解放(重要:VBScriptのライフサイクル管理)
Set colDrivers = Nothing
Set objWMIService = Nothing
objFile.Close
Set objFile = Nothing
Set objFSO = Nothing
WScript.Echo “抽出完了: ” & strFilePath
—
シニアエンジニアが押さえておくべき知見
1. WMIクエリのチューニング
`SELECT ` は絶対に避けること。今回のように必要なプロパティ(Name, Version等)を明示的に指定することで、CIMリポジトリへの負荷を大幅に軽減できる。これは端末負荷だけでなく、ネットワーク経由で実行する場合のトラフィック抑制にも直結する。
2. メモリ管理の鉄則
VBScriptにおいて `Set = Nothing` を省略するエンジニアが多いが、これは大きな誤りだ。特にWMIの `SWbemServices` や `SWbemObjectSet` は大きなメモリ領域を確保する。長時間稼働するバッチ処理や、複数台の端末を連続してスキャンするラッパースクリプトを書く際は、オブジェクトのライフサイクルを意識した解放が不可欠である。
3. 「環境」の落とし穴
`Win32_PrinterDriver` が返す `Environment` プロパティには注意が必要だ。32bit OSと64bit OSが混在する環境では、ドライバーのアーキテクチャ(`Windows x64` や `Windows NT x86`)が混在する。このカラムを抽出対象に加えることで、後のリプレイス時に発生するドライバー互換性のトラブルを予見できる。
—
結び:枯れた技術こそ、最強の武器となる
新たなフレームワークを導入することは容易だが、既存のインフラを理解し、OSの深淵であるWMIやレジストリを直接操作できるスキルこそが、真の意味での「エンジニアの価値」である。
このスクリプトは単なる道具ではない。大規模なシステムリプレイスにおける「事実」を抽出するための、極めて精度の高いレンズだ。現場でこのコードを適用し、不確実な構成情報から脱却せよ。それこそが、トラブルを未然に防ぐ唯一の道である。
