VBAでリモートPCのディスク容量を一括取得するWMI自動化スクリプト

Tech

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

VBAでリモートPCのディスク容量を一括取得するWMI自動化スクリプト

【背景と目的】

複数台のPCやサーバーのディスク空き容量を確認する際、手動ログインは非効率で時間がかかります。本コードはWMIを用いて、遠隔地から高速に容量を取得し、管理効率を最大化します。

【処理フロー図】

graph TD
A["開始"] --> B["対象ホスト名の読み込み"]
B --> C["WMIサービスへの接続試行"]
C -->|成功| D["Win32_LogicalDiskをクエリ"]
C -->|失敗| E["エラー情報を記録"]
D --> F["容量・空き容量を算出し配列へ格納"]
F --> G["シートへ一括出力"]
E --> G
G --> H["終了"]

【実装:VBAコード】

Option Explicit

' ================================================================
' 機能:リモートPCのディスク情報を一括取得
' 手法:WMI (Windows Management Instrumentation) を使用
' 備考:参照設定不要(Late Binding)
' ================================================================

Sub GetRemoteDiskInfo()
    Dim ws As Worksheet
    Set ws = ThisWorkbook.ActiveSheet

    Dim lastRow As Long
    lastRow = ws.Cells(ws.Rows.Count, "A").End(xlUp).Row

    If lastRow < 2 Then
        MsgBox "A列にリモートPC名(またはIP)を入力してください。", vbExclamation
        Exit Sub
    End If

    ' 高速化設定
    With Application
        .ScreenUpdating = False
        .Calculation = xlCalculationManual
    End With

    Dim i As Long
    Dim targetHost As String
    Dim objWMIService As Object
    Dim colDisks As Object
    Dim objDisk As Object
    Dim results() As Variant
    ReDim results(1 To lastRow - 1, 1 To 4) ' ホスト, ドライブ, 全容量(GB), 空き(GB)

    On Error Resume Next
    For i = 2 To lastRow
        targetHost = ws.Cells(i, 1).Value
        results(i - 1, 1) = targetHost

        ' WMIサービスへの接続(タイムアウト対策としてエラーハンドリング)
        Set objWMIService = GetObject("winmgmts:{impersonationLevel=impersonate}!\\" & targetHost & "\root\cimv2")

        If Err.Number <> 0 Then
            results(i - 1, 2) = "接続エラー: " & Err.Description
            Err.Clear
        Else
            ' 論理ディスク(ハードディスクのみ:DriveType=3)を取得
            Set colDisks = objWMIService.ExecQuery("Select * from Win32_LogicalDisk Where DriveType = 3")

            For Each objDisk In colDisks
                results(i - 1, 2) = objDisk.DeviceID
                results(i - 1, 3) = Round(objDisk.Size / 1073741824, 2)      ' Byte to GB
                results(i - 1, 4) = Round(objDisk.FreeSpace / 1073741824, 2) ' Byte to GB

                ' 複数ドライブがある場合は、簡易的に最初のドライブのみ、
                ' または必要に応じて行を分割するロジックをここに追加
                Exit For 
            Next
        End If
        Set objWMIService = Nothing
    Next i
    On Error GoTo 0

    ' シートへの一括書き出し
    ws.Range("B2").Resize(UBound(results, 1), UBound(results, 2)).Value = results

    ' 高速化設定の解除
    With Application
        .ScreenUpdating = True
        .Calculation = xlCalculationAutomatic
    End With

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

【技術解説】

  1. WMI (Win32_LogicalDisk): Windowsの管理情報にアクセスするインターフェースです。DriveType = 3 を指定することで、ネットワークドライブやCD-ROMを除外した「ローカルハードディスク」のみを抽出しています。

  2. Late Binding (遅延結合): GetObject を使用することで、実行環境に依存せず、特定のライブラリ参照設定を行わずに動作させることが可能です。

  3. 高速化手法: Application.ScreenUpdating = False による描画停止と、計算結果を一度配列(results)に格納してからセルに一括出力する手法を採用し、処理時間を大幅に短縮しています。

【注意点と運用】

  1. 権限の壁: リモートPCに対して「管理者権限」を持つユーザーでExcelを実行している必要があります。

  2. ファイアウォールの遮断: リモートPC側で「Windows Management Instrumentation (WMI)」の通信(RPC)が許可されていない場合、接続エラーとなります。

  3. タイムアウト: ネットワーク上のPCがオフラインの場合、GetObject で数十秒フリーズする可能性があります。応答がないPCが多い場合は、事前に Ping による生存確認を挟むのが定石です。

【まとめ】

  • WMIを活用することで、ログイン不要のディスク監視がVBAのみで完結する。

  • 配列処理を組み合わせることで、数十台規模のクエリでもストレスなく動作する。

  • エラー処理を徹底し、接続不可な端末があってもマクロ全体を停止させない構成が重要。

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

コメント

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