読者です 読者をやめる 読者になる 読者になる

WMIでサーバのディスク空き容量を一斉に取得してみた



サーバのディスク空き容量を知りたい、という要望があるものの
台数が多いと個々にログインして調べるのが手間なので一斉にできないかなーってことで
ちょろっと書いてみた。


ドメイン環境向けなので、1種類のユーザで指定された全部のサーバに接続にいきます。
また、ドライブレターの割り当てのない個所にマウント(ジャンクション)されているディスクについてはLogicalDiskの列挙で取れないのでそこは対応できてません。
あと、読みやすくするため手抜きのためエラー処理は入ってません。


Excelで開く前提でCSV出力にしてるけど、そもそもExcelのマクロに組み込んだ方が運用ツールとしては使いやすくなると思います。


以下、スクリプト

'GetAllServerAllDiskSpace.vbs
'スクリプト内で指定されたサーバの全てのディスク空き容量を列挙して取得する。
'出力フォーマットはCSV固定。

'------------------------------
'サーバに接続するユーザ、パスワードを変更する時は以下を編集
'↓↓↓↓↓↓↓↓↓↓↓↓↓↓

Const USERNAME="Domain\Username
Const PASSWORD="Password"

'↑↑↑↑↑↑↑↑↑↑↑↑↑↑
'------------------------------

Dim nodeArray
Dim curNode
Dim tmpstr
Dim Qfeset
Dim Qfe
Dim Locator
Dim Service


'------------------------------
'処理対象ノードを変更追加する場合は、以下を変更追記。
'↓↓↓↓↓↓↓↓↓↓↓↓↓↓

nodeArray = Array("Server1","Server2","Server3","Server4")

'↑↑↑↑↑↑↑↑↑↑↑↑↑↑
'------------------------------

'Initialize
Set Locator = WScript.CreateObject("WbemScripting.SWbemLocator")

On Error Resume Next

'Output Header
WScript.Echo("実行日時:" & Now() )
WScript.Echo("?:, ドライブ種別, 空容量(GB), 総容量(GB)")

'Main Process  Loop Unit is 1Node
For Each curNode in nodeArray
    
    'Connecting Node
    Set Service = Locator.ConnectServer( curNode, "root\cimv2", USERNAME, PASSWORD )
'    Set Service = Locator.ConnectServer     ' For Debug. Connect Local

    ' Get Node LogicalDisk Infomation
    Set Qfeset = Service.ExecQuery("Select * From Win32_LogicalDisk")

    'Make Output String and Output
    WScript.Echo("")
    WScript.Echo( curNode )
    For Each Qfe in Qfeset
        tmpstr = Qfe.DeviceID & ", " & Qfe.DriveType & ", " & INT(Qfe.FreeSpace/1024/1024/1024)+1 & ", " & INT(Qfe.Size/1024/1024/1024)+1
        WScript.Echo( tmpstr )
    Next
Next

WScript.Echo("")
WScript.Echo("ドライブ種別凡例: 3->ハードディスク 4->ネットワーク接続ドライブ 5->光学ドライブ")

'Terminate
Set Service = Nothing
Set Qfeset = Nothing