BizTalk Application Artifacts Discovery Module

Microsoft.BizTalk.Server.2016.ArtifactsDiscovery (DataSourceModuleType)

Discovers all application artifacts based on type (send port, receive port, and orchestration). During discovery of send ports, send port groups and associated relationships are also discovered. Likewise, during discovery of receive ports, receive locations and associated relationships are discovered.

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.
RowStartint$Config/RowStart$
RowEndint$Config/RowEnd$

Source Code:

<DataSourceModuleType ID="Microsoft.BizTalk.Server.2016.ArtifactsDiscovery" Accessibility="Public" RunAs="Microsoft.BizTalk.DiscoveryAccount" Batching="false">
<Configuration>
<xsd:element name="IntervalSeconds" type="xsd:integer"/>
<xsd:element name="Option" type="xsd:integer"/>
<xsd:element name="TimeoutSeconds" type="xsd:integer"/>
<xsd:element minOccurs="0" name="RowStart" type="xsd:integer"/>
<xsd:element minOccurs="0" name="RowEnd" type="xsd:integer"/>
</Configuration>
<OverrideableParameters>
<OverrideableParameter ID="IntervalSeconds" Selector="$Config/IntervalSeconds$" ParameterType="int"/>
<OverrideableParameter ID="TimeoutSeconds" Selector="$Config/TimeoutSeconds$" ParameterType="int"/>
<OverrideableParameter ID="RowStart" Selector="$Config/RowStart$" ParameterType="int"/>
<OverrideableParameter ID="RowEnd" Selector="$Config/RowEnd$" 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.2016.ArtifactsDiscovery.vbs</ScriptName>
<Arguments>$MPElement$ $Target/Id$ $Target/Host/Host/Property[Type="Windows!Microsoft.Windows.Computer"]/PrincipalName$ $Target/Host/Property[Type="Microsoft.BizTalk.Server.2016.BizTalkGroup"]/MgmtDbServerName$ $Target/Host/Property[Type="Microsoft.BizTalk.Server.2016.BizTalkGroup"]/MgmtDbName$ "$Target/Property[Type='Microsoft.BizTalk.Server.2016.BizTalkApplication']/Name$" $Target/Property[Type='Microsoft.BizTalk.Server.2016.BizTalkApplication']/ID$ $Config/Option$ $Config/RowStart$ $Config/RowEnd$</Arguments>
<ScriptBody><Script>
'Copyright (c) Microsoft Corporation. All rights reserved.

'This script discovers application artifacts based on $Config/Option$ parameter.
'Option 1 - All send ports, send port groups in an application, their hosting
' relations to application and 'send port group contains send port' relations.
'Option 2 - All orchestrations in an application, their hosting relations to application.
'Option 3 - All receive ports, receive locations in an application, their hosting relation
' to application and 'receive port contains receive location' relations.
'
' Control number of send ports captured using RowStart and RowEnd params

Option Explicit

Const ARTIFACT_DISCOVERY_CONNECT_FAILURE = -1
Const ARTIFACT_DISCOVERY_QUERY_FAILURE = -2

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

Dim SourceID, ManagedEntityId, TargetComputer, DataBaseServer, DataBaseName, ApplicationName, ApplicationID, OptionID, RowStart, RowEnd, OptPaging
Dim RelationshipAppHostsAppArtifactClassId, RelationshipAppArtifactRunsOnHostClassId

'Input parameters
SourceId = oArgs(0)
ManagedEntityId = oArgs(1)
TargetComputer = oArgs(2)
DataBaseServer = oArgs(3)
DataBaseName = oArgs(4)
ApplicationName = oArgs(5)
ApplicationID = oArgs(6)
OptionID = oArgs(7)

If OptionID = "1" then
RowStart = oArgs(8)
RowEnd = oArgs(9)

If RowStart = "0" And RowEnd = "0" Then
OptPaging = "0"
Else
OptPaging = "1"
End If
End If

'Constant definitions
RelationshipAppHostsAppArtifactClassId = "$MPElement[Name='Microsoft.BizTalk.Server.2016.ApplicationHostsApplicationArtifact']$"
RelationshipAppArtifactRunsOnHostClassId = "$MPElement[Name='Microsoft.BizTalk.Server.2016.ApplicationArtifactRunsOnHost']$"

Call GetBizTalkArtifacts()

Sub GetBizTalkArtifacts()
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)

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

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

Dim cnADOConnection
Set cnADOConnection = MomCreateObject("ADODB.Connection")
cnADOConnection.Provider = "SQLNCLI11"
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
CreateArtifactsAndRelations = ARTIFACT_DISCOVERY_CONNECT_FAILURE
Exit Function
End If

Dim oApplication
Set oApplication = objDiscoveryData.CreateClassInstance("$MPElement[Name='Microsoft.BizTalk.Server.2016.BizTalkApplication']$")
Call oApplication.AddProperty("$MPElement[Name='Microsoft.BizTalk.Server.2016.BizTalkApplication']/Name$", ApplicationName)
Call oApplication.AddProperty("$MPElement[Name='Microsoft.BizTalk.Server.2016.BizTalkGroup']/MgmtDbName$", DataBaseName)
Call oApplication.AddProperty("$MPElement[Name='Microsoft.BizTalk.Server.2016.BizTalkGroup']/MgmtDbServerName$", DataBaseServer)
Call oApplication.AddProperty("$MPElement[Name='Windows!Microsoft.Windows.Computer']/PrincipalName$", TargetComputer)

Dim strSQLQuery
Dim objResults1, objResults2, objResults3
Dim oHost

Select Case OptionID
Case "1"
'Send port
ObjError.Clear
On Error Resume Next
If OptPaging = "0" Then
strSQLQuery = "select " &amp; _
"sp.nvcName, sp.nID, sp.bDynamic, sp.bTwoWay, " &amp; _
"sp.nvcFilter, sp.nPriority, sp.nTracking, " &amp; _
"pl1.Name, pl2.Name, spt.PrimaryTransport, spt.SecondaryTransport " &amp; _
"from bts_sendport sp with (NoLock) " &amp; _
"left join bts_pipeline pl1 with (NoLock) on sp.nSendPipelineID = pl1.Id " &amp; _
"left join bts_pipeline pl2 with (NoLock) on sp.nReceivePipelineID = pl2.Id " &amp; _
"left join (select nSendPortID, " &amp; _
"MAX(case when bIsPrimary = 1 then nvcAddress end) as PrimaryTransport, " &amp; _
"MAX(case when bIsPrimary = 0 then nvcAddress end) as SecondaryTransport " &amp; _
"from bts_sendport_transport with (NoLock) group by nSendPortID) spt on sp.nID = spt.nSendPortID " &amp; _
"where sp.nApplicationID = " &amp; ApplicationID
Else
strSQLQuery = "WITH OrderedSP1 AS ( select " &amp; _
"sp.nvcName, sp.nID, sp.bDynamic, sp.bTwoWay, " &amp; _
"sp.nvcFilter, sp.nPriority, sp.nTracking, " &amp; _
"pl1.Name as pl1Name, pl2.Name as pl2Name, spt.PrimaryTransport, spt.SecondaryTransport, " &amp; _
"row_number() over (order by sp.nID) as RowNumber " &amp; _
"from bts_sendport sp with (NoLock) " &amp; _
"left join bts_pipeline pl1 with (NoLock) on sp.nSendPipelineID = pl1.Id " &amp; _
"left join bts_pipeline pl2 with (NoLock) on sp.nReceivePipelineID = pl2.Id " &amp; _
"left join (select nSendPortID, " &amp; _
"MAX(case when bIsPrimary = 1 then nvcAddress end) as PrimaryTransport, " &amp; _
"MAX(case when bIsPrimary = 0 then nvcAddress end) as SecondaryTransport " &amp; _
"from bts_sendport_transport with (NoLock) group by nSendPortID) spt on sp.nID = spt.nSendPortID " &amp; _
"where sp.nApplicationID = " &amp; ApplicationID &amp; " )" &amp; _
"select nvcName, nID, bDynamic, bTwoWay, " &amp; _
"nvcFilter, nPriority, nTracking, " &amp; _
"pl1Name, pl2Name, PrimaryTransport, SecondaryTransport, RowNumber " &amp; _
"from OrderedSP1 " &amp; _
"where RowNumber between " &amp; RowStart &amp; " and " &amp; RowEnd
End If

Set objResults1 = cnADOConnection.Execute(strSQLQuery)
ObjError.Save
On Error Goto 0

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

ObjError.Clear
On Error Resume Next

If OptPaging = "0" Then
strSQLQuery = "select " &amp; _
"spg.nvcName, spg.nvcFilter, spt.nSendPortID " &amp; _
"from bts_sendportgroup spg with (NoLock) " &amp; _
"left join bts_spg_sendport spt with (NoLock) on spt.nSendPortGroupID = spg.nID " &amp; _
"where spg.nApplicationID = " &amp; ApplicationID
Else
strSQLQuery = "WITH OrderedSP2 AS ( select " &amp; _
"spg.nvcName, spg.nvcFilter, spt.nSendPortID, " &amp; _
"row_number() over (order by spt.nSendPortID) as RowNumber " &amp; _
"from bts_sendportgroup spg with (NoLock) " &amp; _
"left join bts_spg_sendport spt with (NoLock) on spt.nSendPortGroupID = spg.nID " &amp; _
"where spg.nApplicationID = " &amp; ApplicationID &amp; " )" &amp; _
"select nvcName, nvcFilter, nSendPortID, RowNumber " &amp; _
"from OrderedSP2 " &amp; _
"where RowNumber between " &amp; RowStart &amp; " and " &amp; RowEnd
End If

Set objResults2 = cnADOConnection.Execute(strSQLQuery)
ObjError.Save
On Error Goto 0

If ObjError.Number &lt;&gt; 0 Then
' Error event to go in here
CreateArtifactsAndRelations = ARTIFACT_DISCOVERY_QUERY_FAILURE
If (objResults1 &lt;&gt; null) Then objResults1.Close
If (objResults2 &lt;&gt; null) Then objResults2.Close
Exit Function
End If

ObjError.Clear
On Error Resume Next

If OptPaging = "0" Then
strSQLQuery = "select " &amp; _
"sp.nID, hs.Name " &amp; _
"from bts_sendport sp with (NoLock) " &amp; _
"inner join bts_sendport_transport spt with (NoLock) on sp.nID = spt.nSendPortID " &amp; _
"inner join adm_SendHandler sh with (NoLock) on spt.nSendHandlerID = sh.Id " &amp; _
"inner join adm_Host hs with (NoLock) on sh.HostId = hs.Id " &amp; _
"where sp.nApplicationID = " &amp; ApplicationID
Else
strSQLQuery = "WITH OrderedSP3 AS ( select " &amp; _
"sp.nID, hs.Name, " &amp; _
"row_number() over (order by sp.nID) as RowNumber " &amp; _
"from bts_sendport sp with (NoLock) " &amp; _
"inner join bts_sendport_transport spt with (NoLock) on sp.nID = spt.nSendPortID " &amp; _
"inner join adm_SendHandler sh with (NoLock) on spt.nSendHandlerID = sh.Id " &amp; _
"inner join adm_Host hs with (NoLock) on sh.HostId = hs.Id " &amp; _
"where sp.nApplicationID = " &amp; ApplicationID &amp; " )" &amp; _
"select nID, Name, RowNumber " &amp; _
"from OrderedSP3 " &amp; _
"where RowNumber between " &amp; RowStart &amp; " and " &amp; RowEnd
End If

Set objResults3 = cnADOConnection.Execute(strSQLQuery)
ObjError.Save
On Error Goto 0

If ObjError.Number &lt;&gt; 0 Then
' Error event to go in here
CreateArtifactsAndRelations = ARTIFACT_DISCOVERY_QUERY_FAILURE
If (objResults1 &lt;&gt; null) Then objResults1.Close
If (objResults2 &lt;&gt; null) Then objResults2.Close
If (objResults3 &lt;&gt; null) Then objResults3.Close
Exit Function
End If

Dim SPDictionary
Set SPDictionary = CreateObject("Scripting.Dictionary")

Dim oSendPort, oSendPortGroup
Dim SPTracking
Do While Not objResults1.EOF
Set oSendPort = objDiscoveryData.CreateClassInstance("$MPElement[Name='Microsoft.BizTalk.Server.2016.SendPort']$")
Call oSendPort.AddProperty("$MPElement[Name='Microsoft.BizTalk.Server.2016.BizTalkApplication']/Name$", ApplicationName)
Call oSendPort.AddProperty("$MPElement[Name='Microsoft.BizTalk.Server.2016.BizTalkGroup']/MgmtDbName$", DataBaseName)
Call oSendPort.AddProperty("$MPElement[Name='Microsoft.BizTalk.Server.2016.BizTalkGroup']/MgmtDbServerName$", DataBaseServer)
Call oSendPort.AddProperty("$MPElement[Name='Windows!Microsoft.Windows.Computer']/PrincipalName$", TargetComputer)
Call oSendPort.AddProperty("$MPElement[Name='Microsoft.BizTalk.Server.2016.ApplicationArtifact']/Name$", CStr(objResults1(0)))
Call oSendPort.AddProperty("$MPElement[Name='Microsoft.BizTalk.Server.2016.SendPort']/IsDynamic$", objResults1(2))
Call oSendPort.AddProperty("$MPElement[Name='Microsoft.BizTalk.Server.2016.SendPort']/IsTwoWay$", objResults1(3))
Call oSendPort.AddProperty("$MPElement[Name='Microsoft.BizTalk.Server.2016.SendPort']/Filter$", CStr(objResults1(4)))
Call oSendPort.AddProperty("$MPElement[Name='Microsoft.BizTalk.Server.2016.SendPort']/Priority$", CStr(objResults1(5)))
if (CInt(objResults1(6)) &gt; 0) then
SPTracking = True
else
SPTracking = False
end if
Call oSendPort.AddProperty("$MPElement[Name='Microsoft.BizTalk.Server.2016.SendPort']/Tracking$", SPTracking)
If Not(IsNull(objResults1(7))) Then
Call oSendPort.AddProperty("$MPElement[Name='Microsoft.BizTalk.Server.2016.SendPort']/SendPipeline$", CStr(objResults1(7)))
End If
If Not(IsNull(objResults1(8))) Then
Call oSendPort.AddProperty("$MPElement[Name='Microsoft.BizTalk.Server.2016.SendPort']/ReceivePipeline$", CStr(objResults1(8)))
End If
If Not(IsNull(objResults1(9))) Then
Call oSendPort.AddProperty("$MPElement[Name='Microsoft.BizTalk.Server.2016.SendPort']/PrimaryTransportURL$", CStr(objResults1(9)))
End If
If Not(IsNull(objResults1(10))) Then
Call oSendPort.AddProperty("$MPElement[Name='Microsoft.BizTalk.Server.2016.SendPort']/SecondaryTransportURL$", CStr(objResults1(10)))
End If
Call objDiscoveryData.AddInstance(oSendPort)
If Not (SPDictionary.Exists(CStr(objResults1(1)))) Then
SPDictionary.Add CStr(objResults1(1)), oSendPort
End If

CreateRelationShip objDiscoveryData, oApplication, oSendPort, RelationshipAppHostsAppArtifactClassId

objResults1.MoveNext
Loop

Do While Not objResults2.EOF
Set oSendPortGroup = objDiscoveryData.CreateClassInstance("$MPElement[Name='Microsoft.BizTalk.Server.2016.SendPortGroup']$")
Call oSendPortGroup.AddProperty("$MPElement[Name='Microsoft.BizTalk.Server.2016.BizTalkApplication']/Name$", ApplicationName)
Call oSendPortGroup.AddProperty("$MPElement[Name='Microsoft.BizTalk.Server.2016.BizTalkGroup']/MgmtDbName$", DataBaseName)
Call oSendPortGroup.AddProperty("$MPElement[Name='Microsoft.BizTalk.Server.2016.BizTalkGroup']/MgmtDbServerName$", DataBaseServer)
Call oSendPortGroup.AddProperty("$MPElement[Name='Windows!Microsoft.Windows.Computer']/PrincipalName$", TargetComputer)
Call oSendPortGroup.AddProperty("$MPElement[Name='Microsoft.BizTalk.Server.2016.ApplicationArtifact']/Name$", CStr(objResults2(0)))
Call oSendPortGroup.AddProperty("$MPElement[Name='Microsoft.BizTalk.Server.2016.SendPortGroup']/Filter$", CStr(objResults2(1)))
Call objDiscoveryData.AddInstance(oSendPortGroup)

CreateRelationShip objDiscoveryData, oApplication, oSendPortGroup, RelationshipAppHostsAppArtifactClassId
If Not(IsNull(objResults2(2))) Then
If SPDictionary.Exists(CStr(objResults2(2))) Then
CreateRelationShip objDiscoveryData, oSendPortGroup, SPDictionary.Item(CStr(objResults2(2))), "$MPElement[Name='Microsoft.BizTalk.Server.2016.SendPortGroupContainsSendPorts']$"
End If
End If
objResults2.MoveNext
Loop

Do While Not objResults3.EOF
If Not(IsNull(objResults3(0))) Then
If SPDictionary.Exists(CStr(objResults3(0))) Then
If Not(IsNull(objResults3(1))) Then
Set oHost = objDiscoveryData.CreateClassInstance("$MPElement[Name='Microsoft.BizTalk.Server.2016.BizTalkHost']$")
Call oHost.AddProperty("$MPElement[Name='Microsoft.BizTalk.Server.2016.BizTalkGroup']/MgmtDbName$", DataBaseName)
Call oHost.AddProperty("$MPElement[Name='Microsoft.BizTalk.Server.2016.BizTalkGroup']/MgmtDbServerName$", DataBaseServer)
Call oHost.AddProperty("$MPElement[Name='Windows!Microsoft.Windows.Computer']/PrincipalName$", TargetComputer)
Call oHost.AddProperty("$MPElement[Name='Microsoft.BizTalk.Server.2016.BizTalkHost']/Name$", CStr(objResults3(1)))

CreateRelationShip objDiscoveryData, SPDictionary.Item(CStr(objResults3(0))), oHost, RelationshipAppArtifactRunsOnHostClassId
End If
End If
End If
objResults3.MoveNext
Loop
Case "2"
'Orchestration
ObjError.Clear
On Error Resume Next
strSQLQuery = "select " &amp; _
"orc.nvcFullName, asm.nvcName, asm.nvcVersion, " &amp; _
"asm.nvcCulture, asm.nvcPublicKeyToken, hs.Name " &amp; _
"from bts_orchestration orc with (NoLock) " &amp; _
"inner join bts_item itm with (NoLock) on orc.nItemID = itm.id " &amp; _
"inner join bts_assembly asm with (NoLock) on asm.nID = itm.AssemblyId " &amp; _
"left join adm_Host hs with (NoLock) on hs.Id = orc.nAdminHostID " &amp; _
"where asm.nApplicationID = " &amp; ApplicationID
Set objResults1 = cnADOConnection.Execute(strSQLQuery)
ObjError.Save
On Error Goto 0

If ObjError.Number &lt;&gt; 0 Then
CreateArtifactsAndRelations = ARTIFACT_DISCOVERY_QUERY_FAILURE
If (objResults1 &lt;&gt; null) Then objResults1.Close
Exit Function
End If

Dim oOrchestration
Dim UniqueName
Do While Not objResults1.EOF
Set oOrchestration = objDiscoveryData.CreateClassInstance("$MPElement[Name='Microsoft.BizTalk.Server.2016.Orchestration']$")
Call oOrchestration.AddProperty("$MPElement[Name='Microsoft.BizTalk.Server.2016.BizTalkApplication']/Name$", ApplicationName)
Call oOrchestration.AddProperty("$MPElement[Name='Microsoft.BizTalk.Server.2016.BizTalkGroup']/MgmtDbName$", DataBaseName)
Call oOrchestration.AddProperty("$MPElement[Name='Microsoft.BizTalk.Server.2016.BizTalkGroup']/MgmtDbServerName$", DataBaseServer)
Call oOrchestration.AddProperty("$MPElement[Name='Windows!Microsoft.Windows.Computer']/PrincipalName$", TargetComputer)
UniqueName = CStr(objResults1(0)) &amp; ", " &amp; CStr(objResults1(1)) &amp; ", " &amp; CStr(objResults1(2)) &amp; ", " &amp; CStr(objResults1(3)) &amp; ", " &amp; CStr(objResults1(4))
Call oOrchestration.AddProperty("$MPElement[Name='Microsoft.BizTalk.Server.2016.ApplicationArtifact']/Name$", UniqueName)
Call oOrchestration.AddProperty("$MPElement[Name='Microsoft.BizTalk.Server.2016.Orchestration']/AssemblyName$", CStr(objResults1(1)))
Call oOrchestration.AddProperty("$MPElement[Name='Microsoft.BizTalk.Server.2016.Orchestration']/AssemblyVersion$", CStr(objResults1(2)))
Call oOrchestration.AddProperty("$MPElement[Name='Microsoft.BizTalk.Server.2016.Orchestration']/AssemblyCulture$", CStr(objResults1(3)))
Call oOrchestration.AddProperty("$MPElement[Name='Microsoft.BizTalk.Server.2016.Orchestration']/AssemblyPublicKeyToken$", CStr(objResults1(4)))
Call oOrchestration.AddProperty("$MPElement[Name='Microsoft.BizTalk.Server.2016.Orchestration']/ShortName$", CStr(objResults1(0)))
Call objDiscoveryData.AddInstance(oOrchestration)

CreateRelationShip objDiscoveryData, oApplication, oOrchestration, RelationshipAppHostsAppArtifactClassId

If Not(IsNull(objResults1(5))) Then
Set oHost = objDiscoveryData.CreateClassInstance("$MPElement[Name='Microsoft.BizTalk.Server.2016.BizTalkHost']$")
Call oHost.AddProperty("$MPElement[Name='Microsoft.BizTalk.Server.2016.BizTalkGroup']/MgmtDbName$", DataBaseName)
Call oHost.AddProperty("$MPElement[Name='Microsoft.BizTalk.Server.2016.BizTalkGroup']/MgmtDbServerName$", DataBaseServer)
Call oHost.AddProperty("$MPElement[Name='Windows!Microsoft.Windows.Computer']/PrincipalName$", TargetComputer)
Call oHost.AddProperty("$MPElement[Name='Microsoft.BizTalk.Server.2016.BizTalkHost']/Name$", CStr(objResults1(5)))

CreateRelationShip objDiscoveryData, oOrchestration, oHost, RelationshipAppArtifactRunsOnHostClassId
End If
objResults1.MoveNext
Loop
Case "3"
'Receive port
ObjError.Clear
On Error Resume Next
strSQLQuery = "select " &amp; _
"rp.nvcName, rp.bTwoWay, rp.nTracking, " &amp; _
"rl.Name, rl.IsPrimary, rl.InboundTransportURL, " &amp; _
"rl.InboundAddressableURL, pl1.Name, pl2.Name, hs.Name " &amp; _
"from bts_receiveport rp with (NoLock) " &amp; _
"left join adm_ReceiveLocation rl with (NoLock) on rp.nID = rl.ReceivePortId " &amp; _
"left join bts_pipeline pl1 with (NoLock) on rl.ReceivePipelineId = pl1.Id " &amp; _
"left join bts_pipeline pl2 with (NoLock) on rl.SendPipelineId = pl2.Id " &amp; _
"left join adm_ReceiveHandler rh with (NoLock) on rl.ReceiveHandlerId = rh.Id " &amp; _
"left join adm_Host hs with (NoLock) on rh.HostId = hs.Id " &amp; _
"where rp.nApplicationID = " &amp; ApplicationID &amp; "order by rp.nvcName"
Set objResults1 = cnADOConnection.Execute(strSQLQuery)
ObjError.Save
On Error Goto 0

If ObjError.Number &lt;&gt; 0 Then
CreateArtifactsAndRelations = ARTIFACT_DISCOVERY_QUERY_FAILURE
If (objResults1 &lt;&gt; null) Then objResults1.Close
Exit Function
End If

Dim oReceivePort, oReceiveLocation
Dim RPName
RPName = ""
Dim RPTracking
Do While Not objResults1.EOF
if RPName &lt;&gt; CStr(objResults1(0)) then
Set oReceivePort = objDiscoveryData.CreateClassInstance("$MPElement[Name='Microsoft.BizTalk.Server.2016.ReceivePort']$")
Call oReceivePort.AddProperty("$MPElement[Name='Microsoft.BizTalk.Server.2016.BizTalkApplication']/Name$", ApplicationName)
Call oReceivePort.AddProperty("$MPElement[Name='Microsoft.BizTalk.Server.2016.BizTalkGroup']/MgmtDbName$", DataBaseName)
Call oReceivePort.AddProperty("$MPElement[Name='Microsoft.BizTalk.Server.2016.BizTalkGroup']/MgmtDbServerName$", DataBaseServer)
Call oReceivePort.AddProperty("$MPElement[Name='Windows!Microsoft.Windows.Computer']/PrincipalName$", TargetComputer)
Call oReceivePort.AddProperty("$MPElement[Name='Microsoft.BizTalk.Server.2016.ApplicationArtifact']/Name$", CStr(objResults1(0)))
Call oReceivePort.AddProperty("$MPElement[Name='Microsoft.BizTalk.Server.2016.ReceivePort']/IsTwoWay$", objResults1(1))
if (CInt(objResults1(2)) &gt; 0) then
RPTracking = True
else
RPTracking = False
end if
Call oReceivePort.AddProperty("$MPElement[Name='Microsoft.BizTalk.Server.2016.ReceivePort']/Tracking$", RPTracking)
Call objDiscoveryData.AddInstance(oReceivePort)
RPName = CStr(objResults1(0))
end if

If Not(IsNull(objResults1(3))) Then
Set oReceiveLocation = objDiscoveryData.CreateClassInstance("$MPElement[Name='Microsoft.BizTalk.Server.2016.ReceiveLocation']$")
Call oReceiveLocation.AddProperty("$MPElement[Name='Microsoft.BizTalk.Server.2016.BizTalkApplication']/Name$", ApplicationName)
Call oReceiveLocation.AddProperty("$MPElement[Name='Microsoft.BizTalk.Server.2016.BizTalkGroup']/MgmtDbName$", DataBaseName)
Call oReceiveLocation.AddProperty("$MPElement[Name='Microsoft.BizTalk.Server.2016.BizTalkGroup']/MgmtDbServerName$", DataBaseServer)
Call oReceiveLocation.AddProperty("$MPElement[Name='Windows!Microsoft.Windows.Computer']/PrincipalName$", TargetComputer)
Call oReceiveLocation.AddProperty("$MPElement[Name='Microsoft.BizTalk.Server.2016.ApplicationArtifact']/Name$", CStr(objResults1(3)))
Call oReceiveLocation.AddProperty("$MPElement[Name='Microsoft.BizTalk.Server.2016.ReceiveLocation']/IsPrimary$", CStr(objResults1(4)))
If Not(IsNull(objResults1(5))) Then
Call oReceiveLocation.AddProperty("$MPElement[Name='Microsoft.BizTalk.Server.2016.ReceiveLocation']/InboundTransportURL$", CStr(objResults1(5)))
End If
If Not(IsNull(objResults1(6))) Then
Call oReceiveLocation.AddProperty("$MPElement[Name='Microsoft.BizTalk.Server.2016.ReceiveLocation']/InboundAddressableURL$", CStr(objResults1(6)))
End If
If Not(IsNull(objResults1(7))) Then
Call oReceiveLocation.AddProperty("$MPElement[Name='Microsoft.BizTalk.Server.2016.ReceiveLocation']/ReceivePipeline$", CStr(objResults1(7)))
End If
If Not(IsNull(objResults1(8))) Then
Call oReceiveLocation.AddProperty("$MPElement[Name='Microsoft.BizTalk.Server.2016.ReceiveLocation']/SendPipeline$", CStr(objResults1(8)))
End If
Call objDiscoveryData.AddInstance(oReceiveLocation)

CreateRelationShip objDiscoveryData, oApplication, oReceivePort, RelationshipAppHostsAppArtifactClassId
CreateRelationShip objDiscoveryData, oReceivePort, oReceiveLocation, "$MPElement[Name='Microsoft.BizTalk.Server.2016.ReceivePortContainsReceiveLocations']$"

If Not(IsNull(objResults1(9))) Then
Set oHost = objDiscoveryData.CreateClassInstance("$MPElement[Name='Microsoft.BizTalk.Server.2016.BizTalkHost']$")
Call oHost.AddProperty("$MPElement[Name='Microsoft.BizTalk.Server.2016.BizTalkGroup']/MgmtDbName$", DataBaseName)
Call oHost.AddProperty("$MPElement[Name='Microsoft.BizTalk.Server.2016.BizTalkGroup']/MgmtDbServerName$", DataBaseServer)
Call oHost.AddProperty("$MPElement[Name='Windows!Microsoft.Windows.Computer']/PrincipalName$", TargetComputer)
Call oHost.AddProperty("$MPElement[Name='Microsoft.BizTalk.Server.2016.BizTalkHost']/Name$", CStr(objResults1(9)))

CreateRelationShip objDiscoveryData, oReceiveLocation, oHost, RelationshipAppArtifactRunsOnHostClassId
End If
End If

objResults1.MoveNext
Loop
End Select
cnADOConnection.Close
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

Sub CreateEvent(byRef objAPI, lEventID, lEventType, strMessage)
objAPI.LogScriptEvent "Test", lEventID, lEventType, strMessage
End Sub

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>