【入門編】【サービス依存関係ツリー自動生成】WMI Win32_ServiceDependent を解析したシステムサービス構成マップの可視化 – VBScript (Visual Basic Scripting Edition)解析バイブル

スポンサーリンク

VBScriptで解き明かす、Windowsサービスの「依存関係」マップの自動生成

こんにちは。自動化の世界へようこそ。
システム管理や運用自動化の現場にいると、必ず一度は頭を抱えるのが「このサービスを停止したら、他に何が止まるのか?」という恐怖ですよね。

特に、Windowsのサービスは複雑な「依存関係(Dependency)」で繋がっています。一つを止めると、芋づる式にシステムがダウンする……そんな悪夢を防ぐために、今日はWMI (Windows Management Instrumentation)VBScript を駆使して、サービスの依存関係ツリーを自動で可視化する「地図」を作ってみましょう。

マクロの記録から一歩先へ進み、OSの深淵を覗く準備はいいですか?

1. なぜVBScriptで「依存関係」を解析するのか?

現代ではPowerShellが主流ですが、VBScriptには「環境を選ばない」という最強の武器があります。ActiveXオブジェクトを呼び出し、OSの内部情報を叩く。このシンプルかつパワフルな挙動は、VBScriptの真髄です。

今回使うのは `Win32_Service` というWMIクラスです。これを使えば、Windowsが管理している全サービスの「誰が誰に依存しているか」を魔法のように抽出できます。

2. 実践:サービス依存関係マップ作成コード

以下のコードをコピーし、デスクトップなどに `ServiceMap.vbs` として保存してください。メモ帳で作成し、拡張子を `.vbs` にするだけで準備完了です。

‘ サービス依存関係解析スクリプト
‘ 実行方法: cscript ServiceMap.vbs > ServiceMap.txt

Option Explicit

Dim objWMIService, colServices, objService
Dim strComputer

strComputer = “.” ‘ ローカルPCを対象とする

‘ WMIサービスへの接続 (この1行が全ての扉を開く)
Set objWMIService = GetObject(“winmgmts:\\” & strComputer & “\root\cimv2”)

‘ 全サービスを取得
Set colServices = objWMIService.ExecQuery(“Select from Win32_Service”)

WScript.Echo “— システムサービス依存構成マップ —” & vbCrLf

For Each objService In colServices
‘ サービス名と表示名を出力
WScript.Echo “[” & objService.Name & “] ” & objService.DisplayName

‘ 依存しているサービス(自分が動くために必要なもの)を走査
Call PrintDependencies(objService.Name)

WScript.Echo “————————————”
Next

‘ 再帰的に依存関係を追跡するサブルーチン
Sub PrintDependencies(serviceName)
Dim colDeps, objDep
‘ AssociatorsOf: 依存関係を逆引きするWMIの強力なクエリ
Set colDeps = objWMIService.ExecQuery _
(“Associators of {Win32_Service.Name='” & serviceName & “‘} ” & _
“Where AssocClass=Win32_DependentService Role=Dependent”)

For Each objDep In colDeps
WScript.Echo ” └─ 前提サービス: ” & objDep.Antecedent
Next
End Sub

コードのポイント解説

  • `GetObject(“winmgmts:…”)`: WMIというOSのデータベースへ接続する「鍵」です。ここからWindowsの心臓部へアクセスします。
  • `Associators of`: これが今回のハイライトです。通常のSQLと違い、WMIの関連クラスを辿るための構文です。「このサービスが依存している(Dependent)対象(Antecedent)は何か?」というリレーションを直接取得できます。

3. 初学者が陥りやすい罠と対策

VBScriptを扱う上で、初心者が必ずと言っていいほど躓くポイントを先回りして教えますね。

① 「権限」の壁

サービス情報はOSの深部にあるため、「管理者として実行」しないと、アクセス拒否(Access Denied)でエラーになることがあります。コマンドプロンプトを「管理者として実行」し、そこから `cscript ServiceMap.vbs` を叩くのが鉄則です。

② 実行環境の選択

VBScriptには、ダブルクリックで動く `wscript.exe` と、コマンドラインで動く `cscript.exe` の2種類があります。
今回のスクリプトは大量のテキストを吐き出すため、必ず `cscript` を使ってください。そうしないと、ポップアップウィンドウが画面を埋め尽くして大変なことになりますよ!

③ 戻り値の確認

`objService` が正しく取得できているか、常に `If Not IsNull(…)` などでチェックする習慣をつけましょう。プロの世界では「データは必ず汚れている」と考えるのが基本です。

4. さあ、あなただけの「地図」を手にしよう

このコードを実行すると、コンソール画面にシステムがどう連鎖しているかの詳細なリストが流れます。これをリダイレクト(`> result.txt`)すれば、そのまま運用ドキュメントのベースになります。

「ここを直せば自動化ができる」という感覚が掴めれば、あなたはもう単なる利用者ではありません。システムを支配する側のエンジニアです。

VBScriptは古くからありますが、そのシンプルさと即効性は、今なお現場の強力な武器です。まずはこのコードを動かし、自分のマシンの「依存関係」を眺めてみてください。そこには、OSが積み上げてきた緻密な計算の世界が広がっていますよ。

何かわからないことがあれば、いつでも聞いてくださいね。一緒に最高のアウトプットを作り上げましょう!