ネットワーク共有の「死」を看取る――VBScriptによる自動修復という選択
こんにちは。現場の最前線でコードを書き続けてきたエンジニアとして、今日は「ネットワークドライブの切断」という、古くて新しい課題に立ち向かいたいと思います。
「朝出社したら、社内共有サーバーへのドライブが切断されていて、ファイルが開けない」
「VPNが一時的に瞬断して、業務が止まってしまった」
こうした現場の「小さなイライラ」を、VBScriptは魔法のように解消してくれます。今回は、WSH(Windows Script Host)の心臓部である`WScript.Network`オブジェクトを使い、ネットワークの状況を監視・修復する「自己治癒力」を備えたスクリプトを構築しましょう。
—
1. なぜ「VBScript」なのか?
今どきPythonやPowerShellがあるのに、なぜVBScriptなのか。それは「余計なものを一切インストールさせない」という、企業ネットワークにおける最強の武器だからです。Windowsが動いている環境であれば、メモ帳ひとつで今日からすぐに実装できる。この軽快さと環境を選ばない安定感こそ、VBScriptが今なお現場で愛される理由です。
—
2. ネットワーク監視のロジック:現状を知る
ネットワークが切れているかどうかを判定するには、`WScript.Network`オブジェクトの`EnumNetworkDrives`メソッドを使います。
これは「現在割り当てられているドライブレター」と「そのパス」をペアで取得するリストです。このリストをループで回し、「目的のドライブレターが存在するか」を確認することで、接続状態を判定します。
実装コード:ネットワーク再接続スクリプト
Option Explicit
‘ — 設定エリア —
Dim targetDrive, targetPath
targetDrive = “Z:” ‘ 監視対象のドライブレター
targetPath = “\\Server\Share” ‘ 接続先UNCパス
‘ — メイン処理 —
If Not IsDriveConnected(targetDrive) Then
WScript.Echo “切断を検知しました。再接続を試みます…”
Call ReconnectDrive(targetDrive, targetPath)
Else
WScript.Echo “接続は正常です。”
End If
‘ 接続状態を判定する関数
Function IsDriveConnected(strDrive)
Dim objNetwork, colDrives, i
Set objNetwork = CreateObject(“WScript.Network”)
Set colDrives = objNetwork.EnumNetworkDrives
IsDriveConnected = False
For i = 0 To colDrives.Count – 1 Step 2
If UCase(colDrives.Item(i)) = UCase(strDrive) Then
IsDriveConnected = True
Exit Function
End If
Next
End Function
‘ 再接続を行う関数
Sub ReconnectDrive(strDrive, strPath)
Dim objNetwork
Set objNetwork = CreateObject(“WScript.Network”)
‘ 念のため一度切断を試みる(ゴースト接続対策)
On Error Resume Next
objNetwork.RemoveNetworkDrive strDrive, True, True
On Error GoTo 0
‘ 再割り当て
objNetwork.MapNetworkDrive strDrive, strPath
WScript.Echo “再接続が完了しました。”
End Sub
—
3. 現場で陥りやすい「3つの罠」
このコードを書く際、初学者が必ずと言っていいほどハマるポイントがあります。
① 「ゴースト接続」の存在
ネットワークが切れたように見えても、Windows内部ではドライブレターが「死んだ接続」として掴まれていることがあります。これを無視して`MapNetworkDrive`を実行すると、「すでにそのデバイスは使用されています」というエラーで弾かれます。だからこそ、再接続の前に必ず`RemoveNetworkDrive`(強制切断)を挟むのがプロの作法です。
② `On Error Resume Next`の正しい使い方
上のコードで`On Error Resume Next`を使っているのは、切断時にエラーが発生しても処理を止めないためです。しかし、範囲を広げすぎないことが肝心です。エラーを隠すことはデバッグを難しくします。「ここだけはエラーが出てもスルーしていい」という最小限の範囲で使うのが、美しいコードの条件です。
③ 権限の壁(管理者権限)
ネットワークドライブの割り当ては、実行ユーザーの権限に依存します。タスクスケジューラなどで実行する場合、「最上位の特権で実行する」にチェックを入れるか、現在のユーザー権限で適切にログイン状態であることを確認してください。
—
4. さあ、次のステップへ
このスクリプトを「タスクスケジューラ」に登録し、5分おきに実行するように設定すれば、もうネットワーク障害に怯える必要はありません。
VBScriptをマスターするコツは、「まずは動くものを作り、それを堅牢にする」という繰り返しです。今回紹介したコードは、エラー処理や再接続ロジックを極限までシンプルにした「骨格」です。ここから、ログ出力機能を追加したり、メール通知を飛ばしたりと、自分なりにカスタマイズしてみてください。
ここをクリアしたあなたは、もう「マクロの記録」に頼るだけのユーザーではありません。Windowsそのものを手足のように操る、エンジニアの入り口に立っているのです。
何か詰まったら、いつでも戻ってきてください。応援しています。
