Sunil Kumar
Sunil Kumar

Reputation: 11

How to handle unavailable computers in WMI connections?

I want to assess the memory and other details of computers connected to my domain. What I am doing is writing the computer name in a text file, one per line. the Script will read the file (hostname) one by one, gather the information, and write it to a file. This is working fine.

Problem is that if one computer is not available then it's making problems. For example, if first host name is available and second is not available, then it keeps showing the same information repeatedly.

INPUT_FILE_NAME = "D:\tmp\Computer.txt"
Const FOR_READING = 1
Const HKEY_LOCAL_MACHINE = &H80000002
strRegKey = "SYSTEM\CurrentControlSet\Services\Tcpip\Parameters"

Set objFSO = CreateObject("Scripting.FileSystemObject")

Set objFile = objFSO.OpenTextFile(INPUT_FILE_NAME, FOR_READING)
strComputers = objFile.ReadAll
objFile.Close

arrComputers = Split(strComputers, vbCrLf)

For Each strComputer In arrComputers
  On Error Resume Next
  Set objReg = GetObject("winmgmts:{impersonationLevel=impersonate}!" & _
    "//./root/default:StdRegProv")
  objReg.GetStringValue HKEY_LOCAL_MACHINE, strRegKey, "Hostname", strHostname

  Set objWMIService = GetObject("winmgmts:" _
    & "{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2")
  Set colPageFiles = objWMIService.ExecQuery _
    ("Select * from Win32_PageFileUsage")
  For each objPageFile in colPageFiles
    Wscript.Echo "Host Name: " & strHostName, _
      "AllocatedBaseSize: "& vbTab & objPageFile.AllocatedBaseSize, _
      "CurrentUsage: "& vbTab & objPageFile.CurrentUsage, _
      "Description: "& vbTab & objPageFile.Description, _
      "InstallDate: "& vbTab & objPageFile.InstallDate, _
      "Name: " & vbTab & objPageFile.Name, _
      "PeakUsage: " & vbTab &  objPageFile.PeakUsage
  Next
Next

Upvotes: 1

Views: 111

Answers (1)

Ansgar Wiechers
Ansgar Wiechers

Reputation: 200453

When GetObject() fails, the variable objWMIService retains its previous value, so you're reporting the same host over and over again, until either GetObject() can connect to a host or the loop terminates. Change this:

Set objWMIService = GetObject("winmgmts:" _
  & "{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2")
Set colPageFiles = objWMIService.ExecQuery _
  ("Select * from Win32_PageFileUsage")
For each objPageFile in colPageFiles
  Wscript.Echo "Host Name: " & strHostName, _
    "AllocatedBaseSize: "& vbTab & objPageFile.AllocatedBaseSize, _
    "CurrentUsage: "& vbTab & objPageFile.CurrentUsage, _
    "Description: "& vbTab & objPageFile.Description, _
    "InstallDate: "& vbTab & objPageFile.InstallDate, _
    "Name: " & vbTab & objPageFile.Name, _
    "PeakUsage: " & vbTab &  objPageFile.PeakUsage
Next

into this:

Set objWMIService = Nothing
Set objWMIService = GetObject("winmgmts:" _
  & "{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2")
If Not objWMIService Is Nothing Then
  Set colPageFiles = objWMIService.ExecQuery _
    ("Select * from Win32_PageFileUsage")
  For each objPageFile in colPageFiles
    Wscript.Echo "Host Name: " & strHostName, _
      "AllocatedBaseSize: "& vbTab & objPageFile.AllocatedBaseSize, _
      "CurrentUsage: "& vbTab & objPageFile.CurrentUsage, _
      "Description: "& vbTab & objPageFile.Description, _
      "InstallDate: "& vbTab & objPageFile.InstallDate, _
      "Name: " & vbTab & objPageFile.Name, _
      "PeakUsage: " & vbTab &  objPageFile.PeakUsage
  Next
Else
  WScript.Echo strComputer & " unavailable."
End If

and the problem will disappear.


On a different note, the first 2 lines in the outer loop will always retrieve the hostname of your local computer:

Set objReg = GetObject("winmgmts:{impersonationLevel=impersonate}!" & _
  "//./root/default:StdRegProv")
objReg.GetStringValue HKEY_LOCAL_MACHINE, strRegKey, "Hostname", strHostname

If that's what you actually want, you should move the code outside the loop, because the value of strHostname won't change:

Set objReg = GetObject("winmgmts:{impersonationLevel=impersonate}!" & _
  "//./root/default:StdRegProv")
objReg.GetStringValue HKEY_LOCAL_MACHINE, strRegKey, "Hostname", strHostname
For Each strComputer In arrComputers
  '...
Next

If you actually want the name of the remote computer (which would make a lot more sense when the rest of the information is from the remote computer as well), you could simply use strComputer and remove the registry query entirely.

Upvotes: 2

Related Questions