こんにちは。自動化の世界へようこそ。
VBScriptは、現代のモダンな言語から見れば「古き良き遺産」のように思えるかもしれません。しかし、WindowsというOSの深層心理(APIやレジストリ)に直接アクセスし、余計なインストールなしで即座にタスクを遂行するその「身軽さ」は、今なおエンジニアの強力な武器です。
今回は、システム管理の現場で最も頻出する「端末内のアプリインベントリ化」を題材に、VBScriptの真髄を伝授します。
—
なぜ「レジストリ」を直接叩くのか?
OS上の「プログラムの追加と削除」に表示される情報は、すべてレジストリの特定のキーに刻まれています。ここを走査することは、端末の「健康診断」を行うようなもの。
しかし、ここで多くの初心者が躓くポイントがあります。それは「32bitアプリと64bitアプリの住み分け」です。Windowsにはレジストリの仮想化(Wow6432Node)が存在するため、単に一つのパスを叩くだけでは、全容は見えてきません。
ここをクリアすれば、あなたはもう「マクロの記録」に頼るだけのユーザーではありません。
—
実践:全アプリ抽出スクリプト(Get-Apps.vbs)
以下のコードは、32bit/64bit両方のレジストリ領域を横断し、CSVとして出力するコードです。これをテキストファイルに貼り付け、`.vbs` という拡張子で保存してください。
‘ — Get-Apps.vbs: 端末内インストールアプリ一括抽出 —
Option Explicit
Dim fso, csvFile, reg, strLine
Dim regPaths, path, i
‘ 抽出対象のレジストリパス(64bit/32bit両対応)
regPaths = Array( _
“HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\”, _
“HKLM\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall\” _
)
Set fso = CreateObject(“Scripting.FileSystemObject”)
‘ カレントディレクトリにCSVを作成
Set csvFile = fso.CreateTextFile(“InstalledApps.csv”, True)
Set reg = CreateObject(“WScript.Shell”)
‘ CSVヘッダー書き込み
csvFile.WriteLine “DisplayName,DisplayVersion,Publisher”
‘ 各パスを走査
For Each path In regPaths
Call EnumUninstallKeys(path)
Next
csvFile.Close
MsgBox “完了しました。InstalledApps.csvを確認してください。”, 64, “インベントリ完了”
‘ 内部関数:サブキーを走査する再帰的処理の入り口
Sub EnumUninstallKeys(basePath)
Dim objWMIService, colSubKeys, objKey
Dim strComputer, strQuery
strComputer = “.”
Set objWMIService = GetObject(“winmgmts:\\” & strComputer & “\root\default:StdRegProv”)
‘ レジストリキーの列挙
Dim subKeys
If objWMIService.EnumKey(&H80000002, Replace(basePath, “HKLM\”, “”), subKeys) = 0 Then
If IsArray(subKeys) Then
For Each objKey In subKeys
Call WriteAppInfo(basePath & objKey)
Next
End If
End If
End Sub
‘ アプリ情報を取得してCSVに書き出す
Sub WriteAppInfo(keyPath)
Dim regObj, name, version, publisher
Set regObj = CreateObject(“WScript.Shell”)
On Error Resume Next ‘ 権限エラー回避のため
name = regObj.RegRead(keyPath & “\DisplayName”)
version = regObj.RegRead(keyPath & “\DisplayVersion”)
publisher = regObj.RegRead(keyPath & “\Publisher”)
‘ 表示名があるものだけ記録
If name <> “” Then
csvFile.WriteLine “””” & name & “””,””” & version & “””,””” & publisher & “”””
End If
On Error GoTo 0
End Sub
—
このスクリプトが教えてくれる「VBScriptの極意」
1. `Option Explicit` は命綱
コードの冒頭に書いたこの一文は、「変数宣言を強制する」というルールです。これを書かないと、タイプミスをした変数さえも「新しい変数」として自動生成され、デバッグ地獄に落ちます。「書くのが面倒」は「バグを生む温床」。プロの第一歩は、ここからです。
2. `On Error Resume Next` の正しい使い方
レジストリには、システムが保護していて読み取れないキーが必ず存在します。読み取りに失敗するたびにスクリプトが停止しては、管理業務になりません。
ここでは、「あえてエラーを無視し、次のデータへ進む」という手法をとっています。ただし、闇雲に使うのではなく、特定の処理の前だけに限定して使うのがスマートな流儀です。
3. CSVフォーマットの罠
`”””” & name & “”””` という記述に驚いたかもしれません。これは、アプリ名の中にカンマ(,)が含まれている場合、CSVが崩れてしまうのを防ぐための「ダブルクォーテーション囲み」です。実務では、「データが汚い(想定外の文字が入っている)」ことを前提に設計するのが、熟練エンジニアの視点です。
—
最後に:ここをクリアすれば「自動化の扉」が開く
今回扱ったレジストリ操作をマスターすれば、次は「WMI(Windows Management Instrumentation)」を利用したイベントログの監視や、AD(Active Directory)との連携といった、より高度な領域へ踏み込めます。
VBScriptは古い言語ですが、その裏側にある「Windowsの構造」を理解するのに、これ以上適した教材はありません。このコードをベースに、自分だけの便利なツールをどんどん作り出してください。
分からないことがあれば、いつでもまた聞きに来てくださいね。あなたの自動化ライフを心から応援しています。
