VBScriptを掌握せよ:ネットワークドライブ「自己修復」の極意
ネットワークエンジニアやシステム管理者が最も忌避する事象の一つが、「切断された共有ドライブの幽霊」だ。エクスプローラーには赤い×印がつき、業務アプリケーションはI/Oエラーでスタックする。GUIで再接続すれば済む話だが、我々のような自動化を信奉するエンジニアにとって、それは敗北を意味する。
今回は、WScript.Networkオブジェクトを核とし、レガシーなWindows環境で「死なない」ネットワーク接続を構築するための極限の知見を共有する。
—
1. 接続状態を判定する「真実」のロジック
多くの初心者は、`WScript.Network`の`EnumNetworkDrives`の結果を文字列比較するだけで満足する。だが、真のプロフェッショナルは、「ドライブレターがリストに存在すること」と「ネットワークリソースが応答可能であること」は別物であることを理解している。
なぜ `EnumNetworkDrives` だけでは不十分か
ネットワーク障害が発生した際、OSの管理下ではドライブレターが「ゾンビ化」して残存することが多い。単にリストを走査するだけでは、再接続コマンドを打つべきタイミングを見誤る。
我々は、ファイルシステムのI/Oチェックを組み合わせた「二段構えの検証」を行う必要がある。
2. ネットワーク自動復旧スクリプトの実装
以下に、メモリリークを許さず、堅牢性を極限まで高めた復旧ロジックを提示する。
‘ — ネットワークドライブ自動復旧スクリプト —
Option Explicit
Dim objNetwork, objFSO, objShell
Dim strDrive, strPath
Dim blnIsConnected
‘ 設定
strDrive = “Z:”
strPath = “\\Server\SharedFolder”
‘ オブジェクト生成
Set objNetwork = WScript.CreateObject(“WScript.Network”)
Set objFSO = CreateObject(“Scripting.FileSystemObject”)
If Not IsDriveConnected(strDrive, strPath) Then
Call ReconnectDrive(objNetwork, strDrive, strPath)
End If
‘ 明示的なオブジェクト解放(重要:VBScriptのメモリ管理を支配する)
Set objNetwork = Nothing
Set objFSO = Nothing
‘ 接続判定関数
Function IsDriveConnected(drive, path)
Dim colDrives, i
Set colDrives = objNetwork.EnumNetworkDrives
‘ 1. ドライブマップの存在確認
For i = 0 To colDrives.Count – 1 Step 2
If UCase(colDrives.Item(i)) = UCase(drive) Then
‘ 2. I/Oテスト(パスのルートディレクトリが存在するか検証)
If objFSO.FolderExists(drive & “\”) Then
IsDriveConnected = True
Exit Function
End If
End If
Next
IsDriveConnected = False
End Function
‘ 再接続実行ルーチン
Sub ReconnectDrive(net, drive, path)
On Error Resume Next
‘ 一度切断を試みる(ゾンビ接続の駆除)
net.RemoveNetworkDrive drive, True, True
‘ 再接続実行
net.MapNetworkDrive drive, path
If Err.Number <> 0 Then
‘ 必要に応じてイベントログ等に書き出す処理をここに実装
Err.Clear
End If
On Error Goto 0
End Sub
—
3. シニアエンジニアが意識すべき「裏側の挙動」
メモリとオブジェクトのライフサイクル
VBScriptはガベージコレクションを備えているが、それは「いつ実行されるか予測不能」であることを意味する。特にWSH環境で長時間常駐するバックグラウンドタスクを書く場合、`Set obj = Nothing` を怠ることは、メモリリークという名の時限爆弾を抱えることと同義だ。
WMI/API呼び出しの罠
今回は`WScript.Network`を使用したが、さらに高度な制御(接続時のユーザー認証の動的切り替えや、詳細なエラーコードの取得)が必要な場合は、`WMI (Win32_NetworkConnection)`を直接叩く必要がある。しかし、WMIはクエリの実行コストが極めて高い。「軽量なWScript.Networkで十分な場所には、重厚なWMIを持ち込まない」。これが適材適所のアーキテクチャだ。
エラーハンドリングの流儀
`On Error Resume Next` は魔法の杖ではない。多用すればコードの腐敗を招く。必ず `Err.Number` をチェックし、エラー発生時は即座に状態をリセットする。この「局所的な無視と、広域的な監視」のバランスこそが、システムを堅牢にする。
—
結論
ネットワークドライブの再接続は、単なるスクリプトの実行ではない。クライアントとサーバーの間の「信頼関係の再構築」である。
レガシーな技術であっても、OSのカーネルに近い部分を理解し、メモリの挙動をコントロールできれば、VBScriptは現代の自動化ツールにも劣らない強力な武器となる。あなたの書くコードが、サーバー室の静寂を支える礎であることを忘れないでほしい。
健闘を祈る。
