BizTalk Application Discovery Module

Microsoft.BizTalk.Server.2013R2.ApplicationDiscovery (DataSourceModuleType)

Discovers all applications in a BizTalk group, all hosts in the group, and the relationship between group, applications, and hosts.

Element properties:

TypeDataSourceModuleType
IsolationAny
AccessibilityPublic
RunAsMicrosoft.BizTalk.DiscoveryAccount
OutputTypeSystem.Discovery.Data

Member Modules:

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

Overrideable Parameters:

IDParameterTypeSelectorDisplay NameDescription
IntervalSecondsint$Config/IntervalSeconds$Interval SecondsThis is the interval (in seconds) at which the script associated with the module is run.
TimeoutSecondsint$Config/TimeoutSeconds$Timeout SecondsThis is the timeout (in seconds) after which execution of the script associated with the module is terminated if not yet completed.

Source Code:

<DataSourceModuleType ID="Microsoft.BizTalk.Server.2013R2.ApplicationDiscovery" Accessibility="Public" RunAs="Microsoft.BizTalk.DiscoveryAccount" Batching="false">
<Configuration>
<xsd:element name="IntervalSeconds" type="xsd:integer"/>
<xsd:element name="TimeoutSeconds" type="xsd:integer"/>
</Configuration>
<OverrideableParameters>
<OverrideableParameter ID="IntervalSeconds" Selector="$Config/IntervalSeconds$" ParameterType="int"/>
<OverrideableParameter ID="TimeoutSeconds" Selector="$Config/TimeoutSeconds$" ParameterType="int"/>
</OverrideableParameters>
<ModuleImplementation Isolation="Any">
<Composite>
<MemberModules>
<DataSource ID="DataSource" TypeID="Windows!Microsoft.Windows.TimedScript.DiscoveryProvider">
<IntervalSeconds>$Config/IntervalSeconds$</IntervalSeconds>
<SyncTime/>
<ScriptName>Microsoft.BizTalk.Server.2013R2.ApplicationDiscovery.vbs</ScriptName>
<Arguments>$MPElement$ $Target/Id$ $Target/Host/Property[Type="Windows!Microsoft.Windows.Computer"]/PrincipalName$ $Target/Property[Type="Microsoft.BizTalk.Server.2013R2.BizTalkGroup"]/MgmtDbServerName$ $Target/Property[Type='Microsoft.BizTalk.Server.2013R2.BizTalkGroup']/MgmtDbName$</Arguments>
<ScriptBody><Script>
'Copyright (c) Microsoft Corporation. All rights reserved

'This script discovers the following:
'1. All applcations in a group and 'group hosts application' relations
'2. All hosts in a group and 'group hosts host' relations

Option Explicit

Const APP_DISCOVERY_CONNECT_FAILURE = -1
Const APP_DISCOVERY_QUERY_FAILURE = -2

Dim oArgs
Set oArgs = WScript.Arguments
if oArgs.Count &lt; 5 Then
Wscript.Quit -1
End If

Dim SourceID, ManagedEntityId, TargetComputer, DataBaseServer, DataBaseName
Dim GroupWbemObjSet, objGroupProperties, objGroupPropertiesSCOM, strGroupQuery
Dim HostWbemObjSet, objHostProperties, objHostPropertiesSCOM, strHostQuery
Dim strBizTalkGroupName, strWMIBaseClass

'Read input parameters
SourceId = oArgs(0)
ManagedEntityId = oArgs(1)
TargetComputer = oArgs(2)
DataBaseServer = oArgs(3)
DataBaseName = oArgs(4)

'Constant definitions
strBizTalkGroupName = "$Target/Property[Type='Microsoft.BizTalk.Server.2013R2.BizTalkGroup']/Name$"
strWMIBaseClass = "MicrosoftBizTalkServer"
strGroupQuery = "select * from MSBTS_GroupSetting where Name='" &amp; Replace(strBizTalkGroupName, "\", "\\") &amp; "'"
strHostQuery = "select * from MSBTS_HostSetting"

Call GetBizTalkApplications()

Sub GetBizTalkApplications()
Dim defaultConnStr
Dim objAPI, objDiscoveryData

defaultConnStr = "Server=" &amp; DataBaseServer &amp; ";Database=" &amp; DataBaseName &amp; ";Trusted_Connection=yes"
Set objAPI = CreateObject("MOM.ScriptAPI")
Set objDiscoveryData = objAPI.CreateDiscoveryData(0, SourceId, ManagedEntityId)

CreateObjectsAndRelations defaultConnStr, objAPI, objDiscoveryData
Call objAPI.Return(objDiscoveryData)
End Sub

Function CreateObjectsAndRelations(defaultConnStr, byRef objAPI, byRef objDiscoveryData)
Dim ObjError
Set ObjError = New Error

Dim cnADOConnection
Set cnADOConnection = MomCreateObject("ADODB.Connection")
cnADOConnection.Provider = "sqloledb"
cnADOConnection.ConnectionTimeout = 15

ObjError.Clear
On Error Resume Next
cnADOConnection.Open defaultConnStr
ObjError.Save
On Error Goto 0
If 0 &lt;&gt; Err.number then
'Error event to goin here
CreateObjectsAndRelations = APP_DISCOVERY_CONNECT_FAILURE
Exit Function
End If

Dim objResults

ObjError.Clear
On Error Resume Next
Set objResults = cnADOConnection.Execute("select nID, nvcName, isDefault, isSystem from bts_application with (NoLock)")
ObjError.Save
On Error Goto 0

If ObjError.Number &lt;&gt; 0 Then
' Error event to go in here
CreateObjectsAndRelations = APP_DISCOVERY_QUERY_FAILURE
If (objResults &lt;&gt; null) Then objResults.Close
Exit Function
End If

Set GroupWbemObjSet = GetWMICollection(TargetComputer, strWMIBaseClass, strGroupQuery)
Set HostWbemObjSet = GetWMICollection(TargetComputer, strWMIBaseClass, strHostQuery)

objGroupProperties = Array()
ReDim objGroupProperties(2)
objGroupProperties(0) = "MgmtDbName"
objGroupProperties(1) = "MgmtDbServerName"
objGroupProperties(2) = "Name"

objGroupPropertiesSCOM = Array()
ReDim objGroupPropertiesSCOM(2)
objGroupPropertiesSCOM(0) = "$MPElement[Name='Microsoft.BizTalk.Server.2013R2.BizTalkGroup']/MgmtDbName$"
objGroupPropertiesSCOM(1) = "$MPElement[Name='Microsoft.BizTalk.Server.2013R2.BizTalkGroup']/MgmtDbServerName$"
objGroupPropertiesSCOM(2) = "$MPElement[Name='Microsoft.BizTalk.Server.2013R2.BizTalkGroup']/Name$"

objHostProperties = Array()
ReDim objHostProperties(4)
objHostProperties(0) = "Name"
objHostProperties(1) = "HostType"
objHostProperties(2) = "NTGroupName"
objHostProperties(3) = "IsDefault"
objHostProperties(4) = "IsHost32BitOnly"

objHostPropertiesSCOM = Array()
ReDim objHostPropertiesSCOM(4)
objHostPropertiesSCOM(0) = "$MPElement[Name='Microsoft.BizTalk.Server.2013R2.BizTalkHost']/Name$"
objHostPropertiesSCOM(1) = "$MPElement[Name='Microsoft.BizTalk.Server.2013R2.BizTalkHost']/Type$"
objHostPropertiesSCOM(2) = "$MPElement[Name='Microsoft.BizTalk.Server.2013R2.BizTalkHost']/NTGroupName$"
objHostPropertiesSCOM(3) = "$MPElement[Name='Microsoft.BizTalk.Server.2013R2.BizTalkHost']/IsDefault$"
objHostPropertiesSCOM(4) = "$MPElement[Name='Microsoft.BizTalk.Server.2013R2.BizTalkHost']/Is32Bit$"

Dim index, GroupPropsCount, HostPropsCount
GroupPropsCount = ubound(objGroupProperties) + 1
HostPropsCount = ubound(objHostProperties) + 1

Dim WbemGroupObject, WbemHostObject
Dim objGroupInst, objGroupProp
Dim objHostInst, objHostProp
Dim strEval
Dim objApplicationInst

For Each WbemGroupObject In GroupWbemObjSet
'Create group object
Set objGroupInst = objDiscoveryData.CreateClassInstance("$MPElement[Name='Microsoft.BizTalk.Server.2013R2.BizTalkGroup']$")
For index = 0 to GroupPropsCount-1
objGroupProp = objGroupProperties(index)
strEval = Eval(IsObject(WbemGroupObject.Properties_(objGroupProp)))
If (strEval &lt;&gt; "False") Then
call objGroupInst.AddProperty(objGroupPropertiesSCOM(index), WbemGroupObject.Properties_(objGroupProp).value)
End If
Next
call objGroupInst.AddProperty("$MPElement[Name='Windows!Microsoft.Windows.Computer']/PrincipalName$", TargetComputer)

'Create all host objects as well as relationship with group
For Each WbemHostObject in HostWbemObjSet
Set objHostInst = objDiscoveryData.CreateClassInstance("$MPElement[Name='Microsoft.BizTalk.Server.2013R2.BizTalkHost']$")
For index = 0 to HostPropsCount-1
objHostProp = objHostProperties(index)
strEval = Eval(IsObject(WbemHostObject.Properties_(objHostProp)))
If (strEval &lt;&gt; "False") Then
Call objHostInst.AddProperty(objHostPropertiesSCOM(index), WbemHostObject.Properties_(objHostProp).value)
End If
Next
Call objHostInst.AddProperty("$MPElement[Name='Microsoft.BizTalk.Server.2013R2.BizTalkGroup']/MgmtDbName$", DataBaseName)
Call objHostInst.AddProperty("$MPElement[Name='Microsoft.BizTalk.Server.2013R2.BizTalkGroup']/MgmtDbServerName$", DataBaseServer)
Call objHostInst.AddProperty("$MPElement[Name='Windows!Microsoft.Windows.Computer']/PrincipalName$", TargetComputer)
Call objDiscoveryData.AddInstance(objHostInst)

CreateRelationShip objDiscoveryData, objGroupInst, objHostInst, "$MPElement[Name='Microsoft.BizTalk.Server.2013R2.BizTalkGroupHostsHosts']$"
Next

'Create all application objects as well as relationship with group
Do While Not objResults.EOF
If CStr(objResults(3)) = CStr(False) Then
Set objApplicationInst = objDiscoveryData.CreateClassInstance("$MPElement[Name='Microsoft.BizTalk.Server.2013R2.BizTalkApplication']$")
Call objApplicationInst.AddProperty("$MPElement[Name='Microsoft.BizTalk.Server.2013R2.BizTalkGroup']/MgmtDbName$", DataBaseName)
Call objApplicationInst.AddProperty("$MPElement[Name='Microsoft.BizTalk.Server.2013R2.BizTalkGroup']/MgmtDbServerName$", DataBaseServer)
Call objApplicationInst.AddProperty("$MPElement[Name='Windows!Microsoft.Windows.Computer']/PrincipalName$", TargetComputer)
Call objApplicationInst.AddProperty("$MPElement[Name='Microsoft.BizTalk.Server.2013R2.BizTalkApplication']/Name$", CStr(objResults(1)))
Call objApplicationInst.AddProperty("$MPElement[Name='Microsoft.BizTalk.Server.2013R2.BizTalkApplication']/ID$", CStr(objResults(0)))
Call objApplicationInst.AddProperty("$MPElement[Name='Microsoft.BizTalk.Server.2013R2.BizTalkApplication']/IsDefault$", objResults(2))
Call objDiscoveryData.AddInstance(objApplicationInst)

CreateRelationShip objDiscoveryData, objGroupInst, objApplicationInst, "$MPElement[Name='Microsoft.BizTalk.Server.2013R2.BizTalkGroupHostsApplications']$"
End If
objResults.MoveNext
Loop
Next

cnADOConnection.Close
End Function

Function GetWMICollection(TargetComputer, strWMIBaseClass, strQuery)
Dim WbemSrv, WbemObjectSet
Set WbemSrv = Getobject("winmgmts:{impersonationLevel=impersonate}!\\" &amp; TargetComputer &amp; "\root\" &amp; strWMIBaseClass)
Set WbemObjectSet = WbemSrv.ExecQuery(strQuery)
Set GetWMICollection = WbemObjectSet
End Function

Function CreateRelationShip(byRef objDiscoveryData, SourceObject, TargetObject, strRelationShipClassId)
Dim objRelation
Set objRelation = objDiscoveryData.CreateRelationshipInstance(strRelationShipClassId)
objRelation.Source = SourceObject
objRelation.Target = TargetObject
objDiscoveryData.AddInstance objRelation
End Function

Function MomCreateObject(ByVal sProgramId)
Dim ObjError
Set ObjError = New Error

On Error Resume Next
Set MomCreateObject = CreateObject(sProgramId)
ObjError.Save
On Error Goto 0

If ObjError.Number &lt;&gt; 0 Then WScript.Quit
End Function

Class Error
Private m_lNumber
Private m_sSource
Private m_sDescription
Private m_sHelpContext
Private m_sHelpFile
Public Sub Save()
m_lNumber = Err.number
m_sSource = Err.Source
m_sDescription = Err.Description
m_sHelpContext = Err.HelpContext
m_sHelpFile = Err.helpfile
End Sub
Public Sub Raise()
Err.Raise m_lNumber, m_sSource, m_sDescription, m_sHelpFile, m_sHelpContext
End Sub
Public Sub Clear()
m_lNumber = 0
m_sSource = ""
m_sDescription = ""
m_sHelpContext = ""
m_sHelpFile = ""
End Sub
Public Default Property Get Number()
Number = m_lNumber
End Property
Public Property Get Source()
Source = m_sSource
End Property
Public Property Get Description()
Description = m_sDescription
End Property
Public Property Get HelpContext()
HelpContext = m_sHelpContext
End Property
Public Property Get HelpFile()
HelpFile = m_sHelpFile
End Property
End Class
</Script></ScriptBody>
<TimeoutSeconds>$Config/TimeoutSeconds$</TimeoutSeconds>
</DataSource>
</MemberModules>
<Composition>
<Node ID="DataSource"/>
</Composition>
</Composite>
</ModuleImplementation>
<OutputType>System!System.Discovery.Data</OutputType>
</DataSourceModuleType>