Discover TFS Application Tier properties

TeamFoundationServer2008.DiscoveryOfTFSApplicationTierPropertiesRule (Discovery)

Discover TFS Application Tier properties

Knowledge Base article:

Summary

This rule gathers the various properties of the Application Tier such as Data-Tier host name, SSRS, SSAS etc.,.

Element properties:

TargetTeamFoundationServer2008.TFSApplicationTier
EnabledTrue
Frequency900
RemotableFalse

Object Discovery Details:

Discovered Classes and their attribuets:
Discovered relationships and their attribuets:

Member Modules:

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

Source Code:

<Discovery ID="TeamFoundationServer2008.DiscoveryOfTFSApplicationTierPropertiesRule" Enabled="true" Target="TeamFoundationServer2008.TFSApplicationTier" ConfirmDelivery="false" Remotable="true" Priority="Normal">
<Category>Discovery</Category>
<DiscoveryTypes>
<DiscoveryClass TypeID="TeamFoundationServer2008.TFSApplicationTier">
<Property TypeID="TeamFoundationServer2008.TFSApplicationTier" PropertyID="DataTierHostName"/>
<Property TypeID="TeamFoundationServer2008.TFSApplicationTier" PropertyID="TFSATComputerName"/>
<Property TypeID="System!System.Entity" PropertyID="DisplayName"/>
<Property TypeID="TeamFoundationServer2008.TFSApplicationTier" PropertyID="BaseReportsUrl"/>
<Property TypeID="TeamFoundationServer2008.TFSApplicationTier" PropertyID="ReportsServiceUrl"/>
<Property TypeID="TeamFoundationServer2008.TFSApplicationTier" PropertyID="DataSourceServerUrl"/>
<Property TypeID="TeamFoundationServer2008.TFSApplicationTier" PropertyID="InstallLocation"/>
<Property TypeID="TeamFoundationServer2008.TFSApplicationTier" PropertyID="BISDB"/>
<Property TypeID="TeamFoundationServer2008.TFSApplicationTier" PropertyID="BISDWDB"/>
<Property TypeID="TeamFoundationServer2008.TFSApplicationTier" PropertyID="BISANALYSISDB"/>
<Property TypeID="TeamFoundationServer2008.TFSApplicationTier" PropertyID="WssAdminServiceUrl"/>
<Property TypeID="TeamFoundationServer2008.TFSApplicationTier" PropertyID="WssBaseServerUrl"/>
<Property TypeID="TeamFoundationServer2008.TFSApplicationTier" PropertyID="WssBaseSiteUrl"/>
</DiscoveryClass>
<DiscoveryClass TypeID="TeamFoundationServer2008.TFSReportingServices">
<Property TypeID="MicrosoftSQLServerLibrary!Microsoft.SQLServer.ReportingServices" PropertyID="ServiceName"/>
<Property TypeID="MicrosoftSQLServerLibrary!Microsoft.SQLServer.ServerRole" PropertyID="InstanceName"/>
<Property TypeID="System!System.Entity" PropertyID="DisplayName"/>
</DiscoveryClass>
<DiscoveryRelationship TypeID="TeamFoundationServer2008.TFSATtoTFSDBInstance"/>
<DiscoveryRelationship TypeID="TeamFoundationServer2008.ATContainsSSAS"/>
<DiscoveryRelationship TypeID="TeamFoundationServer2008.ATContainsSSRS"/>
</DiscoveryTypes>
<DataSource ID="DS" RunAs="TFSUserProfile" TypeID="Windows!Microsoft.Windows.TimedScript.DiscoveryProvider">
<IntervalSeconds>900</IntervalSeconds>
<SyncTime/>
<ScriptName>TFSProps.vbs</ScriptName>
<Arguments>$MPElement$ $Target/Id$ $Target/Host/Property[Type="Windows!Microsoft.Windows.Computer"]/PrincipalName$ $Target/Host/Property[Type="Windows!Microsoft.Windows.Computer"]/NetbiosComputerName$ $Target/Host/Property[Type="System!System.Entity"]/DisplayName$ $Target/Host/Property[Type="Windows!Microsoft.Windows.Computer"]/IPAddress$ $Target/Host/Property[Type="Windows!Microsoft.Windows.Computer"]/DomainDnsName$</Arguments>
<ScriptBody><Script>Option Explicit


Const ForReading = 1
const HKEY_LOCAL_MACHINE = &amp;H80000002
Dim strComputer, strKeyPath, strEntryName, strValue
Dim objReg, objWMIService
Dim oAPI, oDiscoveryData, oInstAT, oInstAT1, oInstDBInst, oRel
Dim SourceID, ManagedEntityId, TargetComputer, tfsATComputerName, displayName, dataTierHostName
Dim xmlDOC, bOK, myErr, myError, nodeAppSettings, dataSourceText, recordSet
Dim InstallLocation, IPADDRESS, vDNSDomainName

Dim WebServiceURL, WebMethodName, xmlDOC2, soapStr, requestHTTP, nodeList, nodeValue, oNode, serviceName, serviceUrl
Dim vReportService, vReportServiceUrl, vWssAdminService, vWssAdminServiceUrl,vBaseServer, vBaseServerUrl
Dim vBaseSite, vBaseSiteUrl, vDataSourceServer, vDataSourceServerUrl, vBaseSiteUnc, vBaseSiteUncUrl, vBaseReports, vBaseReportsUrl
Dim DatabaseName, SQLServerName
Dim vBisDBName, vBisDBSQLServerName, vBisDWDBName, vBisDWDBSQLServerName, vBisAnalysisDBName, vBisAnalysisDBSQLServerName, oDataBaseLine
Dim oDB, oSSAS, oSSRS, oRelnShip, oRelnShipSSAS, oRelnShipSSRS, sDatabaseNamaoRel, sDBHostNamaoRel , sFQDN

Call TraceLogMessage("Entered execution TFSProps.vbs")

Dim oArgs
Set oArgs = WScript.Arguments
If oArgs.Count &lt; 7 Then
'Call TraceLogMessage("Arguemnt count is less than 7 :: exiting ")
Wscript.Quit -1
End If



strComputer = "." 'set to local host

SourceId = oArgs(0)
ManagedEntityId = oArgs(1)
TargetComputer = oArgs(2)
tfsATComputerName = oArgs(3)
displayName = oArgs(4)
IPADDRESS = oArgs(5)
vDNSDomainName = oArgs(6)


'Call TraceLogMEssage("SourceID=["&amp;SourceID&amp;"]:ManagedEntityId["&amp;ManagedEntityId&amp;"]:TargetComputer["&amp;TargetComputer &amp;"]")
Set objReg=GetObject("winmgmts:{impersonationLevel=impersonate}!\\" &amp; strComputer &amp; "\root\default:StdRegProv")


Set oAPI = CreateObject("MOM.ScriptAPI")
set oDiscoveryData = oAPI.CreateDiscoveryData(0, SourceId, ManagedEntityId)


strKeyPath = "SOFTWARE\Microsoft\Windows\CurrentVersion\Installer\UserData\S-1-5-18\Products\B887DE53B6AD3733BBB26AC841E98AA1\InstallProperties"
strEntryName = "InstallLocation"

' Get the Registry Key
objReg.GetStringValue HKEY_LOCAL_MACHINE,strKeyPath,strEntryName,strValue

If Len(strValue) &gt; 0 Then

Set xmlDOC =CreateObject("MSXML.DOMDocument")
xmlDOC.setProperty "SelectionLanguage", "XPath"
XmlDOC.Async = false


bOK = xmlDOC.load(strValue &amp; "Web Services\Services\Web.config")

If xmlDOC.parseError.errorCode &lt;&gt; 0 Then
myErr = xmlDoc.parseError
dataTierHostName = "XML-DOM-LOAD-ERROR"
'Call TraceLogMessage("Failure on dom loading of Web.config")
Else
Set nodeAppSettings = xmlDOC.selectSingleNode("//appSettings/add/@value")
recordSet = split(nodeappSettings.text, ";")
dataSourceText = split(recordSet(3),"=")
dataTierHostName = dataSourceText(1)
set oInstAT1 = oDiscoveryData.CreateClassInstance("$MPElement[Name='TeamFoundationServer2008.TFSApplicationTier']$")
call oInstAT1.AddProperty("$MPElement[Name='TeamFoundationServer2008.TFSApplicationTier']/DataTierHostName$", dataTierHostName)
call oInstAT1.AddProperty("$MPElement[Name='TeamFoundationServer2008.TFSApplicationTier']/TFSATComputerName$", TargetComputer )
call oInstAT1.AddProperty("$MPElement[Name='Windows!Microsoft.Windows.Computer']/PrincipalName$", TargetComputer)
call oDiscoveryData.AddInstance(oInstAT1)

'Call TraceLogMessage("Succeeded on dom loading of Web.config: dataTierHostName :=&gt; [" &amp;dataTierHostName &amp;"]")

End If

'//////////////////////////
'############## BEGIN - Get Various App Tier properties [from the GetRegistrationEntries Web-Service Method] ######################"


'Call TraceLogMessage("Begin Web Service build up")
'========================================================================
' Set the "environment variables"
'========================================================================
' WebServiceURL = "http://localhost:8080/Services/v1.0/Registration.asmx"
WebServiceURL = GetTfsUrl() &amp; "/Services/v1.0/Registration.asmx"
Call TraceLogMessage("WebServiceURL=&gt;["&amp;WebServiceURL&amp;"]")

'========================================================================
' Now call the web methods
'========================================================================
WebMethodName = "GetRegistrationEntries"
'=========================================================================
' main logic of SOAPClient
'=========================================================================
'Get the Properties of the DOM right
Set xmlDOC2 = CreateObject("MSXML.DOMDocument")
xmlDOC2.SetProperty "SelectionLanguage", "XPath"
XmlDOC2.Async = false

'Call TraceLogMessage("Create SOAP Envelope")
' Create the soapEnvelope as a string body

soapStr = soapStr &amp; "&lt;?xml version=""1.0"" encoding=""utf-8""?&gt;" &amp; vbCrLf
soapStr = soapStr &amp; "&lt;soap:Envelope "
soapStr = soapStr &amp; " xmlns:xsi=""http://www.w3.org/2001/XMLSchema-instance"""
soapStr = soapStr &amp; " xmlns:xsd=""http://www.w3.org/2001/XMLSchema"""
soapStr = soapStr &amp; " xmlns:soap=""http://schemas.xmlsoap.org/soap/envelope/""&gt;"
soapStr = soapStr &amp; vbCrLf
soapStr = soapStr &amp; " &lt;soap:Body&gt;" &amp; vbCrLf
soapStr = soapStr &amp; " &lt;GetRegistrationEntries xmlns=""http://schemas.microsoft.com/TeamFoundation/2005/06/Services/Registration/03""&gt; "
soapStr = soapStr &amp; " &lt;toolId&gt;&lt;/toolId&gt; "
soapStr = soapStr &amp; " &lt;/GetRegistrationEntries&gt; "
soapStr = soapStr &amp; vbCrLf
soapStr = soapStr &amp; " &lt;/soap:Body&gt;" &amp; vbCrLf
soapStr = soapStr &amp; " &lt;/soap:Envelope&gt;" &amp; vbCrLf

'Call TraceLogMessage("Set the RequestHTTP object and properties")

Set requestHTTP = CreateObject("Microsoft.XMLHTTP")

''## requestHTTP.open "POST", WebServiceURL, false, "140285DOM\Administrator","PSSLab."
requestHTTP.open "POST", WebServiceURL, false
requestHTTP.setrequestheader "Content-Type", "text/xml"
requestHTTP.setrequestheader "SOAPAction", "http://schemas.microsoft.com/TeamFoundation/2005/06/Services/Registration/03/GetRegistrationEntries"
requestHTTP.Send soapStr

IF requestHTTP.status &lt;&gt; 200 THEN
'# Usually means the Registration Service call did not return. But we still have to return the DataTier host name we discovered. Hence
'Call TraceLogMessage("Registration :- GetRegistrationEntries method did not return 200 status code")
Call oAPI.Return(oDiscoveryData)
END IF

'''''''DO the XML processing''''''''''''''''''
'========================================================================
' Load the respone.xml into DOM for XPATH processing
'========================================================================
bOK = xmlDOC2.load(requestHTTP.responseXML)

IF xmlDOC2.parseError.errorCode &lt;&gt; 0 THEN
myError = xmlDOC2.parseError
Call TraceLogMessage("You have parse error on loading XmlDOC2" )
'# Usually means the Registration Service call did not return. But we still have to return the DataTier host name we discovered. Hence
Call oAPI.Return(oDiscoveryData)
ELSE

'Call TraceLogMessage("DUMP ENTIRE RESPONSE: [[" &amp; requestHTTP.responseXML.Text &amp; "]]")
' ADDED this to get the namespaces to work right.
' ********************************************************
xmlDOC2.SetProperty "SelectionNamespaces", "xmlns:tns='http://schemas.microsoft.com/TeamFoundation/2005/06/Services/Registration/03'"

' changed the path reference to include namespaces and be XPath simpler
' ********************************************************
Set nodeList = xmlDOC2.selectNodes("//tns:ServiceInterfaces")
'Call TraceLogMessage("After setting node to tns:ServiceInterfaces")

' added check for sanity
' ********************************************************
IF nodeList is nothing THEN
'Call TraceLogMessage( "Null ServiceInterfaces Node returned")
ELSE
' Added: NEED to declare the loop variable
' ***********************************

For each nodeValue in nodeList

For each oNode in nodeValue.ChildNodes

serviceName= oNode.selectSingleNode("tns:Name").Text
serviceUrl = oNode.selectSingleNode("tns:Url").Text

'Call TraceLogMessage("serviceName["&amp;serviceName&amp;"]serviceUrl["&amp;serviceUrl&amp;"]")

Select Case serviceName
Case "ReportsService"
vReportService = serviceName
vReportServiceUrl = serviceUrl
Case "WssAdminService"
vWssAdminService = serviceName
vWssAdminServiceUrl = serviceUrl
Case "BaseServerUrl"
vBaseServer = serviceName
vBaseServerUrl = serviceUrl
Case "BaseSiteUrl"
vBaseSite = serviceName
vBaseSiteUrl = serviceUrl
Case "DataSourceServer"
vDataSourceServer = serviceName
vDataSourceServerUrl = serviceUrl
Case "BaseSiteUnc"
vBaseSiteUnc = serviceName
vBaseSiteUncUrl = serviceUrl
Case "BaseReportsUrl"
vBaseReports = serviceName
vBaseReportsUrl = serviceUrl
Case Else
serviceName = ""
serviceUrl =""
End Select

Next
Next
'" Now check for Databases
Set nodeList = xmlDOC2.selectNodes("//tns:Database")
IF nodeList is nothing THEN
'Call TraceLogMessage( "Null Databases Node returned")
ELSE

'Call TraceLogMessage("After setting node to tns:Database")

For each nodeValue in nodeList
'Call TraceLogMessage("Entering FOR LOOP :-&gt; node to tns:Database")

oDataBaseLine = nodeValue.selectSingleNode("tns:Name").Text
DatabaseName = nodeValue.selectSingleNode("tns:DatabaseName").Text
SQLServerName = nodeValue.selectSingleNode("tns:SQLServerName").Text
'Call TraceLogMessage( "DatabaseName["&amp;DatabaseName&amp;"] | SQLServerName["&amp;SQLServerName&amp;"]")

Select Case oDataBaseLine

Case "BIS DB"
vBisDBName = DatabaseName
vBisDBSQLServerName = SQLServerName
'call TraceLogMessage("vBisDBName :=["&amp; vBisDBName &amp;"]vBisDBSQLServerName :=["&amp; vBisDBSQLServerName &amp;"]")

Case "BISDW DB"
vBisDWDBName = DatabaseName
vBisDWDBSQLServerName = SQLServerName
'call TraceLogMessage("vBisDWDBName :=["&amp; vBisDWDBName &amp;"]vBisDWDBSQLServerName :=["&amp; vBisDWDBSQLServerName &amp;"]")

Case "BISANALYSIS DB"
vBisAnalysisDBName = DatabaseName
vBisAnalysisDBSQLServerName = SQLServerName
'call TraceLogMessage("vBisAnalysisDBName :=["&amp; vBisAnalysisDBName &amp;"]vBisAnalysisDBSQLServerName :=["&amp; vBisAnalysisDBSQLServerName &amp;"]")

Case Else
'call TraceLogMessage("Reached Case Else in DBNAME - DO NOTHING ")
End Select
Next
END IF
End if
End If

'############## END - Get Various App Tier [properties from the GetRegistrationEntries Web-Service Method ########################"


'//////////////////////////



Else
Call TraceLogMessage("Len("&amp;strValue&amp;") &gt;0 condition failed")
End If



'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
'''''' Now instantiate the App-Tier class and fill in its property values''''''''''''
'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''

'Call TraceLogMessage("'''''' Now instantiate the App-Tier class and fill in its property values''''''''''''")
set oInstAT = oDiscoveryData.CreateClassInstance("$MPElement[Name='TeamFoundationServer2008.TFSApplicationTier']$")
call oInstAT.AddProperty("$MPElement[Name='TeamFoundationServer2008.TFSApplicationTier']/DataTierHostName$", dataTierHostName)
call oInstAT.AddProperty("$MPElement[Name='TeamFoundationServer2008.TFSApplicationTier']/TFSATComputerName$", TargetComputer )
call oInstAT.AddProperty("$MPElement[Name='TeamFoundationServer2008.TFSApplicationTier']/InstallLocation$", strValue )
call oInstAT.AddProperty("$MPElement[Name='TeamFoundationServer2008.TFSApplicationTier']/BISDB$",vBisDBSQLServerName )
call oInstAT.AddProperty("$MPElement[Name='TeamFoundationServer2008.TFSApplicationTier']/BISDWDB$", vBisDWDBSQLServerName )
call oInstAT.AddProperty("$MPElement[Name='TeamFoundationServer2008.TFSApplicationTier']/BISANALYSISDB$", vBisAnalysisDBSQLServerName )
call oInstAT.AddProperty("$MPElement[Name='TeamFoundationServer2008.TFSApplicationTier']/ReportsServiceUrl$", vReportServiceUrl )
call oInstAT.AddProperty("$MPElement[Name='TeamFoundationServer2008.TFSApplicationTier']/DataSourceServerUrl$", vDataSourceServerUrl )
call oInstAT.AddProperty("$MPElement[Name='TeamFoundationServer2008.TFSApplicationTier']/BaseReportsUrl$", vBaseReportsUrl )
call oInstAT.AddProperty("$MPElement[Name='TeamFoundationServer2008.TFSApplicationTier']/WssAdminServiceUrl$", vWssAdminServiceUrl )
call oInstAT.AddProperty("$MPElement[Name='TeamFoundationServer2008.TFSApplicationTier']/WssBaseServerUrl$", vBaseServerUrl )
call oInstAT.AddProperty("$MPElement[Name='TeamFoundationServer2008.TFSApplicationTier']/WssBaseSiteUrl$", vBaseSiteUrl )


call oInstAT.AddProperty("$MPElement[Name='Windows!Microsoft.Windows.Computer']/PrincipalName$", TargetComputer)
call oDiscoveryData.AddInstance(oInstAT)

'Call TraceLogMessage("Adding instance data for TeamFoundationServer.ApplicationTier Class: tfsATComputerName:["&amp;tfsATComputerName&amp;"]:dataTierHostName["&amp;dataTierHostName&amp;"]:TargetComputer["&amp;TargetComputer&amp;"]")


''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
''''''''''''''''''' Now Create the Relationship and fill in its property values'''''''''''''''''''''''''''''''''''
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
''#######Create the First relationship: AT-TO-SQL ###############################
' Domain name suffix - extract this out of the domain property value and replace.
sFQDN = dataTierHostName&amp;"."&amp;vDNSDomainName


'Call TraceLogMessage("Now Create the TargetClass: SQLServer:DatabaseInstance and fill in its Key property values")
set oDB=oDiscoveryData.CreateClassInstance("$MPElement[Name='TeamFoundationServer2008.TFSDatabaseInstance']$")
call oDB.AddProperty ("$MPElement[Name='MicrosoftSQLServerLibrary!Microsoft.SQLServer.ServerRole']/InstanceName$","MSSQLSERVER" )
call oDB.AddProperty ("$MPElement[Name='Windows!Microsoft.Windows.Computer']/PrincipalName$", sFQDN )

' Note that these are all required key properties of Microsoft.SQLServer.ServerRole, and in case you always need the PrincipalName
' Then you create your relationship instance

'Call TraceLogMessage("Now Create the AT-TO-SQL Relationship Instance")
set oRelnShip= oDiscoveryData.CreateRelationshipInstance("$MPElement[Name='TeamFoundationServer2008.TFSATtoTFSDBInstance']$")

oRelnShip.Source = oInstAT
oRelnShip.Target = oDB

'Call TraceLogMessage("Now Add the AT-TO-SQL Relationship Instance")
Call oDiscoveryData.AddInstance(oRelnShip)




''#######Create the Second relationship: AT-TO-SSRS ###############################

'Call TraceLogMessage("Now Create the TargetClass: SQLServer:SSRS and fill in its Key property values")
set oSSRS = oDiscoveryData.CreateClassInstance("$MPElement[Name='TeamFoundationServer2008.TFSReportingServices']$")
'''### Assumes default instance. Else will have to be obtained from Registry entry which will be in the form of hostname\instancename.
call oSSRS.AddProperty ("$MPElement[Name='MicrosoftSQLServerLibrary!Microsoft.SQLServer.ServerRole']/InstanceName$","MSSQLSERVER" )
'''''#### For now we use the DataSourceServerURL property ; Later this will have to be peeled off of the BaseReportsUrl property.
call oSSRS.AddProperty ("$MPElement[Name='Windows!Microsoft.Windows.Computer']/PrincipalName$", vDataSourceServerUrl&amp;"."&amp;vDNSDomainName)

' Note that these are all required key properties of Microsoft.SQLServer.ServerRole, and in any case you always need the PrincipalName
' Then you create your relationship instance

'Call TraceLogMessage("Now Create the SSRS Relationship Instance 2")
set oRelnShipSSRS= oDiscoveryData.CreateRelationshipInstance("$MPElement[Name='TeamFoundationServer2008.ATContainsSSRS']$")

oRelnShipSSRS.Source = oInstAT
oRelnShipSSRS.Target = oSSRS

'Call TraceLogMessage("Now Add the SSRS Relationship Instance 2")
Call oDiscoveryData.AddInstance(oRelnShipSSRS)

''#######Create the Third relationship: AT-TO-SSAS ###############################

'Call TraceLogMessage("Now Create the TargetClass: SQLServer:SSAS and fill in its Key property values")

IF Len(vBisAnalysisDBSQLServerName) &gt; 0 THEN

set oSSAS = oDiscoveryData.CreateClassInstance("$MPElement[Name='TeamFoundationServer2008.TFSAnalysisServices']$")
'''### Assumes default instance. Else will have to be obtained from Registry entry which will be in the form of hostname\instancename.
call oSSAS.AddProperty ("$MPElement[Name='MicrosoftSQLServerLibrary!Microsoft.SQLServer.ServerRole']/InstanceName$","MSSQLSERVER" )
call oSSAS.AddProperty ("$MPElement[Name='Windows!Microsoft.Windows.Computer']/PrincipalName$", vBisAnalysisDBSQLServerName&amp;"."&amp;vDNSDomainName)

' Note that these are all required key properties of Microsoft.SQLServer.ServerRole, and in any case you always need the PrincipalName
' Then you create your relationship instance

'Call TraceLogMessage("Now Create the SSAS Relationship Instance 3")
set oRelnShipSSAS= oDiscoveryData.CreateRelationshipInstance("$MPElement[Name='TeamFoundationServer2008.ATContainsSSAS']$")

oRelnShipSSAS.Source = oInstAT
oRelnShipSSAS.Target = oSSAS

'Call TraceLogMessage("Now Add the SSAS Relationship Instance 3")
Call oDiscoveryData.AddInstance(oRelnShipSSAS)

END IF


''########################################################################
Call oAPI.Return(oDiscoveryData)

'' ###################### FUNCTIONS ###############################
Function GetTfsInstallFolder()
Dim WSHShell, RegKey, sFolder

Set WSHShell = CreateObject("WScript.Shell")
RegKey = "HKLM\SOFTWARE\Microsoft\VisualStudio\9.0\TeamFoundation\ATInstallPath"
sFolder = WSHShell.RegRead(RegKey)

GetTfsInstallFolder = sFolder
End Function

Function GetTfsUrl()
Dim sTfsWebConfigFile, xmlWebConfig, nodeTfsUrl, bConfigFileLoaded

sTfsWebConfigFile= GetTfsInstallFolder() &amp; "Web Services\Web.Config"

Set xmlWebConfig = CreateObject("MSXML.DOMDocument")
xmlWebConfig.SetProperty "SelectionLanguage", "XPath"
xmlWebConfig.Async = false
bConfigFileLoaded = xmlWebConfig.load(sTfsWebConfigFile)
If bConfigFileLoaded = False Then
Exit Function
End If

Set nodeTfsUrl = xmlWebConfig.selectSingleNode("//add[@key = 'TFSNameUrl']/@value")
If nodeTfsUrl Is Nothing Then
Exit Function
End If
GetTfsUrl = nodeTfsUrl.Value
End Function


'''########## FUNCTION : TraceLogMessage ############################################
Function TraceLogMessage(ByVal sMessage)
Dim lsEventInformation
WScript.Echo sMessage

' Retrieve the name of this (running) script
Dim FSO, ScriptFileName
Set FSO = CreateObject("Scripting.FileSystemObject")
ScriptFileName = FSO.GetFile(WScript.ScriptFullName).Name
Set FSO = Nothing

On Error Resume Next
Dim oAPITemp
Set oAPITemp = CreateObject("MOM.ScriptAPI")
lsEventInformation = 3
oAPITemp.LogScriptEvent ScriptFileName, 4000, lsEventInformation, sMessage
On Error Goto 0
End Function




</Script></ScriptBody>
<TimeoutSeconds>300</TimeoutSeconds>
</DataSource>
</Discovery>