こんにちは!現場でバリバリ自動化を進めていると、「夜間に基幹サービスが勝手に止まってしまい、朝に出社したら大慌て…」なんてトラブルに直面したことはありませんか?
マクロの記録や簡単なバッチファイルから一歩進んで、Windowsの深部をコントロールできるようになると、こうしたインフラのトラブルもVBScript(Visual Basic Scripting Edition)でスマートに自動復旧できるようになります。
今回は、Windowsの管理技術である WMI(Windows Management Instrumentation) を使って、指定した重要サービスの状態を監視し、もし止まっていたら自動で「再起動」させる実用的なスクリプトを一緒に作っていきましょう。
ここをクリアすれば、WBScriptとOS制御の基本はバッチリです!一緒にマスターしていきましょうね。
—
1. なぜVBScriptとWMIなのか?
私たちが普段使っているWindowsには、裏側で様々な「サービス」が動いています。例えば、印刷を司る `Spooler` や、データベースのサービスなどですね。これらは何らかの原因でプツッと止まってしまうことがあります。
通常、これを監視するには高価な監視ツールを入れたりしますが、「VBScript」ならWindows標準の機能だけで、追加のインストールなしに今すぐ実現できます。
その鍵を握るのが WMI(`Win32_Service`) です。
WMIを使うと、OSのハードウェアやOS内部の状態(サービスの状態など)を、まるでデータベースからデータを取得するかのように、VBScriptから自由自在に操作できるようになります。
—
2. 【実践】サービス自動復旧スクリプトの全貌
まずは、百聞は一見に如かず。こちらが今回作成する「サービス監視&自動再起動」の完全なコードです。
メモ帳に貼り付けて、拡張子を `.vbs` (例:`service_watch.vbs`)で保存すれば、すぐにあなたのPCやサーバーで動かせます。
‘ ==============================================================================
‘ スクリプト名: ServiceAutoRecovery.vbs
‘ 概要: 指定したWindowsサービスの状態を監視し、停止していれば自動起動する
‘ ==============================================================================
Option Explicit
Dim targetServiceName, wmiQuery, objWMIService, colServices, objService
Dim returnCode
‘ — 監視するサービス名を設定(例: プリントスプーラー) —
‘ ※独自のサービス名を指定する場合は、サービスの「サービス名(プロパティで確認)」を入力してください
targetServiceName = “Spooler”
WScript.Echo “【監視開始】サービス: ” & targetServiceName & ” の状態を確認します…”
On Error Resume Next
‘ 1. WMIサービスへの接続(ローカルコンピュータ)
Set objWMIService = GetObject(“winmgmts:{impersonationLevel=impersonate}!\\.\root\cimv2”)
If Err.Number <> 0 Then
WScript.Echo “[エラー] WMIへの接続に失敗しました。エラー番号: ” & Hex(Err.Number)
WScript.Quit 1
End If
‘ 2. 対象サービスのインスタンスを取得するためのWQLクエリ
wmiQuery = “Select from Win32_Service Where Name = ‘” & targetServiceName & “‘”
Set colServices = objWMIService.ExecQuery(wmiQuery)
‘ 3. サービスが存在するかチェック
If colServices.Count = 0 Then
WScript.Echo “[エラー] 指定されたサービスが見つかりません: ” & targetServiceName
WScript.Quit 1
End If
‘ 4. サービスの状態を判定
For Each objService in colServices
‘ Stateプロパティには “Running” や “Stopped” が入ります
WScript.Echo “現在のサービス状態: ” & objService.State
If objService.State <> “Running” Then
WScript.Echo “[警告] サービスが停止しています。自動復旧を試行します…”
‘ StartService メソッドを呼び出してサービスを起動
returnCode = objService.StartService()
If returnCode = 0 Then
WScript.Echo “[成功] サービスの起動コマンドが正常に送信されました。”
Else
WScript.Echo “[失敗] サービスの起動に失敗しました。リターンコード: ” & returnCode
End If
Else
WScript.Echo “[正常] サービスは正常に稼働中です。”
End If
Next
On Error Goto 0
WScript.Echo “【処理終了】”
—
3. コードの重要ポイントを噛み砕いて解説
先輩エンジニアとして、このコードの「ここだけは押さえてほしい」という本質的なポイントを解説しますね。
① `Option Explicit` はプロの証
コードの1行目に書いている `Option Explicit`。これ、何のためにあると思いますか?
VBScriptは初期設定では、変数の宣言をしなくても勝手に変数が作られてしまいます。そのため、スペルミス(例:`targetServiceName` を `targatServiceName` と書いてしまうなど)をした時に、エラーに気づきにくくなります。
これを防ぐために「変数は必ず最初に `Dim` で宣言しなさい」とVBScriptに強制するお呪いがこれです。現場のコードでは必須ですよ!
② `GetObject(“winmgmts:…”)` でOSの深部へアクセス
Set objWMIService = GetObject(“winmgmts:{impersonationLevel=impersonate}!\\.\root\cimv2”)
この呪文のような一行が、WMIの扉を開く鍵です。
- `winmgmts:` : WMIサービスを呼び出しています。
- `root\cimv2` : Windowsのシステム情報が詰まっている一番メジャーな「名前空間(フォルダのようなもの)」です。
これによって、OSのプロセスやサービスをオブジェクトとして操作できるようになります。
③ `objService.StartService()` による動的制御
VBScriptがすごいのは、単に状態を見るだけでなく、メソッド(命令)をオブジェクトに向けて実行できる点です。
サービスが止まっている(`State <> “Running”`)と判断したら、`objService.StartService()` を呼び出すだけで、Windowsに対して「このサービスを起動しろ!」と命令を送ることができます。
—
4. 現場でよくある「陥りやすい罠」と対策
初心者のうちは、次のような壁にぶつかりがちです。あらかじめ知っておけば怖くありません!
罠1: 「サービス名」と「表示名」を間違える
Windowsのサービス画面(`services.msc`)を開くと、名前に「Print Spooler」などと日本語やスペース入りの名前が書いてありますよね。
WMIのクエリ(`Where Name = ‘…’`)で指定するのは、表示名ではなく「サービス名(プロパティを開いたときに一番上にある短い名前、例: `Spooler`)」です。ここを間違えるとサービスが見つからないので注意してください。
罠2: 権限不足で動かない
サービスを停止・起動するということは、Windowsの根幹に関わる操作です。
一般ユーザー権限のままこのスクリプトを実行すると、WMIへの接続や `StartService` の実行時に「権限がありません(アクセス拒否)」というエラーになります。
必ずコマンドプロンプトを「管理者として実行」し、その上から `cscript service_watch.vbs` のように実行するようにしてください。
—
5. さらに実用的にする発展のヒント
今回は「1回実行して状態を確認・復旧する」スクリプトを作りましたが、実際の業務ではこれを「定期的に自動実行」したくなりますよね。
- タスクスケジューラとの連携
Windowsの「タスクスケジューラ」にこのVBScriptを登録し、「5分おきに実行する」ように設定してみてください。たったこれだけで、立派な簡易監視システムが完成します。
- ログ出力の追加
`WScript.Echo` は画面に文字を出すだけですが、ファイルシステムオブジェクト(`Scripting.FileSystemObject`)を使って、テキストファイルに「何時何分にサービスが停止し、自動再起動した」という履歴(ログ)を書き残すように改良すると、さらにエンジニアとしての信頼度がグッと上がりますよ!
まとめ
今回は、WMI(`Win32_Service`)を使ったサービスの監視と自動再起動について解説しました。
- VBScriptとWMIを組み合わせれば、追加ソフトなしでWindowsの深部を制御できる。
- `GetObject` と WQLクエリでサービスの状態を安全に取得・判定する。
- 異常時は `StartService()` メソッドでスマートに自動復旧。
ここをクリアできれば、VBScriptを使ったWindows自動化の基本はもうバッチリです!ぜひ日々の業務やインフラの守りに活かしてみてくださいね。それでは、また次の知見でお会いしましょう!
