【テクニカル・上級編】【印刷ドライバー一括調査】WMI Win32_PrinterDriver を活用した端末内プリンタードライバーバージョン一覧の抽出 – VBScript (Visual Basic Scripting Edition)解析バイブル

スポンサーリンク

枯れた技術を研ぎ澄ます: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やレジストリを直接操作できるスキルこそが、真の意味での「エンジニアの価値」である。

このスクリプトは単なる道具ではない。大規模なシステムリプレイスにおける「事実」を抽出するための、極めて精度の高いレンズだ。現場でこのコードを適用し、不確実な構成情報から脱却せよ。それこそが、トラブルを未然に防ぐ唯一の道である。

タイトルとURLをコピーしました