【実務・中級編】【リモート端末一括展開タスク】ネットワーク共有とWMI Win32_Process を連携させた自己複製・遠隔スクリプト実行 – VBScript (Visual Basic Scripting Edition)解析バイブル

スポンサーリンク

VBScriptで構築するリモート一括展開:WMIとネットワーク共有を極めるアーキテクチャ

現場の自動化において、「各端末にログインしてスクリプトを叩く」という作業は、もはや原始時代の所業です。真のエンジニアであれば、ネットワーク共有を「配布基盤」とし、WMI(Windows Management Instrumentation)を「トリガー」として、インフラ全体を単一のスクリプトから制御するべきです。

今回は、VBScriptを駆使した「自己複製・遠隔実行エンジン」の設計思想と、実務で絶対に落とせない堅牢な実装手法を伝授します。

—

1. なぜ「WMI × ネットワーク共有」なのか

単純なファイルコピーでは権限管理やプロセスの生存確認が煩雑になります。WMIの `Win32_Process.Create` メソッドを使うことで、「ターゲットPCのセキュリティコンテキスト上で、特定のコマンドをバックグラウンド実行する」ことが可能になります。

アーキテクチャの要点

  • 配布層: UNCパス(`\\Server\Share\`)を経由し、スクリプトの単一ソース管理を実現。
  • 実行層: WMI経由でリモートの `wscript.exe` をキック。
  • 同期: 実行結果をログとして共有フォルダへ書き戻す「プル型」の構造を採用。

—

2. 堅牢な遠隔実行コード(Production-Ready)

このスクリプトは、ターゲットPC上で指定されたタスクを非同期実行するコアエンジンです。エラーハンドリングを怠れば、リモート環境でゾンビプロセスを生み出すことになります。

‘ リモート実行エンジン: RemoteDeployer.vbs
Option Explicit

Dim strComputer, strCommand, objWMIService, objProcess, intResult

‘ ターゲット設定
strComputer = “Target-PC-Name”
‘ 実行するコマンド(ネットワーク共有上の自身のパスを指定)
strCommand = “wscript.exe \\Server\SharedScripts\Worker.vbs”

‘ WMI接続(接続失敗時のガードを忘れないこと)
On Error Resume Next
Set objWMIService = GetObject(“winmgmts:\\” & strComputer & “\root\cimv2”)

If Err.Number <> 0 Then
WScript.Echo “接続エラー: ” & strComputer & ” に到達できません。”
WScript.Quit
End If
On Error GoTo 0

‘ プロセス生成
Set objProcess = objWMIService.Get(“Win32_Process”)
intResult = objProcess.Create(strCommand, Null, Null, intProcessID)

If intResult = 0 Then
WScript.Echo “成功: プロセスID ” & intProcessID & ” で実行開始。”
Else
WScript.Echo “失敗: エラーコード ” & intResult
End If

—

3. 実務で「死なない」ための設計指針

① 実行権限の壁を突破する

WMI経由での実行は、スクリプトを実行する親プロセスが「ドメイン管理者権限」を持っている必要があります。ローカルの権限昇格を期待してはいけません。実行環境はあらかじめADグループや特定のアカウントで固定してください。

② ファイルパスの「UNC問題」

リモートPC上でコマンドを実行する際、`C:\Windows\System32` がカレントディレクトリになります。ネットワーク共有上のスクリプトを呼び出す際は、必ずUNCパスでフルパス指定してください。相対パスは死を意味します。

③ ログの競合回避(データベース連携の代用)

多数の端末を一斉に叩くと、ログファイルへの同時書き込みで競合が発生します。

  • 推奨手法: 各PCのホスト名をファイル名に含める(`Result_PC01.log`, `Result_PC02.log`)。
  • 発展: ログをテキストに書くのではなく、共有フォルダ内の単一のCSVへ追記する際は、`Scripting.FileSystemObject` の `OpenTextFile` で `ForAppending` モードを使用し、ファイルロックのタイムアウト処理を必ず実装してください。

—

4. プロのエンジニアが守るべき鉄則

1. タイムアウトの導入: WMIの呼び出しは、ネットワーク遅延によりハングアップする可能性があります。ループ処理で `GetObject` を繰り返す場合は、必ず `Timer` 関数等でタイムアウトを設けてください。
2. 自己複製(Self-Replication)の罠: ネットワークの帯域を考慮し、一度に展開する台数を制限する「バッチ処理」の考え方を忘れないでください。100台同時に叩けば、ネットワーク共有サーバーが悲鳴を上げます。
3. WScript vs CScript: バックグラウンド実行時は必ず `CScript.exe` を使用すること。`WScript.exe` を使うと、エラーダイアログがリモート画面に表示され、ユーザーの操作を止めてしまいます。

結び

VBScriptは「古い」と言われますが、Windowsインフラに深く根を下ろしたこの言語は、単なるスクリプト以上の力を発揮します。今回提示したアーキテクチャは、WMIという強力なAPIを制御下に置くことで、何百台もの端末を意のままに操るための第一歩です。

コードをコピペして満足するのではなく、その背後にある「なぜWMIを使うのか」「なぜUNCパスでなければならないのか」という設計思想を読み解いてください。それこそが、自動化を「作業」から「エンジニアリング」へと昇華させる唯一の道です。

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