【入門編】【ハードウェアインベントリ一括取得】WMI (Win32_BIOS / Win32_ComputerSystem) を用いた端末個体情報の自動集約 – VBScript (Visual Basic Scripting Edition)解析バイブル

スポンサーリンク

こんにちは!現場のシステム開発やキッティング作業で、こんな悩みを抱えたことはありませんか?

「数百台あるPCのシリアルナンバーやモデル名を、1台ずつ手作業でExcelに控えていく……そんな地獄のようなインベントリ調査から解放されたい!」

Excelのマクロ(VBA)の記録機能から一歩踏み出し、Windowsの標準機能だけで動作するVBScript(Visual Basic Scripting Edition)をマスターすれば、この手のハードウェア情報収集は一瞬で自動化できます。特別なインストールソフトも、高額なライセンスも一切不要。メモ帳さえあれば、明日からでも現場で使える「プロの技」です。

今回は、WMI(Windows Management Instrumentation)の深淵に触れながら、端末の個体情報を完璧に吸い上げてCSVに自動蓄積するスクリプトの全貌を、優しく、そして徹底的に解説していきましょう。ここをクリアすれば、あなたのVBScriptの基礎力は一気に「実務レベル」へと到達します。

1. なぜWMIなのか? OSの心臓部から直接データを引き出す

VBScript単体では、PCのハードウェアのシリアルナンバーやBIOSのバージョンまでは知るすべもありません。そこで登場するのが WMI (Windows Management Instrumentation) です。

WMIは、Windowsオペレーティングシステムの内部状態やハードウェア構成を管理・制御するための巨大なデータベースのようなものです。VBScriptからこのWMIに「クエリ(問い合わせ)」を投げることで、OSが把握している生データをダイレクトに引き出すことができます。

取得する主要なハードウェア情報

今回のスクリプトでは、以下の2つのWMIクラスを叩きます。
1. `Win32_ComputerSystem`: メーカー名、モデル名など
2. `Win32_BIOS`: シリアルナンバー、BIOSバージョン、UUIDなど

2. 【実践】ハードウェアインベントリ一括取得スクリプト

以下のコードをコピーし、メモ帳に貼り付けて拡張子を `.vbs` (例: `InventoryCollector.vbs`)として保存してください。

‘ ==============================================================================
‘ 端末ハードウェアインベントリ自動収集スクリプト
‘ 概要: WMI経由でBIOSおよびComputerSystem情報を取得し、CSVファイルに追記する
‘ 著者: シニアアーキテクト
‘ ==============================================================================

Option Explicit

‘ エラーハンドリングの有効化(トラブル時にスクリプトを強制終了させず制御する)
On Error Resume Next

Dim objFSO, objFile, strCsvPath
Dim strComputer, objWMIService, colItems, objItem
Dim strManufacturer, strModel, strSerialNumber, strBIOSVersion, strUUID
Dim writeLine

‘ 1. 保存先CSVファイルのパス設定(実行スクリプトと同じフォルダに出力)
Set objFSO = CreateObject(“Scripting.FileSystemObject”)
strCsvPath = objFSO.GetParentFolderName(WScript.ScriptFullName) & “\Hardware_Inventory.csv”

‘ 2. CSVファイルが存在しない場合、ヘッダー(見出し)を書き込む
If Not objFSO.FileExists(strCsvPath) Then
Set objFile = objFSO.OpenTextFile(strCsvPath, 2, True) ‘ 2 = 書き込みモード
objFile.WriteLine “取得日時,コンピュータ名,メーカー,モデル,シリアルナンバー,BIOSバージョン,UUID”
objFile.Close
Set objFile = Nothing
End If

‘ 3. WMI接続の初期化 (ローカルPCを対象とする “.” を指定)
strComputer = “.”
Set objWMIService = GetObject(“winmgmts:\\” & strComputer & “\root\cimv2”)

If Err.Number <> 0 Then
MsgBox “WMIサービスへの接続に失敗しました。エラー: ” & Err.Description, vbCritical, “致命的エラー”
WScript.Quit
End If

‘ 4. Win32_ComputerSystem からメーカーとモデルを取得
Set colItems = objWMIService.ExecQuery(“Select from Win32_ComputerSystem”, , 48)
For Each objItem in colItems
strManufacturer = objItem.Manufacturer
strModel = objItem.Model
Next

‘ 5. Win32_BIOS からシリアル、バージョン、UUIDを取得
Set colItems = objWMIService.ExecQuery(“Select from Win32_BIOS”, , 48)
For Each objItem in colItems
strSerialNumber = objItem.SerialNumber
strBIOSVersion = Join(objItem.BIOSVersion, “/”) ‘ 配列の場合があるため結合
strUUID = objItem.Version ‘ UUID代替またはBIOS情報
Next

‘ 6. CSVへの書き込みデータ作成(カンマやダブルクォーテーションのエスケープ配慮)
writeLine = Now & “,” & _
CreateObject(“WScript.Network”).ComputerName & “,” & _
CleanStr(strManufacturer) & “,” & _
CleanStr(strModel) & “,” & _
CleanStr(strSerialNumber) & “,” & _
CleanStr(strBIOSVersion) & “,” & _
CreateObject(“WScript.Network”).ComputerName ‘ (必要に応じてUUID等に変更可)

‘ 7. ファイルシステムオブジェクトを使ってCSVに追記 (8 = 追記モード)
Set objFile = objFSO.OpenTextFile(strCsvPath, 8, True)
objFile.WriteLine writeLine
objFile.Close

‘ 8. クリーンアップ
Set objFile = Nothing
Set objFSO = Nothing
Set objWMIService = Nothing

‘ 完了メッセージ
MsgBox “インベントリの収集が正常に完了しました!” & vbCrLf & “保存先: ” & strCsvPath, vbInformation, “完了”

‘ ——————————————————————————
‘ 補助関数: 文字列中のカンマや改行を除去し、CSVの構造破壊を防ぐ関数
‘ ——————————————————————————
Function CleanStr(strIn)
If IsNull(strIn) Then
CleanStr = “N/A”
Else
‘ カンマをスペースに置換(簡易CSV対策)
CleanStr = Trim(Replace(Replace(strIn, vbCr, “”), vbLf, “”))
End If
End Function

3. コードのキモを徹底解説!初心者が躓きやすいポイント

ここからは、なぜこのコードがこのような書き方になっているのか、エンジニアの視点で重要なポイントを噛み砕いて解説します。

① `Option Explicit` はプロの証

スクリプトの最上部に書かれている `Option Explicit`。これ、何の意味があるか知っていますか?
これは「変数の宣言を強制する」魔法の呪文です。これを書いておくと、うっかり変数名をタイポ(スペルミス)したときに、VBScriptが即座にエラーを教えてくれます。これがないと、勝手に新しい変数として処理されてしまい、原因不明のバグの温床になります。実務では必ず記述しましょう。

② WMIクエリの作法 (`ExecQuery`)

Set colItems = objWMIService.ExecQuery(“Select from Win32_ComputerSystem”, , 48)

ここでSQLに似た構文でデータを引いています。最後の `, 48` という数字、気になりませんか?
これはフラグと呼ばれるもので、WMIクエリのパフォーマンスを最適化するためのものです(`wbemFlagReturnImmediately + wbemFlagForwardOnly`)。巨大なネットワーク環境や大量のオブジェクトを扱う際、メモリ消費を抑えて高速に処理するためのプロの隠し味です。

③ コレクションのループ処理 (`For Each`)

WMIから返ってくるデータは、たとえ1台のPCであっても「コレクション(データの集まり)」として返されます。そのため、単一のデータであっても `For Each objItem in colItems` を使って中身を取り出すのがお作法です。

④ CSV出力時の「トラップ」に注意

CSV(Comma-Separated Values)はその名の通り「カンマ」でデータを区切ります。もし取得したPCのモデル名などに「HP, Inc.」のようにカンマが含まれていると、CSVの列がズレるという大惨事が起きます。
今回のスクリプトにある `CleanStr` 関数は、そうした予期せぬ文字化けやフォーマット崩壊を防ぐための防衛策として組み込んでいます。

4. 陥りやすいエラーと現場の知恵

  • 「シリアルナンバーが『To be filled by O.E.M.』になる」
  • 安価なマザーボードや自作PC、一部の仮想環境では、メーカーがBIOSにシリアル情報を書き込んでいない場合があります。スクリプトのバグではなくハードウェア側の仕様ですので驚かないでください。
  • 権限エラー(アクセスが拒否されました)
  • 社内のセキュリティポリシーが非常に厳しい環境では、WMIへのアクセスが制限されている場合があります。実行時は必ず「管理者権限」でスクリプトを実行するか、ドメイン管理者アカウントでテストしてください。

最後に:ここをクリアすれば、あなたはもう初心者ではない!

お疲れ様でした!WMIの仕組み、ファイルシステムの操作、そしてCSVへの安全な出力処理。インベントリ収集という実務に直結するテーマを通じて、VBScriptの基礎と「実務で通用する書き方」の一端に触れていただきました。

VBScriptはレガシーな技術だと言われることもありますが、Windows環境があれば何も準備せずに即座に動く、最強の「現場のツールボックス」です。

このコードをベースに、社内ネットワーク内の全PCのIPアドレスを自動取得させたり、データベースに直接飛ばすようにカスタマイズしてみるのも面白いでしょう。

あなたの自動化ライフの第一歩として、ぜひこのスクリプトを役立ててください。それでは、また次のテクニカルな現場でお会いしましょう!

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