Dim objArgs, SourceID, ManagedEntityId, TargetComputer, ImagePath, SerialNumber
Dim objMOMAPI, objWMIService, objDiscoveryData
Dim colobjPorts, objHBAs, AdaptName, strQuery
Dim objPort, objHBA
Dim arrOfInst(97) '2 * maxadapters.
Dim objPortInst, InstanceName
Dim bFoundInstance, Index, portIndex,SystemEntity, portWWN, FabricName
Dim HyperVGUID
Dim VMMServerName
Dim objAdapInst,objHBAPortRel
bFoundInstance = True
Set objArgs = WScript.Arguments
If WScript.Arguments.Count > 0 Then
SourceId = objArgs(0)
ManagedEntityId = objArgs(1)
ImagePath = objArgs(2)
SerialNumber = objArgs(3)
AdaptName = objArgs(4)
TargetComputer = objArgs(5)
HyperVGUID = objArgs(6)
VMMServerName = objArgs(7)
End If
Set objMOMAPI = CreateObject("MOM.ScriptAPI")
Set objDiscoveryData = objMOMAPI.CreateDiscoveryData(0, SourceId, ManagedEntityId)
Set objWMIService = GetObject( "winmgmts:\\localhost\root\wmi" )
strQuery = "select * from MSFC_FCAdapterHBAAttributes Where SerialNumber='" + SerialNumber +"'"
Set objHBAs = objWMIService.ExecQuery( strQuery)
If (objHBAs is Nothing) Then
bFoundInstance = False
End If
'Get number of port InstanceNames with the same SerialNumber.
Index = 0
For Each objHBA In objHBAs
arrOfInst(Index) = objHBA.InstanceName
Index = Index + 1
Next
Set colobjPorts = objWMIService.ExecQuery("select * from MSFC_FibrePortHBAAttributes" )
If (colobjPorts is Nothing And bFoundInstance) Then
bFoundInstance = False
End If
portIndex = 0
If (colobjPorts.count > 0 And bFoundInstance) Then
For Each objPort In colobjPorts
If (ChkStrExistsInArray(arrOfInst,objPort.InstanceName,Index,False) = true) Then
'Create HBA Instance and HBA PORT relation object.
Set objAdapInst = objDiscoveryData.CreateClassInstance("$MPElement[Name='Brocade.FCHBA.Monitoring.2012.HBA']$")
Call objAdapInst.AddProperty("$MPElement[Name='Brocade.FCHBA.Monitoring.2012.Host']/ImagePath$", ImagePath)
Call objAdapInst.AddProperty ("$MPElement[Name='Windows!Microsoft.Windows.Computer']/PrincipalName$", TargetComputer)
Call objAdapInst.AddProperty("$MPElement[Name='Brocade.FCHBA.Monitoring.2012.HBA']/SerialNumber$", SerialNumber)
'End of new code.
FabricName = WWNToString(objPort.Attributes.FabricName)'unique to this adapter port.
portWWN = WWNToString(objPort.Attributes.PortWWN)'unique to this adapter port.
SystemEntity = AdaptName + "_Port" + CStr(portIndex)
Set objPortInst = objDiscoveryData.CreateClassInstance("$MPElement[Name='Brocade.FCHBA.Monitoring.2012.Port']$")
Call objPortInst.AddProperty ("$MPElement[Name='Windows!Microsoft.Windows.Computer']/PrincipalName$", TargetComputer)
Call objPortInst.AddProperty("$MPElement[Name='Brocade.FCHBA.Monitoring.2012.Port']/PortWWN$", portWWN)
Call objPortInst.AddProperty("$MPElement[Name='Brocade.FCHBA.Monitoring.2012.Port']/UniquePortId$", objPort.UniquePortId)
Call objPortInst.AddProperty("$MPElement[Name='Brocade.FCHBA.Monitoring.2012.Port']/PortFcId$", objPort.Attributes.PortFcId)
Call objPortInst.AddProperty("$MPElement[Name='Brocade.FCHBA.Monitoring.2012.Port']/FabricName$", FabricName)
Call objPortInst.AddProperty("$MPElement[Name='Brocade.FCHBA.Monitoring.2012.Port']/PortSpeed$", getPortSpeed(objPort.Attributes.PortSpeed))
Call objPortInst.AddProperty("$MPElement[Name='Brocade.FCHBA.Monitoring.2012.Port']/PortState$", objPort.Attributes.PortState)
Call objPortInst.AddProperty("$MPElement[Name='Brocade.FCHBA.Monitoring.2012.Port']/HostName$", TargetComputer)
Call objPortInst.AddProperty("$MPElement[Name='Brocade.FCHBA.Monitoring.2012.Port']/VMMServerName$", VMMServerName)
Call objPortInst.AddProperty("$MPElement[Name='Brocade.FCHBA.Monitoring.2012.Port']/InstanceName$", objPort.InstanceName)
Call objAdapInst.AddProperty("$MPElement[Name='Brocade.FCHBA.Monitoring.2012.Port']/AdapterSerialNumber$", SerialNumber)
' Added for SC2012 integation as a pre-requisite for PRO feature to work.
Call objPortInst.AddProperty("$MPElement[Name='PRO!Microsoft.SystemCenter.VirtualMachineManager.PRO.Base']/Name$", TargetComputer)
Call objDiscoveryData.AddInstance(objPortInst)
'Call objMOMAPI.LogScriptEvent("DiscoverHBAPorts.vbs", 200, 2, "one Port instance added")
portIndex = portIndex + 1
End If
Next
End If
'Call objMOMAPI.LogScriptEvent("DiscoverHBAPorts.vbs", 200, 2, "Completed DiscoverHBAPorts.vbs.")
'Submit the discovery data for processing.
Call objMOMAPI.Return(objDiscoveryData)
WScript.Quit
'----------------------------End Of Main Fn---------------
'Converts WWN to StringWWN
Function WWNToString(arrayWWN)
Dim I
WWNToString = Hex0(arrayWWN(0))
For I = 1 To 7
WWNToString = WWNToString + ":" + Hex0(arrayWWN(I))
Next
End Function
'Returns the hexadecimal string value of input number(as two digits).
Function Hex0(n)
Hex0 = Hex(n)
If (n < &h10) Then Hex0 = "0" + Hex0
End Function
'If str exists then returns true
'If not exists then returns false and adds the string to the array (if bAddTo is true)
'If not exists then returns false and does not add the inputstring to the list(if bAddTo is false)
Function ChkStrExistsInArray(arrayOfStrs(),InputStr,LastItemIndex,bAddTo)
Dim I
ChkStrExistsInArray = False
For I = 0 To LastItemIndex
If (StrComp(LCase(arrayOfStrs(I)),LCase(InputStr)) = 0) Then
ChkStrExistsInArray = true
Exit For
End If
Next
If (ChkStrExistsInArray = False And bAddTo=True) Then
arrayOfStrs(LastItemIndex+1) = InputStr
End If
End Function
' Function to map the HBA constants to SCOM constant.
Function getPortSpeed(portSpeed)
Dim speed
speed = "Unknown"
If portSpeed = HBA_PORTSPEED_UNKNOWN Then
speed = SCOM_PORTSPEED_UNKNOWN
ElseIf portSpeed = HBA_PORTSPEED_1GBIT Then
speed = SCOM_PORTSPEED_1GBIT
ElseIf portSpeed = HBA_PORTSPEED_2GBIT Then
speed = SCOM_PORTSPEED_2GBIT
ElseIf portSpeed = HBA_PORTSPEED_10GBIT Then
speed = SCOM_PORTSPEED_10GBIT
ElseIf portSpeed = HBA_PORTSPEED_4GBIT Then
speed = SCOM_PORTSPEED_4GBIT
End If
getPortSpeed = speed
End Function