ネットワーク自動化の深淵:WScript.Networkで制するエンタープライズ環境の静かなる支配
ネットワークドライブの割り当て、あるいはプリンタの接続。これらは一見すると「誰でも書けるスクリプト」の代表格だ。しかし、ドメイン環境において何千台もの端末を管理し、ネットワーク遅延や認証情報の競合、そして再起動の嵐に耐えうるコードを書ける者は、驚くほど少ない。
VBScriptはレガシーではない。これは、Windowsの深層領域を直接叩くための「最小にして最強のOSインターフェース」だ。今日は、安定性を極限まで高めたプロフェッショナルな実装について語る。
—
1. 破壊的な失敗を避けるための「鉄則」
多くの初心者は、エラーハンドリングを怠り、`WScript.Network`を不用意に使い回す。大規模環境でこれをやれば、セッションのリークや、ネットワークパス解決のタイムアウトによるスクリプトのハングアップを招く。
守るべき3つのアーキテクチャ原則
- 冪等性(Idempotency)の確保: 同じスクリプトを何度叩いても、システムの状態が同じになるようにする。「接続済みなら何もしない」のではなく、「一度切断してから再接続する」あるいは「ステータスをチェックして適切にハンドリングする」というロジックが必須だ。
- 明示的なオブジェクト解放: `Set objNetwork = Nothing` は儀式ではない。メモリリークを防ぐための、スクリプト実行環境(wscript.exe / cscript.exe)に対する敬意である。
- ネットワークパスの正規化: UNCパスの末尾にゴミが混じっていないか、IPアドレス直打ちか名前解決か。DNSキャッシュを汚さないための事前検証が、実行速度を左右する。
—
2. 実装:堅牢なネットワーク自動化モジュール
以下は、実戦で酷使しても音を上げない、堅牢性を最優先したコード構成である。
‘——————————————————————————-
‘ NetworkConfigurator.vbs
‘ 用途: ドライブマッピングおよびプリンタ接続の全自動化
‘ 特徴: エラーハンドリングとメモリ最適化を施したプロダクションコード
‘——————————————————————————-
Option Explicit
‘ メイン実行ルーチン
Call Main()
Sub Main()
Dim objNetwork
Set objNetwork = WScript.CreateObject(“WScript.Network”)
On Error Resume Next
‘ 1. ネットワークドライブの割り当て (既存チェック含む)
Call MapDrive(objNetwork, “Z:”, “\\FileServer\SharedData”)
‘ 2. ネットワークプリンタの接続
Call AddPrinter(objNetwork, “\\PrintServer\OfficePrinter01”)
‘ 3. 標準プリンタの設定
Call SetDefaultPrinter(objNetwork, “\\PrintServer\OfficePrinter01”)
‘ 後始末: 明示的にメモリを解放する
Set objNetwork = Nothing
If Err.Number <> 0 Then
WScript.Echo “Error: ” & Err.Description
End If
End Sub
‘ ドライブ接続の堅牢な実装
Sub MapDrive(objNet, strDrive, strPath)
Dim objDrives, i, isConnected
Set objDrives = objNet.EnumNetworkDrives
isConnected = False
‘ 既存のドライブ接続をチェックし、存在すれば一度解放する
For i = 0 To objDrives.Count – 1 Step 2
If UCase(objDrives.Item(i)) = UCase(strDrive) Then
objNet.RemoveNetworkDrive strDrive, True, True
Exit For
End If
Next
‘ 割り当ての実行
objNet.MapNetworkDrive strDrive, strPath
Set objDrives = Nothing
End Sub
‘ プリンタ接続の実装
Sub AddPrinter(objNet, strPrinterPath)
‘ 既に接続済みである可能性を考慮し、エラーを無視
objNet.AddWindowsPrinterConnection strPrinterPath
End Sub
‘ 標準プリンタの設定
Sub SetDefaultPrinter(objNet, strPrinterPath)
objNet.SetDefaultPrinter strPrinterPath
End Sub
—
3. シニアエンジニアの視点:なぜ「WScript」なのか
なぜ今さらVBScriptなのかと問う者がいる。答えはシンプルだ。「実行環境の依存性がゼロであること」だ。
PowerShellは確かに強力だが、ポリシーによって実行ポリシー(ExecutionPolicy)が制限されていたり、.NET Frameworkのバージョン違いで動作が不安定になることがある。対してVBScriptは、Windows 98時代から変わらぬ挙動で、あらゆるWindowsクライアント上で「動いて当たり前」のインフラとして君臨している。
パフォーマンスを極めるためのヒント
1. WMIとの併用: `WScript.Network`単体では、ドライブの状態取得が弱い場合がある。複雑な環境では`GetObject(“winmgmts:”)`を組み合わせ、`Win32_LogicalDisk`クラスを監視せよ。
2. CScriptの活用: GUI不要な自動化では、必ず `cscript.exe //nologo` で実行すること。コンソールへの無駄な出力は、ログファイルを肥大化させ、パイプラインのパフォーマンスを劣化させる。
3. レジストリによる制御: ネットワークドライブの永続化(Persist)は、時としてログインスクリプトのボトルネックになる。`MapNetworkDrive`の第3引数を使い分け、不要な再接続を排除せよ。
結びに代えて
自動化とは、単にスクリプトを書くことではない。システムという複雑な生命体の「ゆらぎ」を、いかに計算可能な範囲に収めるかという営みだ。
今回紹介したコードは、あくまで「型」に過ぎない。君たちが現場で直面する、VPN接続が不安定な環境や、Active Directoryのレプリケーション遅延といった「現実の壁」を突破するのは、コードの行数ではなく、エラーが起きた瞬間に何をすべきかを定義する、君たちの設計思想であるはずだ。
さあ、レガシーを武器に変え、静かなる自動化の王国を築き上げろ。
