'********************************************************** ' Script: GetHBAInfo script ' Author: Catapult Systems ' Date: 02/01/2010 ' ' Purpose: Script creates a custom WMI class and populates ' it with HBA info. Data is gathered by running the FCInfo ' utility. A log is created under %windir%\temp with ' execution details. '********************************************************** On Error Resume Next Const ForReading = 1, ForWriting = 2 Const WMIClassName = "Custom_HBA_Info" Const wbemCimtypeString = 8 Const wbemCimtypeDateTime = 101 Dim WshShell, oExec Set WshShell = CreateObject("WScript.Shell") Set objFSO = CreateObject("Scripting.FileSystemObject") winDir = WshShell.ExpandEnvironmentStrings("%windir%") ' Create Log File datetimestamp = GetUseableDateTime() Set f1 = objFSO.OpenTextFile(winDir & "\Temp\GetHBAInfo_" & datetimestamp & ".log", ForWriting, TRUE) f1.writeline "GetHBAInfo.vbs executing on " & wshShell.ExpandEnvironmentStrings( "%COMPUTERNAME%" ) If objFSO.FolderExists(winDir & "\SysWOW64") then f1.writeline "System appears to be 64bit. Setting execution path to '%WinDir%\Sysnative'" path = winDir & "\System32" Set WshEnv = WshShell.Environment("SYSTEM") f1.writeline "Adding '%WinDir%\Sysnative' to PATH statement." WshEnv("Path") = WshEnv("Path") & ";" & path f1.writeline "Retrun code from appending to PATH: " & err.number Else f1.writeline "System appears to be 32bit. Setting execution path to '%WinDir%\System32'" path = winDir & "\System32" End If ' Execute fcinfo command f1.writeline "Executing 'fcinfo.exe /details' command" Set oExec = WshShell.Exec(path & "\fcinfo.exe /details") f1.writeline "Retrun code from executing command: " & err.number If err.number = "-2147024894" then f1.writeline "fcinfo.exe could not be found. Exiting script." wscript.quit End If 'wait for the end of process Do While oExec.Status = 0 WScript.Sleep 100 Loop f1.writeline "FCInfo status code: " & oExec.Status f1.writeline "Output of command is below:" & vbcrlf tmpArr = Split(oExec.StdOut.ReadAll, vbcrlf) ' Determine number of adapters and find line number where data starts If UBOUND(tmparr) <= 3 then f1.writeline "No Adapters present...exiting." wscript.quit End If for i = 0 to UBOUND(tmparr) f1.writeline tmpArr(i) If instr(1, tmpArr(i), "adapter:", 1) <> 0 then y = y & i & "," End If next tmpArr2 = split(left(y, len(y) - 1), ",") f1.writeline vbcrlf & "Script determined there are " & UBOUND(tmpArr2) + 1 & " HBAs." ' Delete existing data in custom WMI class f1.writeline "Calling subroutien to delete existing 'Custom_HBA_Info WMI' class." DeleteExistingDataClass WMIClassName ' Loop through once for each adapter f1.writeline "Beginning to loop through fcinfo output, once per HBA." for j = 0 to UBOUND(tmpArr2) ' get Adapter value for i = tmpArr2(j) to tmpArr2(j) + 18 if instr(tmpArr(i), "adapter:") <> 0 then adapter = mid(tmpArr(i), instr(1, tmpArr(i), "adapter:", 1) + 9) End If next f1.writeline "Retrieved data for 'adapter': " & adapter ' get node_WWN value for i = tmpArr2(j) to tmpArr2(j) + 18 if instr(tmpArr(i), "node_wwn:") <> 0 then nodeWWN = mid(tmpArr(i), instr(1, tmpArr(i), "node_wwn:", 1) + 10) End If next f1.writeline "Retrieved data for 'node_wwn': " & nodeWWN ' get Port WWN value for i = tmpArr2(j) to tmpArr2(j) + 18 if instr(tmpArr(i), "port_wwn:") <> 0 then portWWN = mid(tmpArr(i), instr(1, tmpArr(i), "port_wwn:", 1) + 10) End If next f1.writeline "Retrieved data for 'port_wwn': " & portWWN ' get Serial Number value for i = tmpArr2(j) to tmpArr2(j) + 18 if instr(tmpArr(i), "sernum:") <> 0 then serialNumber = mid(tmpArr(i), instr(1, tmpArr(i), "sernum:", 1) + 8) End If next f1.writeline "Retrieved data for 'sernum': " & serialNumber ' get Driver Name value for i = tmpArr2(j) to tmpArr2(j) + 18 if instr(tmpArr(i), "drvnam:") <> 0 then driverName = mid(tmpArr(i), instr(1, tmpArr(i), "drvnam:", 1) + 8) End If next f1.writeline "Retrieved data for 'drvnam' " & driverName ' get Driver Version value for i = tmpArr2(j) to tmpArr2(j) + 18 if instr(tmpArr(i), "drvver:") <> 0 then driverVer = mid(tmpArr(i), instr(1, tmpArr(i), "drvver:", 1) + 8) End If next f1.writeline "Retrieved data for 'drvver': " & driverVer ' get Firmware Version value for i = tmpArr2(j) to tmpArr2(j) + 18 if instr(tmpArr(i), "fwver:") <> 0 then firmwareVer = mid(tmpArr(i), instr(1, tmpArr(i), "fwver:", 1) + 7) End If next f1.writeline "Retrieved data for 'fwver': " & firmwareVer f1.writeline "Calling 'CreateDataClass' subroutein to write collected data into WMI." CreateDataClass WMIClassName, adapter, nodeWWN, portWWN, serialNumber, driverName, driverVer, firmwareVer Next Sub DeleteExistingDataClass(className) On Error Resume Next f1.writeline "Deleting '" & className & "' WMI class." Set objSWbem = GetObject("winmgmts:\\.\root\cimv2") set oNewObject = objSWbem.Get(className) On Error GoTo 0 If Not IsEmpty(oNewObject) Then oNewObject.Delete_ f1.writeline "Deletion event error code: " & err.number End If End Sub Sub CreateDataClass(className, adapter, wwn, pwwn, sn, drvname, drvver, firver) f1.writeline "Creating '" & className & "' WMI Class." strDate = Now Set objSWbem = GetObject("winmgmts:\\.\root\cimv2") Set oDateCollected = CreateObject("WbemScripting.SWbemDateTime") Set oDataObject = objSWbem.Get oDataObject.Path_.Class = className oDataObject.Properties_.add "Adapter", wbemCimtypeString oDataObject.Properties_.add "NodeWWN", wbemCimtypeString oDataObject.Properties_.add "PortWWN", wbemCimtypeString oDataObject.Properties_.add "SerialNumber", wbemCimtypeString oDataObject.Properties_.add "DriverName", wbemCimtypeString oDataObject.Properties_.add "DriverVersion", wbemCimtypeString oDataObject.Properties_.add "FirmwareVersion", wbemCimtypeString oDataObject.Properties_.add "DateCollected", wbemCimtypeDateTime oDataObject.Properties_("Adapter").Qualifiers_.add "key", True On Error Resume Next f1.writeline "Creating attributes withing the class." oDataObject.Put_ classCreateError = Err.Number f1.writeline "Attribute creation error code: " & err.number On Error GoTo 0 If classCreateError = 0 Then 'Populate data class f1.writeline "Adding data to WMI class." Set oNewObject = objSWbem.Get(className).SpawnInstance_ oDateCollected.SetVarDate (CDate(strDate)) oNewObject.DateCollected = oDateCollected.Value oNewObject.Adapter = adapter oNewObject.NodeWWN = wwn oNewObject.PortWWN = pwwn oNewObject.SerialNumber = sn oNewObject.DriverName = drvname oNewObject.DriverVersion = drvver oNewObject.FirmwareVersion = firver oNewObject.Put_ f1.writeline "Data addition error code: " & err.number End If End Sub Function GetUseableDateTime() uTime = Hour(Now) & Minute(Now) & Second(Now) uDate = replace(Date,"/","") GetUseableDateTime = uDate & "_" & uTime End Function