Dim aux1, aux2
Dim oAPI, oArgs, oDiscoveryData, sMessage
Dim SourceId, ManagedEntityId, sComputer, bIsVirtual, bLogDetail
Dim oWMI, cServices, cClusterServices, oClusterService, tClusterServices, sSupportingServer
Dim sResourceName, sNetworkName, sRegRoot, wshNetwork
aux1 = 0
aux2 = 0
Set oAPI = CreateObject("MOM.ScriptAPI")
Set oArgs = WScript.Arguments
If oArgs.Count < 4 Then Call ShowUsage()
SourceId = oArgs(0)
ManagedEntityId = oArgs(1)
sComputer = oArgs(2)
If Len(oArgs(3)) > 0 Then
bIsVirtual = CBool(oArgs(3))
Else
bIsVirtual = False
End If
bLogDetail = CBool(oArgs(4))
Set wshNetwork = CreateObject("Wscript.Network")
sMessage = "Discovery started with following parameters: " & VbCrLf & _
"Source ID: " & SourceId & VbCrLf & _
"Managed Entity ID: " & ManagedEntityId & VbCrLf & _
"Computer: " & sComputer & VbCrLf & _
"Network: " & wshNetwork.ComputerName & VbCrLf & _
"Discover bIsVirtual : " & bIsVirtual & VbCrLf & _
"User credentials: " & wshNetwork.UserDomain & "\" & wshNetwork.UserName
Call LogDetail(EVENTNO_SCRIPT_STARTED,sMessage)
Set oDiscoveryData = oAPI.CreateDiscoveryData(0, SourceId, ManagedEntityId)
On Error Resume Next
Set oWMI = GetObject("winmgmts:\\" & sComputer & "\root\cimv2")
Set cServices = oWMI.ExecQuery("select * from win32_service where name = 'MSMQ'")
Set cClusterServices = oWMI.ExecQuery("select * from win32_service where name like 'MSMQ$%'")
If Err <> 0 Then Call ThrowScriptError(EVENTNO_ERROR_WMI,EVENT_LEVEL_ERROR,"Error attempting to locate MSMQ service through WMI.",True)
On Error GoTo 0
'Check for clustered instances
If bIsVirtual = True Then
For Each oClusterService In cClusterServices
sResourceName = Replace(oClusterService.Name,"MSMQ$","")
sNetworkName = GetNetworkName(sComputer,sResourceName)
aux1 = aux1 + 1
If LCase(sNetworkName) = LCase(GetShortName(sComputer)) Then
Call LogDetail(EVENTNO_SERVER_FOUND,"Clustered server found on " & sComputer & " .")
sRegRoot = "SOFTWARE\Microsoft\MSMQ\Clustered QMs\" & oClusterService.Name
Call CreateMSMQServerInstance(sComputer,sRegRoot,oClusterService.Name,True)
End If
Next
Set tClusterServices = oWMI.ExecQuery("select * from win32_service where name like 'MSMQTriggers$%'")
For Each oClusterService In tClusterServices
aux2 = aux2 + 1
sResourceName = Replace(oClusterService.Name,"MSMQTriggers$","")
sNetworkName = GetNetworkName(sComputer,sResourceName)
If LCase(sNetworkName) = LCase(GetShortName(sComputer)) Then
Call CreateServiceInstance("MSMQTriggers",oClusterService.Name)
End If
Next
If aux1 = 0 And aux2 = 0 Then
Call LogDetail(EVENTNO_EMPTY,"Empty!")
End If
End If
'Check for regular instances
If bIsVirtual = False Then
sRegRoot = "SOFTWARE\Microsoft\MSMQ"
'First check if we have a clustered node.
If IsMSMQClusterNode(sComputer) = True Then
Call LogDetail(EVENTNO_NOSERVER_FOUND,"Server " & sComputer & " is a cluster node. Discovery for MSMQ will be performed on virtual and local machine.")
End If
'No clustered instances, check for physical instances.
If cServices.Count > 0 Then
Call LogDetail(EVENTNO_SERVER_FOUND,"Server found on " & sComputer & " .")
Call CreateMSMQServerInstance(sComputer,sRegRoot,"MSMQ",False)
Call CreateServiceInstance("MSMQTriggers","MSMQTriggers")
Else
'Check if we have a dependent client
sSupportingServer = GetRegStringValue(sComputer,sRegRoot & "\Parameters","RemoteQMMachine")
If Len(sSupportingServer) > 0 Then
Call LogDetail(EVENTNO_SERVER_FOUND,"Dependent client found." & VbCrLf & "Supporting server: " & sSupportingServer)
Else
'No MSMQ.
Call LogDetail(EVENTNO_NOSERVER_FOUND,"No MSMQ services located.")
End If
End If
End If
oAPI.Return(oDiscoveryData)
Call LogDetail(EVENTNO_DISCDATA_SUBMITTED,"Discovery data submitted.")
Call LogDetail(EVENTNO_SCRIPT_ENDED,"MSMQ Server Discovery script ended.")
Sub CreateMSMQServerInstance(ComputerName,RegRoot,ServiceName,IsVirtual)
Dim sVersion, sMessage, oInstance, dMachineQuota, dJournalQuota
Dim sMessageFilesFolder, sMessageLoggerFolder, sTransactionLoggerFolder
sVersion = GetRegStringValue(ComputerName,RegRoot & "\Parameters","CurrentBuild")
If Not Left(sVersion,3) = "6.3" Then
sMessage = "MSMQ found but not supported version." & VbCrLf & _
"Version found: " & sVersion
Call LogDetail(EVENTNO_SERVER_FOUND_WRONGVERSION,sMessage)
Exit Sub
End If
Set oInstance = oDiscoveryData.CreateClassInstance("$MPElement[Name='Microsoft.MSMQ.6.3.Servers']$")
Call oInstance.AddProperty("$MPElement[Name='Windows!Microsoft.Windows.Computer']/PrincipalName$", ComputerName)
Call oInstance.AddProperty("$MPElement[Name='System!System.Entity']/DisplayName$", ComputerName)
Call oInstance.AddProperty("$MPElement[Name='Microsoft.MSMQ.6.3.ServerRole']/ServiceName$", ServiceName)
Call oInstance.AddProperty("$MPElement[Name='Microsoft.MSMQ.6.3.Server']/Version$", sVersion)
Call oInstance.AddProperty("$MPElement[Name='Microsoft.MSMQ.6.3.Server']/Workgroup$", GetRegDWordValue(ComputerName,RegRoot & "\Parameters","Workgroup",True))
Call oInstance.AddProperty("$MPElement[Name='Microsoft.MSMQ.6.3.Server']/DependentClients$", GetRegDWordValue(ComputerName,RegRoot & "\Parameters\MachineCache","MQS_DepClients",True))
Call oInstance.AddProperty("$MPElement[Name='Microsoft.MSMQ.6.3.Server']/Routing$", GetRegDWordValue(ComputerName,RegRoot & "\Parameters\MachineCache","MQS_Routing",True))
dMachineQuota = GetRegDWordValue(ComputerName,RegRoot & "\Parameters\MachineCache","MachineQuota",False)
If IsNull(dMachineQuota) = True Then
Call oInstance.AddProperty("$MPElement[Name='Microsoft.MSMQ.6.3.Server']/Quota$", -1)
Else
Call oInstance.AddProperty("$MPElement[Name='Microsoft.MSMQ.6.3.Server']/Quota$", dMachineQuota)
End If
dJournalQuota = GetRegDWordValue(ComputerName,RegRoot & "\Parameters\MachineCache","MachineJournalQuota",False)
If IsNull(dJournalQuota) = True Then
Call oInstance.AddProperty("$MPElement[Name='Microsoft.MSMQ.6.3.Server']/JournalQuota$", CDbl(-1))
Else
Call oInstance.AddProperty("$MPElement[Name='Microsoft.MSMQ.6.3.Server']/JournalQuota$", CDbl(dJournalQuota))
End If
sMessageFilesFolder = GetRegStringValue(ComputerName,RegRoot & "\Parameters","StorePersistentPath")
sMessageLoggerFolder = GetRegStringValue(ComputerName,RegRoot & "\Parameters","StoreLogPath")
sTransactionLoggerFolder = GetRegStringValue(ComputerName,RegRoot & "\Parameters","StoreXactLogPath")
Call oInstance.AddProperty("$MPElement[Name='Microsoft.MSMQ.6.3.Server']/MessageFilesFolder$", sMessageFilesFolder)
Call oInstance.AddProperty("$MPElement[Name='Microsoft.MSMQ.6.3.Server']/MessageLoggerFolder$", sMessageLoggerFolder)
Call oInstance.AddProperty("$MPElement[Name='Microsoft.MSMQ.6.3.Server']/TransactionLoggerFolder$", sTransactionLoggerFolder)
Call oInstance.AddProperty("$MPElement[Name='Microsoft.MSMQ.6.3.Server']/IsClustered$", IsVirtual)
If IsVirtual Then Call oInstance.AddProperty("$MPElement[Name='Microsoft.MSMQ.6.3.Server']/ClusterResourceName$", Replace(ServiceName,"MSMQ$",""))
Call oDiscoveryData.AddInstance(oInstance)
If InStr(ShortName,".") > 0 Then
GetFQDN = ShortName
Else
sDomain = Right(sComputer,Len(sComputer)-InStr(sComputer,"."))
GetFQDN = ShortName & "." & sDomain
End If
End Function
Function GetShortName(FQDN)
If InStr(FQDN,".") > 0 Then
GetShortName = Left(FQDN,InStr(FQDN,".")-1)
Else
GetShortName = FQDN
End If
End Function
Function GetMSMQVersion(Computer,RegRoot)
sVersion = GetRegStringValue(Computer,sRegRoot & "\Parameters","CurrentBuild")
End Function
Function IsMSMQClusterNode(Computer)
Dim WMI, Services, WMICluster, oResources
Set WMI = GetObject("winmgmts:\\" & Computer & "\root\cimv2")
Set Services = WMI.ExecQuery("select * from win32_service where name = 'ClusSvc'")
If Services.Count > 0 Then
Set WMICluster = GetObject("winmgmts:\\" & Computer & "\root\mscluster")
Set oResources = WMICluster.ExecQuery("select * from mscluster_resource where type = 'MSMQ'")
If oResources.Count > 0 Then
IsMSMQClusterNode = True
Else
IsMSMQClusterNode = False
End If
Else
IsMSMQClusterNode = False
End If
End Function
Sub CreateServiceInstance(ServiceType,ServiceName)
Dim oServices, oInstance
Set oServices = oWMI.ExecQuery("select * from win32_service where name = '" & ServiceName & "'")
If oServices.Count > 0 Then
Select Case (ServiceType)
Case "MSMQTriggers"
Set oInstance = oDiscoveryData.CreateClassInstance("$MPElement[Name='Microsoft.MSMQ.6.3.Triggers']$")
Call oInstance.AddProperty("$MPElement[Name='Microsoft.MSMQ.6.3.Trigger']/ServiceName$", ServiceName)
End Select
Call oInstance.AddProperty("$MPElement[Name='Windows!Microsoft.Windows.Computer']/PrincipalName$", sComputer)
Call oInstance.AddProperty("$MPElement[Name='System!System.Entity']/DisplayName$", ServiceName)
Call oDiscoveryData.AddInstance(oInstance)
End If
End Sub
Function GetClusterGroupName(NetworkName)
Set oWMI = GetObject("winmgmts:\\" & NetworkName & "\root\mscluster")
Set cResources = oWMI.ExecQuery("Select * from mscluster_resource where PrivateProperties.Name = '" & GetShortName(NetworkName) & "'")
For Each oResource In cResources
sNameResource = oResource.Name
Next
Set cGroups = oWmi.ExecQuery("ASSOCIATORS OF {mscluster_Resource='" & sNameResource & "'} where AssocClass = MSCluster_ResourceGroupToResource Role=PartComponent")
For Each oGroup In cGroups
GetClusterGroupName = oGroup.Name
Next
End Function
Function GetNetworkName(Computer,ResourceName)
Dim oWMICluster, cDependentResources, oDependentResource
GetNetworkName = ""
Set oWMICluster = GetObject("winmgmts:\\" & Computer & "\root\mscluster")
Set cDependentResources = oWMICluster.ExecQuery("ASSOCIATORS OF {mscluster_Resource='" & ResourceName & "'} where AssocClass = MSCluster_ResourceToDependentResource Role=Antecedent")
For Each oDependentResource In cDependentResources
If oDependentResource.Type = "Network Name" Then
GetNetworkName = oDependentResource.PrivateProperties.Name
End If
Next
End Function
Function GetMSMQResourceName(NetworkName)
Dim sGroup, oWMI, cResources, oResource
sGroup = GetClusterGroupName(NetworkName)
Set oWMI = GetObject("winmgmts:\\" & NetworkName & "\root\mscluster")
Set cResources = oWmi.ExecQuery("ASSOCIATORS OF {mscluster_ResourceGroup='" & sGroup & "'} where AssocClass = MSCluster_ResourceGroupToResource Role=GroupComponent")
For Each oResource In cResources
If oResource.Type = "MSMQ" Then GetMSMQResourceName = oResource.Name
Next
End Function
Function GetRegSubkeys(Computer,RegKeyPath)
Dim oReg
Set oReg = GetObject("winmgmts:\\" & Computer & "\root\default:StdRegProv")
oReg.EnumKey HKEY_LOCAL_MACHINE,RegKeyPath,Keys
GetRegSubkeys = Keys
End Function
Function GetRegStringValue(Computer,RegKeyPath,RegValueName)
Dim oReg, Value
Set oReg = GetObject("winmgmts:\\" & Computer & "\root\default:StdRegProv")
oReg.GetStringValue HKEY_LOCAL_MACHINE,RegKeyPath,RegValueName,Value
GetRegStringValue = Value
End Function
Function GetRegDWordValue(Computer,RegKeyPath,RegValueName,ConvertToBoolean)
Dim oReg, Value
Set oReg = GetObject("winmgmts:\\" & Computer & "\root\default:StdRegProv")
oReg.GetDWordValue HKEY_LOCAL_MACHINE,RegKeyPath,RegValueName,Value
If CBool(ConvertToBoolean) = True Then
If IsNull(Value) Then
GetRegDWordValue = False
Else
GetRegDWordValue = CBool(Value)
End If
Else
GetRegDWordValue = Value
End If
End Function
Sub LogDetail(EventNo,Message)
Message = VbCrLf & "Calling MP Element ID: $MPElement$" & vbcrlf & Message
If bLogDetail = True Then
Call oAPI.LogScriptEvent(SCRIPT_NAME,EventNo,EVENT_LEVEL_INFO,Message)
End If
End Sub
Sub ThrowScriptError(EventNo,Severity,Message,Abort)
Message = VbCrLf & Message
Call oAPI.LogScriptEvent(SCRIPT_NAME,EventNo,Severity,Message)
If Abort = True Then WScript.Quit
End Sub
Function GetQueueServer(Path)
GetQueueServer = Left(Path,InStr(Path,".")-1)
End Function
Function IsCluster()
Dim wshNetwork
Set wshNetwork = CreateObject("Wscript.Network")
if StrComp(wshNetwork.ComputerName, GetQueueServer(sComputer), 1) <> 0 then
IsCluster = True
else
IsCluster = False
End if