【入門編】【イベントログ出力】WScript.Shell.LogEvent を用いたWindowsイベントログへのカスタム監査ログ書き込み – VBScript (Visual Basic Scripting Edition)解析バイブル

スポンサーリンク

こんにちは!自動化の世界へようこそ。
普段何気なく使っているWindowsですが、バックグラウンドで動くVBScriptやバッチファイルが「今、何をやっているのか」「エラーで止まっていないか」を監視する仕組み、気にしたことはありませんか?

コンソール画面(黒い画面)に `WScript.Echo` でメッセージを表示するだけでは、画面を閉じたら消えてしまいますし、夜間無人で動くサーバーの監視としては少し心許ないですよね。

そこで今回は、プロのインフラエンジニアや自動化アーキテクトも愛用する、Windowsの公式記録簿「イベントビューアー」にVBScriptから直接ログを書き込む方法を解説します。

ここをクリアすれば、あなたの作った自動化ツールは一気に「エンタープライズ品質」にレベルアップしますよ。さあ、一緒に扉を開けていきましょう!

1. なぜ「イベントログ」に出力すべきなのか?

VBScriptでエラー処理を行う際、定番なのは `MsgBox` を出すことですが、これは致命的な問題を抱えています。

  • 無人実行では誰もボタンを押せない:夜間バッチがエラーで止まった時、`MsgBox` が出たままフリーズして朝を迎える「デス・おはぎ(おはよウナぎ)」現象が起きます。
  • 履歴が残らない:流れてしまうログは、後から「昨日の14時になぜ失敗したか」を追う手がかりになりません。

そこで登場するのが、Windows標準の監査・ログシステムである「Windowsイベントログ(アプリケーションログ)」です。
ここに記録しておけば、Windowsの標準機能である「イベントビューアー」で一元管理できるだけでなく、ZabbixやDatadogなどの運用監視ツールと連携させて、エラー時に即座に管理者へメールを飛ばすことも可能になります。

2. 主役の登場:`WScript.Shell.LogEvent` とは?

WSH(Windows Script Host)の心臓部である `WScript.Shell` オブジェクトには、イベントログへ直接文字列を書き込むための `LogEvent` というメソッドが用意されています。

基本の構文はこれだけです。非常にシンプルですね。

Dim objShell
Set objShell = CreateObject(“WScript.Shell”)

‘ ログの種類, メッセージ, [ターゲットマシン名]
objShell.LogEvent 0, “処理が正常に完了しました。”

Set objShell = Nothing

ログの種類(イベントタイプ)を決める数値

第一引数の数値(ログの種類)には、以下の4つを使い分けることができます。

| 数値 | 定数名(概念) | 意味・用途 | 監視ツールの推奨度 |
| :— | :— | :— | :— |
| 0 | `SUCCESS` | 成功(Information):処理の正常終了など | 普段は無視、履歴用 |
| 1 | `ERROR` | エラー(Error):処理継続不可能な異常 | 【最重要】即座にアラート対象 |
| 2 | `WARNING` | 警告(Warning):処理は続行するが注意が必要 | 要確認 |
| 4 | `INFORMATION`| 情報(Information):開始・終了などのアナウンス | ログのトレース用 |

※実務では、異常系は `1 (ERROR)`、正常終了や重要なお知らせは `0 (SUCCESS)` または `4 (INFORMATION)` を使うのが定番です。

3. 実践!現場で使える「カスタム監査ログ出力」スクリプト

それでは、実務でそのままコピー&ペーストして使える、堅牢なエラーハンドリング付きのサンプルコードを見てみましょう。

このスクリプトは、自動化処理の「開始」「成功」「失敗」をそれぞれの重要度でイベントログに刻み込みます。

‘ =================================================================0
‘ 脚本名: WriteEventLogSample.vbs
‘ 概要 : WScript.Shell.LogEvent を用いたカスタム監査ログ出力の模範例
‘ =================================================================0

Option Explicit

Sub Main()
Dim objShell
Set objShell = CreateObject(“WScript.Shell”)

Dim sourceName
sourceName = “MyAutomationTool” ‘ ログの出所を分かりやすくするプレフィックス

On Error Resume Next ‘ 予期せぬエラーでスクリプト自体がクラッシュするのを防ぐ防壁

‘ 1. 処理開始のログ(情報:4)
objShell.LogEvent 4, “[” & sourceName & “] バッチ処理を開始しました。”

‘ — 【ここに実際の業務処理が入ります】 —
‘ わざとエラーを発生させるシミュレーション(例:存在しないファイルへのアクセスなど)
Dim simulatedError
simulatedError = 1 / 0 ‘ ゼロ除算エラー

If Err.Number <> 0 Then
‘ 2. エラー発生時のログ(エラー:1)
‘ Err.Description を使って具体的なエラー内容をログに残します
objShell.LogEvent 1, “[” & sourceName & “] 致命的なエラーが発生しました。詳細: ” & Err.Description

‘ オブジェクトの解放と終了
Set objShell = Nothing
WScript.Quit(1) ‘ 異常終了コードをOSに返す
End If
On Error GoTo 0 ‘ エラー監視を元に戻す

‘ 3. 処理成功のログ(成功:0)
objShell.LogEvent 0, “[” & sourceName & “] すべての処理が正常に完了しました。”

Set objShell = Nothing
WScript.Quit(0) ‘ 正常終了コード
End Sub

‘ メイン処理の実行
Call Main()

コードのここがポイント!

1. `Option Explicit` の徹底:変数の宣言漏れを防ぐお約束です。プログラマの基本ですね。
2. プレフィックスの付与 (`[MyAutomationTool]`):イベントビューアーには数多くのアプリケーションからログが集まってきます。自分たちのツール名を目立つように頭につけておくことで、後からログを検索(フィルタリング)する時に圧倒的に楽になります。
3. `WScript.Quit` による終了コードの返却:OSや上位のバッチファイル(`.bat`)に「成功したのか、失敗したのか」を伝えることで、ジョブスケジューラとの連携がスムーズになります。

4. 出力されたログを確認してみよう!

作成したスクリプト(例: `LogTest.vbs`)をダブルクリック、またはコマンドプロンプトから `cscript LogTest.vbs` で実行したら、実際にWindowsのどこに記録されているか確認してみましょう。

1. スタートボタンの横の検索窓に「イベント ビューアー」と入力して開きます。
2. 左ツリーから [Windows ログ][アプリケーション] を選択します。
3. 右ペインの「現在のログをフィルター…」をクリックするか、リストの上の方を見てみてください。
4. ソース名やイベントID(WScript.Shell経由の場合、ソースは通常 `WSH` として記録されます)を頼りに、先ほど書き込んだメッセージを探してみましょう。

「ちゃんとメッセージが会社のサーバーの歴史に刻まれた!」この瞬間が、VBScriptエンジニアにとって一番ワクワクする瞬間です。

5. 初学者が陥りやすい罠とアドバイス

最後に、現場でよくある「ハマりポイント」を先輩からこっそり伝授します。

  • 「あれ?イベントビューアーのソースが『WScript.Shell』じゃなくて『WSH』になるんだけど?」
  • 仕様です。`LogEvent` メソッドを使うと、Windowsのイベントログ上ではソース(発行元)が「WSH」として記録されます。独自のソース名(イベント名)で完全に分離したい場合は、WMIの `WbemScripting.SWbemLocator` や PowerShell の `Write-EventLog` を使うアプローチが必要になりますが、日々のバッチ処理であれば「WSH」の中にカスタムメッセージを綺麗に残すだけで十分実用になります。
  • イベントログの権限問題
  • ローカルの「アプリケーション」ログへの書き込みには、通常のユーザー権限があれば十分です。しかし、リモートコンピュータのログへ書き込もうとする場合(`LogEvent` の第3引数に別PC名を指定する場合)は、セキュリティポリシーやファイアウォールの壁に阻まれることが多いため、基本は「ローカルへの書き込み」に絞るのが安全かつ確実です。

まとめ

いかがでしたか?今回は `WScript.Shell.LogEvent` を用いた、Windowsイベントログへのカスタム監査ログ書き込みについて解説しました。

  • `LogEvent` を使えば、画面の裏側で起きた出来事をWindowsの公式記録簿に残せる。
  • 重要度(数値 0, 1, 2, 4)を適切に使い分けることで、監視ツールとの連携が可能になる。
  • エラーハンドリングと組み合わせて、無人環境でも強靭に動く自動化ツールを作れる。

ここをクリアできれば、もうあなたは単なる「マクロの記録者」ではありません。システムの信頼性を担保できる立派な自動化エンジニアです。

ぜひ、日々の業務を自動化するスクリプトにこのロギングを取り入れてみてくださいね。それでは、次回の技術解説もお楽しみに!

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