USERNAMEに指定する「ドメイン名\ユーザ名」は「ドメインの管理者権限が付与されたアカウント」を指定して下さい。
管理者権限の無いアカウントを指定した場合は、ディスクの全体容量や使用容量を取得する際に
Set Service = Locator.ConnectServer(NodeHost, "root\cimv2", USERNAME, PASSWORD)
の行で「アクセス拒否エラー」が起きて、ホスト名しかセルに書き込みません。
質問者さんが「サイズが拾えない」のは「アクセス拒否エラー」が出ているからだと思われます。
>ドメイン名、ユーザ名(Administrator)、パスワードは全サーバ共通となっております。
であれば、少なくとも
Const USERNAME="FOO_BER_DOMAIN\Administrator"
Const PASSWORD="Admin_password"
とかになってないと、期待通りに動かないと思われます。
>エラー出力されないため、どの部分が間違っているのか、書き方が悪いのかが分からず、
そういう場合は
On Error Resume Next
を
'--- On Error Resume Next
に書き換えて、エラー表示されるようにして下さい。
「On Error Resume Next」は「エラーが出ても無視して次の行を実行する」って意味ですので、デバッグ中はコメントアウトしておいて、エラーが出る状態にして実行しましょう。
そして、エラーが出ない、バグが居ないのを確認し、完成したのを確認してから、コメントアウトしていた部分を元に戻して、エラースキップするように修正して下さい。
以下のスクリプトで、添付画像の通り、正常に期待通りに動作するのを確認しています。
Const cstrDateFilename = "C:\Users\ユーザ名\Desktop\test.xlsx"
Const USERNAME="ドメイン名\ユーザ名"
Const PASSWORD="パスワード"
Dim NodeArray
Dim NodeHost
Dim LD1
Dim LD2
Dim Locator
Dim Service
Dim iRow
Dim Workbook
Dim Excel
Dim WorkSheet
Dim tmp1
Dim tmp2
Dim tmp3
Dim tmp4
Dim tmp5
'------------------------------
NodeArray = Array("サーバ1", "サーバ2", "サーバ3", "サーバ4")
'------------------------------
Set Locator = WScript.CreateObject("WbemScripting.SWbemLocator")
On Error Resume Next
iRow = 1
Set Workbook = GetObject(cstrDateFilename)
Set Excel = Workbook.Application
Workbook.Activate
Workbook.Windows(1).Visible = True
Excel.Visible = True
Set WorkSheet = Workbook.Worksheets(1)
WorkSheet.Activate
WorkSheet.Cells(iRow, 1).Value = "ホスト名"
WorkSheet.Cells(iRow, 2).Value = "ドライブ名"
WorkSheet.Cells(iRow, 3).Value = "ディスク全体容量"
WorkSheet.Cells(iRow, 4).Value = "ディスク使用量"
WorkSheet.Cells(iRow, 5).Value = "ディスク空き容量"
WorkSheet.Cells(iRow, 6).Value = "ディスク使用率"
For Each NodeHost In NodeArray
Set Service = Locator.ConnectServer(NodeHost, "root\cimv2", USERNAME, PASSWORD)
Set LD1 = Service.ExecQuery("Select * From Win32_LogicalDisk")
For Each LD2 In LD1
tmp1 = LD2.DeviceID
if isnull(LD2.Size) then
tmp2 = "N/A"
tmp3 = "N/A"
tmp4 = "N/A"
tmp5 = "N/A"
else
tmp2 = Round(LD2.Size / 1024 / 1024 / 1024, 2)
if isnull(LD2.FreeSpace) then
tmp3 = "N/A"
tmp4 = "N/A"
tmp5 = "N/A"
else
tmp3 = Round((LD2.Size - LD2.FreeSpace) / 1024 / 1024 / 1024, 2)
tmp4 = Round(LD2.FreeSpace / 1024 / 1024 / 1024, 2)
tmp5 = Round((LD2.Size - LD2.FreeSpace) / LD2.Size, 2)
end if
end if
iRow = iRow + 1
WorkSheet.Cells(iRow, 1).Value = NodeHost
WorkSheet.Cells(iRow, 2).Value = tmp1
WorkSheet.Cells(iRow, 3).Value = tmp2
WorkSheet.Cells(iRow, 4).Value = tmp3
WorkSheet.Cells(iRow, 5).Value = tmp4
WorkSheet.Cells(iRow, 6).Value = tmp5
if IsNumeric(tmp5) then
WorkSheet.Cells(iRow, 6).NumberFormatLocal = "0.00%"
end if
Next
Set Service = Nothing
Set LD1 = Nothing
Set LD2 = Nothing
Next
Set WorkSheet = Nothing
Set Excel = Nothing
Set Workbook = Nothing
なお「要らない関数は削除」「EXCELワークブックを開くのは最初の1回だけにする」「見出しはスクリプトで書き込む」「次のサーバーに接続する前にオブジェクトを開放する」「サイズが取得できないドライブはN/Aと書き込む」など、改良を施してあります。
お礼
ご回答ありがとうございました。 ご指摘のとおり、管理者権限をもっていないユーザで実施していたようです。 修正くださったサンプルコードまで提示いただき、感謝しきれません。 一部サーバでCドライブが出力されず、Eドライブ等の存在しないドライブ名を引っ張ってきて結果がN/Aというのはありますが、5台程度であるため手動で乗り切りつつ、別の方法も検討してみたいと思います。 重ね重ね、今回は本当にありがとうございました。