【入門編】【高負荷プロセス検知】WMI パフォーマンスデータ(Win32_PerfFormattedData)を活用したリソース監視 – VBScript (Visual Basic Scripting Edition)解析バイブル

スポンサーリンク

こんにちは!現場でバリバリ自動化やツール開発をしていると、「なんだか最近、パソコンのファンがやけにうるさいぞ…」「特定のアプリが暴走してサーバーが重いな…」という場面に直面することはありませんか?

今回は、そんな現場のトラブルを未然に防ぐための「高負荷プロセス自動検知システム」を、VBScriptとWMI(Windows Management Instrumentation)を使って構築する方法を解説します。

「マクロの記録」から一歩抜け出して、Windowsの深部を流れるOSの生データを直接叩く――。
ここをクリアすれば、あなたのVBScriptのスキルは間違いなく中級者の域に達します。さあ、一緒にWindowsの内部をのぞいてみましょう!

1. なぜ「WMIのパフォーマンスデータ」を使うのか?

Windowsを監視する方法はいくつかありますが、VBScriptで最もエレガントかつ強力なのが WMI(Windows Management Instrumentation) です。

中でも `Win32_PerfFormattedData_PerfProc_Process` というクラスを使うと、OSがリアルタイムで計測している「プロセスごとのCPU使用率やメモリ消費量」を数値として一発で取得できます。

⚠️ 初学者がハマる最大の罠:Raw(生)データとFormatted(加工済み)データ

WMIには似たような名前で `Win32_PerfRawData_PerfProc_Process` というクラスもあります。名前に「Raw」とついている方は、OSが計測した累計のカウンタ値(生の数値)がそのまま入っています。
これを使ってCPU使用率を出そうとすると、「前回の測定から今回までの差分を計算し、経過時間で割って…」という非常に面倒なデルタ計算を自分で実装しなければなりません。

一方、今回使う `Win32_PerfFormattedData` は、OS側であらかじめ計算(フォーマット)済みの綺麗なパーセンテージやバイト数を返してくれます。VBScriptで手軽に監視ロジックを書くなら、迷わず「Formatted」を選びましょう。

2. 全体像とアーキテクチャ

今回作成するスクリプトの処理フローは以下の通りです。

1. WMIサービスへの接続(ローカルマシンのパフォーマンス空間へアクセス)
2. プロセス一覧の取得(現在動いている全プロセスのCPU・メモリをスキャン)
3. 閾値判定(「CPUが80%以上」「メモリが一定以上」などの暴走プロセスをフィルタリング)
4. 警告・特定(該当があれば、プロセス名とIDをログや画面にポップアップ通知)

3. 実装コード:高負荷プロセス検知スクリプト

以下のコードをメモ帳などに貼り付け、拡張子を `.vbs` (例: `process_watch.vbs`)で保存してください。
現場でそのままコピペして使えるよう、詳細なコメントを加えています。

‘ =================================================================0
‘ スクリプト名: HighLoadProcessWatcher.vbs
‘ 概要: CPU使用率が閾値を超えている暴走プロセスを検知して警告する
‘ =================================================================0

Option Explicit

‘ — 設定エリア —
Const THRESHOLD_CPU = 50 ‘ CPU使用率の警告閾値(%)
Const TARGET_PROCESS = “_Total” ‘ 除外したい集計用プロセス名

Sub CheckHighLoadProcesses()
Dim objWMIService, colProcesses, objProcess
Dim strComputer, wmiQuery

strComputer = “.” ‘ ローカルマシンを対象

‘ 1. WMIサービス(CIMv2名前空間)への接続
Set objWMIService = GetObject(“winmgmts:\\” & strComputer & “\root\cimv2”)

‘ 2. パフォーマンスデータの取得クエリ
‘ 稼働中のプロセスごとのCPU使用率(PercentProcessorTime)とワーキングセット(メモリ)を取得
wmiQuery = “SELECT Name, IDProcess, PercentProcessorTime, WorkingSet FROM Win32_PerfFormattedData_PerfProc_Process”
Set colProcesses = objWMIService.ExecQuery(wmiQuery)

‘ 3. プロセスコレクションをループして判定
Dim alertMessage
alertMessage = “【警告】以下の高負荷プロセスを検知しました!” & vbCrLf & vbCrLf
Dim alertCount
alertCount = 0

For Each objProcess in colProcesses
‘ 集計用の “_Total” や “Idle” プロセスは監視対象外とする
If objProcess.Name <> “_Total” And objProcess.Name <> “Idle” Then

‘ CPU使用率が閾値を超えているかチェック
‘ ※Win32_PerfFormattedDataのPercentProcessorTimeはマルチコア環境で100を超えることがあります
If objProcess.PercentProcessorTime >= THRESHOLD_CPU Then
alertCount = alertCount + 1
alertMessage = alertMessage & _
“・プロセス名: ” & objProcess.Name & vbCrLf & _
“ PID: ” & objProcess.IDProcess & vbCrLf & _
“ CPU使用率: ” & objProcess.PercentProcessorTime & “%” & vbCrLf & _
“———————————–” & vbCrLf
End If

End If
Next

‘ 4. 該当プロセスがあった場合は警告を表示
If alertCount > 0 Then
WScript.Echo alertMessage
Else
‘ 通常時は何も言わずに終了(タスクスケジューラからのサイレント実行にも対応)
‘ WScript.Echo “正常: 暴走プロセスは検知されませんでした。”
End If

‘ オブジェクトの解放(メモリリーク防止の作法)
Set colProcesses = Nothing
Set objWMIService = Nothing

End Sub

‘ メイン処理の実行
CheckHighLoadProcesses()

4. コードの深掘りポイント(ここがエンジニアの腕の見せ所)

1. `Option Explicit` の徹底

VBScriptを書く上で、冒頭の `Option Explicit` はプロフェッショナルの証です。これを宣言することで、変数名のタイポ(打ち間違い)によるバグをコンパイル段階で完全に防ぎます。「変数は必ず `Dim` で宣言する」――これを守るだけで、コードの品質が劇的に上がります。

2. 適切なオブジェクト解放

スクリプトが短いので放置されがちですが、WMIなどのCOMオブジェクト(`GetObject` や `CreateObject` で取得したもの)は、処理の最後に `Set obj = Nothing` で明示的にメモリを解放するクセをつけましょう。
これを怠ると、バックグラウンドで不要なプロセスやメモリが居座り続け、監視ツール自体がリソースを食いつぶす本末転倒な事態を招きます。

3. タスクスケジューラとの連携による真価

このVBScript単体では「実行した瞬間のスナップショット」しか取れません。
しかし、Windows標準の「タスクスケジューラ」に登録し、「5分おきにこのVBScriptを実行する」という設定を行えば、立派な常時監視システムへと生まれ変わります。
メッセージボックス(`WScript.Echo`)の代わりに、イベントログへの書き込み(`WScript.Shell` の `LogEvent` メソッドなど)や、Microsoft Teams / Slack の Webhook へ直接POSTする処理に書き換えれば、実用性はさらに跳ね上がります。

まとめ:VBScriptの基礎から、実用的な自動化の世界へ

今回は、WMIのパフォーマンスデータを使った高負荷プロセスの検知ロジックを解説しました。

  • WMI (`Win32_PerfFormattedData`) を使えば、OS内部の生データに直接アクセスできる
  • 生データ(Raw)ではなく加工済みデータ(Formatted)を選ぶのがスマートな実装のコツ
  • `Option Explicit` とオブジェクトの解放 (`Nothing`) はプロの基本作法

「マクロの記録ボタンを押して自動化する」というステージを超えて、こうしたOSの仕組みを直接コードで叩けるようになると、Windows環境における自動化の可能性は無限に広がります。

ここをクリアすれば、VBScriptの基本はもうバッチリです!ぜひ日々の業務やインフラ監視に役立ててみてくださいね。それでは、また次のテクニカルな自動化の世界でお会いしましょう!

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