ネットワーク共有の「死」を許すな:WScript.Networkを用いた堅牢な自動復旧アーキテクチャ
現場のインフラエンジニアや自動化担当者が一度は直面する悪夢。それが「朝、出社するとネットワークドライブが切断されていて、業務システムがエラーを吐いている」という事態です。
VBScriptはレガシーと言われますが、Windows環境において、これほど低コストでOSの深部にまで介入できる言語は他にありません。しかし、多くのエンジニアが書く「適当な接続スクリプト」は、障害時にリソースリークを引き起こしたり、無限ループでシステムをフリーズさせたりします。
本稿では、単なる「再接続スクリプト」の枠を超え、プロフェッショナルが現場に導入すべき「自己修復型ネットワークマネージャー」の設計思想を伝授します。
—
1. なぜ「単純な再接続」は失敗するのか
多くのスクリプトで見かけるのが、以下のような実装です。
‘ 【アンチパターン】
Set objNetwork = CreateObject(“WScript.Network”)
objNetwork.RemoveNetworkDrive “Z:”, True
objNetwork.MapNetworkDrive “Z:”, “\\Server\Share”
このコードの何が問題か。
1. 状態未確認: 既に接続されている場合や、接続が「半死状態(ゾンビ)」の場合、Removeメソッドが例外を投げ、スクリプトが即座に停止します。
2. 排他制御の欠如: ネットワークリソースはOSのグローバルリソースです。同時実行や連続実行への耐性がありません。
3. エラーハンドリングの不在: サーバーが完全にダウンしている場合、このコードはタイムアウトまでリソースを占有し続け、後続処理を阻害します。
我々が目指すべきは、「状態を疑い、適切に掃除し、安全に再構築する」という多層防御のロジックです。
—
2. 堅牢な自動復旧スクリプトのプロダクション・コード
以下は、実務レベルでの保守性と耐障害性を追求した実装例です。
Option Explicit
‘ 設定値:定数として定義し、変更に強くする
Const TARGET_DRIVE = “Z:”
Const TARGET_PATH = “\\Server\Share”
Const RETRY_COUNT = 3
‘ メイン処理:堅牢な再接続ロジック
If Not IsDriveConnected(TARGET_DRIVE, TARGET_PATH) Then
Call ReconnectDrive(TARGET_DRIVE, TARGET_PATH)
End If
‘ 接続状態の確認(EnumNetworkDrivesはメモリ効率が良い)
Function IsDriveConnected(strDrive, strPath)
Dim objNetwork, oDrives, i
Set objNetwork = CreateObject(“WScript.Network”)
Set oDrives = objNetwork.EnumNetworkDrives
IsDriveConnected = False
For i = 0 To oDrives.Count – 1 Step 2
If UCase(oDrives.Item(i)) = UCase(strDrive) Then
If UCase(oDrives.Item(i + 1)) = UCase(strPath) Then
IsDriveConnected = True
Exit Function
End If
End If
Next
End Function
‘ 再接続ロジック(エラーハンドリングを徹底)
Sub ReconnectDrive(strDrive, strPath)
Dim objNetwork, i
Set objNetwork = CreateObject(“WScript.Network”)
On Error Resume Next ‘ 予期せぬAPIエラーをトラップ
‘ 既存の割り当てをクリア(強制切断)
objNetwork.RemoveNetworkDrive strDrive, True
‘ 再接続試行
For i = 1 To RETRY_COUNT
Err.Clear
objNetwork.MapNetworkDrive strDrive, strPath
If Err.Number = 0 Then
WScript.Echo “成功: ” & strDrive & ” を再接続しました。”
Exit Sub
End If
WScript.Sleep 2000 ‘ 2秒待機してリトライ
Next
‘ ログ出力(イベントログやテキストファイルへの書き込みを推奨)
WScript.Echo “エラー: ネットワークドライブの復旧に失敗しました。”
End Sub
—
3. 実務で運用するための「3つの鉄則」
1. 「On Error Resume Next」の作法
VBScriptで最も重要なのはエラーハンドリングです。`On Error Resume Next` を使う際は、必ず `Err.Clear` をセットで使い、エラーが発生したブロック以外に影響が及ばないよう、スコープを最小限に絞ってください。
2. ファイル連携時の注意(ロックファイル)
ネットワーク越しにCSVやログファイルを操作する場合、切断による書き込み失敗がファイル破損を招きます。再接続処理の直前・直後に、必ず「ファイルの存在チェック」と「ロック解除待ち」のロジックを挟むことを強く推奨します。
3. スケジューラ実行の勘所
このスクリプトは、タスクスケジューラで「ユーザーがログオンしているかどうかにかかわらず実行する」設定にし、かつ「最上位特権で実行」にチェックを入れて運用してください。これにより、セッションの壁を超えてネットワークリソースを管理可能になります。
—
結論:自動化は「疑うこと」から始まる
優れた自動化ツールとは、正常に動くものではなく、「異常が発生したときに、それをいかに静かに、確実に鎮圧するか」を設計されたものです。
今回紹介したコードは、あくまでテンプレートです。皆さんの環境に合わせて、ログの出力先を統合監視ツールに向けたり、再接続失敗時に管理者にメール通知を送るロジックを追加したりして、進化させてください。
VBScriptの真価は、その軽快さと、OSとの圧倒的な親和性にあります。この武器を使いこなし、泥臭い運用から脱却しましょう。それが、伝説のアーキテクトに近づくための第一歩です。
