2014-07-17 21 views
1

我想評估連接到我的域的計算機的內存和其他詳細信息。我正在做的是將計算機名稱寫入文本文件,每行一個。腳本將逐個讀取文件(主機名),收集信息並將其寫入文件。這工作正常。如何在WMI連接中處理不可用的計算機?

問題是,如果一臺計算機不可用,那麼它會造成問題。例如,如果第一個主機名可用,第二個主機名不可用,則它會不斷重複顯示相同的信息。

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 
+0

您可以使用OERN而不檢查重要操作的成功/失敗。請參閱http://stackoverflow.com/a/24685438/603855以及那裏的鏈接,以找到適當處理「異常」的策略。 –

回答

2

GetObject()失敗,該變量objWMIService保留其以前的值,所以你一遍又一遍的報告相同的主機,直到GetObject()可以連接到主機或循環終止。更改此:

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 

到這一點:

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

,問題就會消失。


在不同的音符,第2行中外環將始終檢索本地計算機的主機名:

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

如果這是你真正想要的東西,你應該向外移動的代碼環路,因爲strHostname的值不會改變:

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

如果你真的想在遠程計算機的名稱(這將使很多更有意義時,Infor公司的其餘部分mation也來自遠程計算機),您可以簡單地使用strComputer並完全刪除註冊表查詢。

相關問題