VBA×WMI:リモートPCのディスク空き容量を高速に一括取得する

Tech

本記事はGeminiの出力をプロンプト工学で整理した業務ドラフト(未検証)です。

VBA×WMI:リモートPCのディスク空き容量を高速に一括取得する

【背景と目的】

複数台のPCやサーバーのディスク残量を手動で確認するのは非効率です。WMIを利用し、ネットワーク越しに容量情報を取得してExcelへ集約する自動化手法を提案します。

【処理フロー図】

graph TD
A["開始"] --> B["ターゲットPCリストの読み込み"]
B --> C["WMIロケーターの初期化"]
C --> D{"リモート接続試行"}
D -- 成功 --> E["Win32_LogicalDiskクエリ実行"]
D -- 失敗 --> F["エラーログ記録"]
E --> G["取得データを配列に格納"]
G --> H["Excelシートへ一括書き出し"]
H --> I["終了"]

【実装:VBAコード】

外部ライブラリの参照設定を不要にする「実行時バインディング(Late Binding)」を採用し、書き込み速度を最大化する配列処理を組み込んでいます。

Option Explicit

' =================================================================
' 概要: リモートPCのディスク情報をWMIで取得しシートに出力
' 特徴: 配列処理による高速化、エラーハンドリング実装
' =================================================================
Sub GetRemoteDiskSpace()
    Dim ws As Worksheet
    Set ws = ThisWorkbook.ActiveSheet

    Dim pcName As String
    Dim lastRow As Long
    Dim i As Long
    Dim results() As Variant
    Dim rCount As Long: rCount = 0

    ' 高速化設定
    Application.ScreenUpdating = False

    ' PC名がA列に入力されていると仮定(A2から開始)
    lastRow = ws.Cells(ws.Rows.Count, "A").End(xlUp).Row
    If lastRow < 2 Then Exit Sub

    ' 結果格納用配列(PC名, ドライブ, 容量GB, 空きGB, 使用率%)
    ReDim results(1 To lastRow, 1 To 5)

    Dim objLocator As Object
    Dim objService As Object
    Dim colDisks As Object
    Dim objDisk As Object

    On Error Resume Next
    Set objLocator = CreateObject("WbemScripting.SWbemLocator")

    For i = 2 To lastRow
        pcName = ws.Cells(i, 1).Value
        If pcName <> "" Then
            ' リモートWMI接続(権限があるユーザーで実行している前提)
            Set objService = objLocator.ConnectServer(pcName, "root\cimv2")

            If Err.Number <> 0 Then
                ' 接続失敗時の処理
                rCount = rCount + 1
                results(rCount, 1) = pcName
                results(rCount, 2) = "接続エラー: " & Err.Description
                Err.Clear
            Else
                ' 固定ディスク(DriveType=3)のみ取得
                Set colDisks = objService.ExecQuery("Select * from Win32_LogicalDisk Where DriveType = 3")

                For Each objDisk In colDisks
                    rCount = rCount + 1
                    results(rCount, 1) = pcName
                    results(rCount, 2) = objDisk.DeviceID
                    results(rCount, 3) = Round(objDisk.Size / 1024 / 1024 / 1024, 2) ' GB換算
                    results(rCount, 4) = Round(objDisk.FreeSpace / 1024 / 1024 / 1024, 2) ' GB換算
                    results(rCount, 5) = Round((1 - (objDisk.FreeSpace / objDisk.Size)) * 100, 1) & "%"
                Next
            End If
        End If
        Set objService = Nothing
    Next i
    On Error GoTo 0

    ' 結果の一括出力(C2セルを起点に出力)
    If rCount > 0 Then
        ws.Range("C2").Resize(rCount, 5).Value = results
    End If

    Application.ScreenUpdating = True
    MsgBox "ディスク情報の取得が完了しました。", vbInformation
End Sub

【技術解説】

  1. WbemScripting.SWbemLocator: リモートPCのWMIサービスへ接続するための標準オブジェクトです。参照設定なしで動作するよう CreateObject を使用しています。

  2. Win32_LogicalDisk: ディスク情報を保持するクラスです。DriveType = 3 を指定することで、ネットワークドライブや光学ドライブを除外し、ローカルのHDD/SSDのみを抽出します。

  3. 配列による書き込み: セルへの書き込みを1回ずつ行うと処理が重くなるため、一旦 results 配列にデータを蓄積し、最後に一括でシートへ展開しています。

【注意点と運用】

  1. ファイアウォールの許可: リモート接続先PCで「Windows Management Instrumentation (WMI)」の通信(TCP 135等)が許可されている必要があります。

  2. 実行権限: 実行ユーザーがリモートPCに対して管理者権限(Administrator)を持っている必要があります。ドメイン環境での実行を推奨します。

  3. タイムアウトの発生: 存在しないPCや電源が切れているPCへ接続しようとすると、ConnectServer で待機時間が発生します。リストが多い場合は事前に Ping 等で生存確認を行うロジックの追加を検討してください。

【まとめ】

  • WMIを活用すれば、特別なエージェントソフトなしでリモートPCの容量監視が可能。

  • 配列処理を組み合わせることで、数十台規模のデータ取得も数秒で完了する。

  • エラーハンドリングを徹底し、接続失敗時でもマクロが止まらないように設計することが運用のコツ。

ライセンス:本記事のテキスト/コードは特記なき限り CC BY 4.0 です。引用の際は出典URL(本ページ)を明記してください。
利用ポリシー もご参照ください。

コメント

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