サーバー検出

Microsoft.MSMQ.6.3.DataSource.ServerDiscovery (DataSourceModuleType)

MSMQ サーバーの検出用データ ソース。

Element properties:

TypeDataSourceModuleType
IsolationAny
AccessibilityInternal
RunAsDefault
OutputTypeSystem.Discovery.Data

Member Modules:

ID Module Type TypeId RunAs 
DS DataSource Microsoft.Windows.TimedScript.DiscoveryProvider Default

Overrideable Parameters:

IDParameterTypeSelectorDisplay NameDescription
IntervalSecondsint$Config/IntervalSeconds$間隔 (秒)
LogDetailbool$Config/LogDetail$ログの詳細
TimeoutSecondsint$Config/TimeoutSeconds$タイムアウト (秒)

Source Code:

<DataSourceModuleType ID="Microsoft.MSMQ.6.3.DataSource.ServerDiscovery" Accessibility="Internal" Batching="false">
<Configuration>
<xsd:element xmlns:xsd="http://www.w3.org/2001/XMLSchema" minOccurs="1" name="IntervalSeconds" type="xsd:integer"/>
<xsd:element xmlns:xsd="http://www.w3.org/2001/XMLSchema" minOccurs="1" name="ComputerName" type="xsd:string"/>
<xsd:element xmlns:xsd="http://www.w3.org/2001/XMLSchema" minOccurs="1" name="IsVirtual" type="xsd:boolean"/>
<xsd:element xmlns:xsd="http://www.w3.org/2001/XMLSchema" minOccurs="1" name="LogDetail" type="xsd:boolean"/>
<xsd:element xmlns:xsd="http://www.w3.org/2001/XMLSchema" minOccurs="1" name="TimeoutSeconds" type="xsd:integer"/>
</Configuration>
<OverrideableParameters>
<OverrideableParameter ID="IntervalSeconds" Selector="$Config/IntervalSeconds$" ParameterType="int"/>
<OverrideableParameter ID="LogDetail" Selector="$Config/LogDetail$" ParameterType="bool"/>
<OverrideableParameter ID="TimeoutSeconds" Selector="$Config/TimeoutSeconds$" ParameterType="int"/>
</OverrideableParameters>
<ModuleImplementation Isolation="Any">
<Composite>
<MemberModules>
<DataSource ID="DS" TypeID="Windows!Microsoft.Windows.TimedScript.DiscoveryProvider">
<IntervalSeconds>$Config/IntervalSeconds$</IntervalSeconds>
<SyncTime/>
<ScriptName>DiscoverMSMQServer.vbs</ScriptName>
<Arguments>$MPElement$ $Target/Id$ $Config/ComputerName$ "$Config/IsVirtual$" "$Config/LogDetail$"</Arguments>
<ScriptBody><Script>option explicit
SetLocale("en-us")

Const SCRIPT_NAME = "DiscoverMSMQServer 6_2 86.vbs"

Const EVENT_LEVEL_ERROR = 1
Const EVENT_LEVEL_WARNING = 2
Const EVENT_LEVEL_INFO = 4

Const EVENTNO_SCRIPT_STARTED = 14101
Const EVENTNO_SCRIPT_ENDED = 14102
Const EVENTNO_SERVER_FOUND = 14110
Const EVENTNO_SERVER_FOUND_WRONGVERSION = 14111
Const EVENTNO_SERVER_SUBMITTED = 14112
Const EVENTNO_DISCDATA_SUBMITTED = 14113
Const EVENTNO_NOSERVER_FOUND = 14119
Const EVENTNO_ERROR_WMI = 14181
Const EVENTNO_EMPTY = 14182

Const HKEY_CURRENT_USER = &amp;H80000001
Const HKEY_LOCAL_MACHINE = &amp;H80000002

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 &lt; 4 Then Call ShowUsage()
SourceId = oArgs(0)
ManagedEntityId = oArgs(1)
sComputer = oArgs(2)
If Len(oArgs(3)) &gt; 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: " &amp; VbCrLf &amp; _
"Source ID: " &amp; SourceId &amp; VbCrLf &amp; _
"Managed Entity ID: " &amp; ManagedEntityId &amp; VbCrLf &amp; _
"Computer: " &amp; sComputer &amp; VbCrLf &amp; _
"Network: " &amp; wshNetwork.ComputerName &amp; VbCrLf &amp; _
"Discover bIsVirtual : " &amp; bIsVirtual &amp; VbCrLf &amp; _
"User credentials: " &amp; wshNetwork.UserDomain &amp; "\" &amp; wshNetwork.UserName

Call LogDetail(EVENTNO_SCRIPT_STARTED,sMessage)

Set oDiscoveryData = oAPI.CreateDiscoveryData(0, SourceId, ManagedEntityId)

On Error Resume Next
Set oWMI = GetObject("winmgmts:\\" &amp; sComputer &amp; "\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 &lt;&gt; 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 " &amp; sComputer &amp; " .")
sRegRoot = "SOFTWARE\Microsoft\MSMQ\Clustered QMs\" &amp; 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 " &amp; sComputer &amp; " 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 &gt; 0 Then
Call LogDetail(EVENTNO_SERVER_FOUND,"Server found on " &amp; sComputer &amp; " .")
Call CreateMSMQServerInstance(sComputer,sRegRoot,"MSMQ",False)
Call CreateServiceInstance("MSMQTriggers","MSMQTriggers")
Else
'Check if we have a dependent client
sSupportingServer = GetRegStringValue(sComputer,sRegRoot &amp; "\Parameters","RemoteQMMachine")
If Len(sSupportingServer) &gt; 0 Then
Call LogDetail(EVENTNO_SERVER_FOUND,"Dependent client found." &amp; VbCrLf &amp; "Supporting server: " &amp; 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 &amp; "\Parameters","CurrentBuild")

If Not Left(sVersion,3) = "6.3" Then
sMessage = "MSMQ found but not supported version." &amp; VbCrLf &amp; _
"Version found: " &amp; 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 &amp; "\Parameters","Workgroup",True))
Call oInstance.AddProperty("$MPElement[Name='Microsoft.MSMQ.6.3.Server']/DependentClients$", GetRegDWordValue(ComputerName,RegRoot &amp; "\Parameters\MachineCache","MQS_DepClients",True))
Call oInstance.AddProperty("$MPElement[Name='Microsoft.MSMQ.6.3.Server']/Routing$", GetRegDWordValue(ComputerName,RegRoot &amp; "\Parameters\MachineCache","MQS_Routing",True))

dMachineQuota = GetRegDWordValue(ComputerName,RegRoot &amp; "\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 &amp; "\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 &amp; "\Parameters","StorePersistentPath")
sMessageLoggerFolder = GetRegStringValue(ComputerName,RegRoot &amp; "\Parameters","StoreLogPath")
sTransactionLoggerFolder = GetRegStringValue(ComputerName,RegRoot &amp; "\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)

Call LogDetail(EVENTNO_SERVER_SUBMITTED,"Server instance submitted.")

End Sub


Function GetFQDN(ShortName)
Dim sDomain

If InStr(ShortName,".") &gt; 0 Then
GetFQDN = ShortName
Else
sDomain = Right(sComputer,Len(sComputer)-InStr(sComputer,"."))
GetFQDN = ShortName &amp; "." &amp; sDomain
End If

End Function


Function GetShortName(FQDN)

If InStr(FQDN,".") &gt; 0 Then
GetShortName = Left(FQDN,InStr(FQDN,".")-1)
Else
GetShortName = FQDN
End If

End Function


Function GetMSMQVersion(Computer,RegRoot)

sVersion = GetRegStringValue(Computer,sRegRoot &amp; "\Parameters","CurrentBuild")

End Function

Function IsMSMQClusterNode(Computer)
Dim WMI, Services, WMICluster, oResources

Set WMI = GetObject("winmgmts:\\" &amp; Computer &amp; "\root\cimv2")
Set Services = WMI.ExecQuery("select * from win32_service where name = 'ClusSvc'")
If Services.Count &gt; 0 Then
Set WMICluster = GetObject("winmgmts:\\" &amp; Computer &amp; "\root\mscluster")
Set oResources = WMICluster.ExecQuery("select * from mscluster_resource where type = 'MSMQ'")
If oResources.Count &gt; 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 = '" &amp; ServiceName &amp; "'")
If oServices.Count &gt; 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:\\" &amp; NetworkName &amp; "\root\mscluster")

Set cResources = oWMI.ExecQuery("Select * from mscluster_resource where PrivateProperties.Name = '" &amp; GetShortName(NetworkName) &amp; "'")
For Each oResource In cResources
sNameResource = oResource.Name
Next

Set cGroups = oWmi.ExecQuery("ASSOCIATORS OF {mscluster_Resource='" &amp; sNameResource &amp; "'} 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:\\" &amp; Computer &amp; "\root\mscluster")
Set cDependentResources = oWMICluster.ExecQuery("ASSOCIATORS OF {mscluster_Resource='" &amp; ResourceName &amp; "'} 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:\\" &amp; NetworkName &amp; "\root\mscluster")

Set cResources = oWmi.ExecQuery("ASSOCIATORS OF {mscluster_ResourceGroup='" &amp; sGroup &amp; "'} 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:\\" &amp; Computer &amp; "\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:\\" &amp; Computer &amp; "\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:\\" &amp; Computer &amp; "\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 &amp; "Calling MP Element ID: $MPElement$" &amp; vbcrlf &amp; 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 &amp; 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) &lt;&gt; 0 then
IsCluster = True
else
IsCluster = False
End if

End Function

Sub ShowUsage

WScript.Echo "Usage: "
WScript.Echo "cscript DiscoverMSMQServer.vbs &lt;CallingRuleGUID&gt; &lt;TargetEntityGUID&gt; &lt;Computer&gt; &lt;IsVirtual&gt; &lt;LogDetail&gt;"
WScript.Echo
WScript.Echo "Example:"
WScript.Echo "cscript DiscoverMSMQServer.vbs {b3e9befe-173b-78a2-3e41-e19ecb58d9d5} {2fa43439-afc4-cc64-9b3a-9642ec898c1c} srv1.contoso.com false false"

WScript.Quit

End Sub</Script></ScriptBody>
<TimeoutSeconds>$Config/TimeoutSeconds$</TimeoutSeconds>
</DataSource>
</MemberModules>
<Composition>
<Node ID="DS"/>
</Composition>
</Composite>
</ModuleImplementation>
<OutputType>System!System.Discovery.Data</OutputType>
</DataSourceModuleType>