【入門編】【ターミナルセッション通知】msg.exe コマンドと WMI を連携させたログオン中ユーザーへの一括緊急アナウンス自動化 – VBScript (Visual Basic Scripting Edition)解析バイブル

スポンサーリンク

現場のプロが教える!VBScriptで構築する「サーバー緊急アナウンス」自動化システム

こんにちは。システム運用の現場で数々の自動化ツールを設計してきたエンジニアです。

今日は、皆さんが避けては通れない「サーバー保守」の現場で、必ずと言っていいほど直面する課題を解決します。それは「ログオン中の全ユーザーへの緊急通知」です。

「誰がどの端末で作業しているか分からない…」「個別に連絡するのは手間だし、見落としが発生する…」。そんな悩みを、VBScriptとWMI(Windows Management Instrumentation)を組み合わせた「一括緊急アナウンス自動化スクリプト」で一掃しましょう。

1. なぜ今、VBScriptなのか?

「今の時代、PythonやPowerShellがあるのに、なぜVBScript?」と思うかもしれません。答えはシンプルです。「どんなに古いWindowsサーバーでも、環境設定なしで確実に動くから」です。

VBScriptはOSの深層部(WSH: Windows Script Host)を直接叩けるため、軽量かつ強力。インフラ運用において、この「事前準備ゼロで動く」という特性は最強の武器になります。

2. システムの設計図:どうやって通知を飛ばすのか?

今回作成するスクリプトは、以下の3ステップで動作します。

1. WMIへの問い合わせ: 現在サーバーにログオンしている全ユーザー情報を抽出。
2. ループ処理: 取得したセッションIDを一つずつ取り出す。
3. msg.exeの実行: 各セッションIDに対してメッセージをプッシュ送信。

今回の主役:msg.exeとは

Windowsに標準搭載されているメッセージ送信コマンドです。シンプルですが、ターミナルサーバー環境下では「ID指定」で確実に画面へメッセージを飛ばせるため、運用現場では非常に重宝されます。

3. 実装:一括緊急アナウンススクリプト

以下のコードをテキストエディタに貼り付け、`NotifyUsers.vbs` という名前で保存してください。

‘ — 緊急アナウンス自動化スクリプト —
Option Explicit

Dim objWMIService, colItems, objItem
Dim strMessage, strComputer
Dim returnCode

‘ 通知したいメッセージ内容
strMessage = “【重要】10分後にサーバーの再起動を行います。作業中のデータは保存してください。”

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

‘ WMIを使用して現在のセッション情報を取得
Set objWMIService = GetObject(“winmgmts:\\” & strComputer & “\root\cimv2”)
Set colItems = objWMIService.ExecQuery(“Select from Win32_Process Where Name = ‘explorer.exe'”)

‘ ログオン中ユーザーのセッションIDを抽出してmsgコマンドを発行
For Each objItem in colItems
Dim sessionId
‘ セッションIDを取得
sessionId = objItem.SessionId

‘ msg.exeを使って各セッションに通知
‘ /SERVER:. は自分自身、/TIME:60 は60秒後に自動消去
Dim shell
Set shell = CreateObject(“WScript.Shell”)

‘ コマンドを実行(コンソールウィンドウを表示させないために0を指定)
returnCode = shell.Run(“msg /SERVER:. /TIME:60 /SERVER:. /v ” & strMessage, 0, True)

WScript.Echo “セッションID: ” & sessionId & ” に通知を送信しました。”
Next

Set colItems = Nothing
Set objWMIService = Nothing

4. プロの視点:陥りやすい罠と対策

このコードを動かす際に、初心者が必ずと言っていいほど躓くポイントが2つあります。

① 「権限」の壁

`msg.exe` を叩くには、管理者権限が必要です。スクリプトを実行する際は、必ず「コマンドプロンプトを管理者として実行」してから、`cscript NotifyUsers.vbs` と入力してください。

② WMIのクエリの考え方

今回のスクリプトでは `explorer.exe` が動いているプロセスを探すことで「ログオン中」を判定しています。これは非常に賢いやり方です。なぜなら、バックグラウンドのシステムプロセスではなく、ユーザーが操作するデスクトップ環境をピンポイントで捕まえられるからです。

5. まとめ:ここをクリアすれば「自動化」が見えてくる

今回のスクリプトで学んだことは、以下の3点に集約されます。

1. WMIの強力さ: Windowsの内部情報を自由に引き出すための「検索エンジン」として使う。
2. WScript.Shellの活用: OSコマンドをVBScriptから操作する橋渡し。
3. オブジェクトのライフサイクル: `Set … = Nothing` で最後にメモリを開放する作法(これを忘れると、大規模な自動化でメモリリークを引き起こします)。

このスクリプトは単なる通知ツールではありません。ここから「特定のユーザーには送らない」「特定の時間に自動実行する」といった条件分岐を追加していけば、あなただけの強力な運用自動化ツールへと進化します。

「自動化」とは、単にコードを書くことではなく、「現場の面倒な作業を、誰がやっても同じ結果が出る仕組みに変えること」です。

ぜひ、次のメンテナンス作業で試してみてください。一括でメッセージが飛ぶ快感は、エンジニア冥利に尽きるはずですよ。応援しています!

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