If (Exit_IncrementalDiscovery = DiscoveryType) Then
oDiscoveryData.IsSnapshot = False
End If
If (Start_SnapShotDiscovery <> DiscoveryType) Then
oAPI.Return(oDiscoveryData)
Set oAPI = Nothing
Set oDiscoveryData = Nothing
Exit Sub
End If
result = GetWmiGroups(groups,healthServiceName)
If (False = result) Then
oDiscoveryData.IsSnapshot = False
oAPI.Return(oDiscoveryData)
message = "Cannot get data from Wmi."
message = GetErrorMessage(message)
Call LogScomEvent(DiscoveryScriptName,ScriptEventId,EventTypeError,message,oAPI)
Set groups = Nothing
Set oAPI = Nothing
Set oDiscoveryData = Nothing
Exit Sub
End If
result = DoDiscovery(groups,clusterName,oDiscoveryData)
If (False = result) Then
message = "Discovery failled."
message = GetErrorMessage(message)
Call LogScomEvent(DiscoveryScriptName,ScriptEventId,EventTypeWarning,message,oAPI)
Set oDiscoveryData = Nothing
result = InitDiscoveryData(oAPI,oDiscoveryData,sourceId, managedEntityId,False)
End If
oAPI.Return(oDiscoveryData)
Set groups = Nothing
Set oDiscoveryData = Nothing
Set oAPI = Nothing
On Error Goto 0
End Sub
Function HasValue(Value)
Dim bNothing
bNothing = false
IF ( IsObject(Value) ) THEN
IF (Nothing is Value) THEN
bNothing = true
END IF
END IF
HasValue = Not ( IsEmpty(Value) or bNothing or IsNull(Value) )
End Function
Function CheckInitialization(ByRef healthServiceName,ByRef clusterName,ByRef sourceId,ByRef managedEntityId,oAPI,ByRef oDiscoveryData )
On Error Resume Next
Dim message
Dim result
Err.Clear
result = False
CheckInitialization = False
result = GetScriptParameters(healthServiceName,clusterName,sourceId,managedEntityId)
If (False = result) Then
message = "Cannot initialize script parameters. healthServiceName :" & healthServiceName & " clusterName : " & clusterName & " sourceId: " & sourceId & " managedEntityId:" & managedEntityId
message = GetErrorMessage(message)
Call LogScomEvent(DiscoveryScriptName,ScriptEventId,EventTypeWarning,message,oAPI)
Exit Function
End If
result = InitDiscoveryData(oAPI,oDiscoveryData,sourceId, managedEntityId,True)
If (False = result) Then
Call LogScomEvent(DiscoveryScriptName,ScriptEventId,EventTypeWarning,message,oAPI)
Set oAPI = Nothing
Set oDiscoveryData = Nothing
End If
CheckInitialization = result
End Function
Function GetScriptParameters(ByRef healthServiceName,ByRef clusterName,ByRef sourceId,ByRef managedEntityId)
On Error Resume Next
GetScriptParameters = False
Err.Clear
Dim oArgs
Dim Count
Set oArgs = WScript.Arguments
If (0 <> Err.number) Then
Exit Function
End If
Count = oArgs.Count
If (Count < 4) Then
Exit Function
End If
If ((False = HasValue(healthServiceName)) Or (False = HasValue(clusterName )) Or (False = HasValue(sourceId)) Or (False = HasValue(managedEntityId)) ) Then
Exit Function
End If
If (0 = Len(healthServiceName)) Then
healthServiceName = "."
End If
GetScriptParameters = True
On Error Goto 0
End Function
Function GetWmiGroups(ByRef groups,ByVal healthServiceName)
On Error Resume Next
If ( (False = HasValue(wmi)) Or (0 <> Err.Number) ) Then
If (Lcase(LocalNamespace) <> Lcase(Namespace) ) Then
Err.Clear
Set wmi = GetObject(LocalNamespace)
If ( (False = HasValue(wmi)) Or (0 <> Err.Number) ) Then
Set wmi = Nothing
Exit Function
End If
Else
Set wmi = Nothing
Exit Function
End If
End If
Set groups = wmi.ExecQuery("SELECT Name FROM MSCluster_ResourceGroup")
If (0 <> Err.Number) Then
Set wmi = Nothing
Set groups = Nothing
Exit Function
End If
Count = groups.Count
Set wmi = Nothing
GetWmiGroups = (0 = Err.Number)
End Function
Sub LogScomEvent(ScriptName,EventId,EventType,message,momAPI)
On Error Resume Next
Err.Clear
If (False = HasValue(momAPI)) Then
Set momAPI = CreateObject("MOM.ScriptAPI")
If ((False = HasValue(momAPI)) Or (0 <> Err.Number)) Then
Err.Clear
Exit SUb
End If
End If
Function InitMomAPI(ByRef momAPI)
On Error Resume Next
InitMomAPi = False
Err.Clear
Set momAPI = CreateObject("MOM.ScriptAPI")
If ((False = HasValue(momAPI)) Or (0 <> Err.Number )) Then
WScipt.Echo "Failed to get MOM API. MOM v3 must be installed to execute this script."
If ( 0 <> Len(Err.Description)) Then
WScipt.Echo "Error: " & Err.Description
End If
Err.Clear
Else
InitMomAPI = True
End If
On Error Goto 0
End Function
Function InitDiscoveryData(momAPI,ByRef DiscoveryData,sourceId, managedEntityId,IsSnapShot)
On Error Resume Next
InitDiscoveryData = False
Err.Clear
If (False = HasValue(momAPI)) Then
Exit Function
End If
Dim message
Set DiscoveryData = momAPI.CreateDiscoveryData(0, sourceId, managedEntityId)
If ((False = HasValue(DiscoveryData)) Or (0 <> Err.Number)) Then
message = "Failed to get Discovery Data Object."
message = GetErrorMessage(message)
Call LogScomEvent(DiscoveryScriptName,ScriptEventId,EventTypeError,message,momAPI)
Err.Clear
Else
DiscoveryData.IsSnapshot = IsSnapShot
InitDiscoveryData = (0 = Err.number)
End If
On Error Goto 0
End Function
Function GetErrorMessage(message)
If ( 0 <> Len(Err.Description)) Then
message = message & "Error: Id: " & Err.number & " Description:" & Err.Description
End If
GetErrorMessage = message
End Function
Function DoDiscovery(groups,clusterName,ByRef DiscoveryData)
Dim groupType
Dim coreClustGroupInst
Dim availableStorageGroupInst
Dim result
Dim group
On Error Resume Next
result = False
DoDiscovery = result
result = true
For Each group in groups
groupType = group.ExecMethod_("GetGroupType").ReturnValue
If (0 <> Err.number) Then
result = false
Exit For
End If
If groupType = 1 Then
Set coreClustGroupInst = DiscoveryData.CreateClassInstance(ClusterCoreGroupId)
coreClustGroupInst.AddProperty ClusterNamePropId,clusterName
coreClustGroupInst.AddProperty ObjectNamePropId,group.Name
If (0 <> Err.number) Then
result = false
Exit For
End If
DiscoveryData.AddInstance coreClustGroupInst
If (0 <> Err.number) Then
result = false
Exit For
End If
ElseIf groupType = 2 then
Set availableStorageGroupInst = DiscoveryData.CreateClassInstance(AvailableStorageGroupId)
availableStorageGroupInst.AddProperty ClusterNamePropId,clusterName
availableStorageGroupInst.AddProperty ObjectNamePropId,group.Name
If (0 <> Err.number) Then
result = false
Exit For
End If
DiscoveryData.AddInstance availableStorageGroupInst
If (0 <> Err.number) Then
result = false
Exit For
End If
End If
Next
Set group = Nothing
DoDiscovery = result
End Function
Function GetOsFilter(OSVersion,delimiter)
On Error Resume Next
Err.Clear
Dim Filter,Prefix,Separator,EndClause
Dim OsVersions,SubFilter
Filter = " where ProductType != 1"
GetOSFilter = Filter
If (Not HasValue(OSVersion) or 0 = Len(OSVersion)) Then
Exit Function
End If
If (Not HasValue(delimiter)) Then
delimiter = ","
End If
If (delimiter = OSVersion) Then
Exit Function
End If
Prefix = " and (Version like '"
Separator = "%' or Version like '"
EndClause = "%')"
OsVersions = Split(OSVersion,delimiter)
SubFilter = Join(OsVersions,Separator)
Filter = Filter & Prefix & SubFilter & EndClause
GetOSFilter = Filter
On Error Goto 0
End Function
Function GetServerOsVersionCheck(sComputerName,OsVersion,ByRef IsError,ByVal oAPI)
If ( IsObject(OsVersion)) Then
Exit Function
End If
sWmiTarget = "."
If ( Not IsObject(sComputerName)) Then
If (HasValue(sComputerName) and Len(sComputerName) > 0 ) Then
sWmiTarget = "" & sComputerName
End If
End If
sWmiTarget = "winmgmts:\\" & sWmiTarget & "\root\cimv2"
Filter = GetOsFilter(OsVersion,",")
StrQuery = "select Version from Win32_OperatingSystem" & Filter
Set oWmiSet = WMIExecQueryNoAbort(sWmiTarget, strQuery,oAPI)
If Err.Number <> 0 Then
IsError = True
Exit Function
End If
Count = oWmiSet.Count
If Err.Number <> 0 Then
IsError = True
Exit Function
End If
GetServerOsVersionCheck = ( Count > 0)
On Error Goto 0
End Function
Function GetSnapshotDiscovery(OsVersion,ByVal oAPI)
If (bIsOsValid) Then
iResult = Start_SnapShotDiscovery
Else
If (bIsError) Then
iResult = Exit_IncrementalDiscovery
Else
iResult = Exit_SnapShotDiscovery
End IF
End If
GetSnapshotDiscovery = iResult
End Function
Function WMIExecQueryNoAbort(ByVal sNamespace, ByVal sQuery, ByVal oAPI)
Dim oWMI, oQuery, nInstanceCount, message
Set WMIExecQueryNoAbort = Nothing
On Error Resume Next
Err.Clear
Set oWMI = GetObject(sNamespace)
If ((False = HasValue(oWMI)) Or (0 <> Err.number)) Then
message = "Unable to open WMI Namespace '" & sNamespace & "'. Check to see if the WMI service is enabled and running, and ensure this WMI namespace exists."
Call LogScomEvent(DiscoveryScriptName,ScriptEventId,EventTypeError,message,oAPI)
Set oWMI = Nothing
Exit Function
End If
Set oQuery = oWMI.ExecQuery(sQuery)
If ((False = HasValue(oQuery)) Or (0 <> Err.number)) Then
message = "The Query '" & sQuery & "' returned an invalid result set. Please check to see if this is a valid WMI Query."
Call LogScomEvent(DiscoveryScriptName,ScriptEventId,EventTypeError,message,oAPI)
Exit Function
End If