App Controller Database Discovery

Microsoft.SystemCenter.2012.AppController.Database.Discovery (Discovery)

Discovers App Controller Databases

Knowledge Base article:

Summary

This Discovery discovers instances of the App Controller Database.

Note: A SQL Server (Discovery) Management Pack (e.g. SQL Server 2008 (Discovery)) must be imported for this Discovery to run correctly.

Element properties:

TargetMicrosoft.SystemCenter.2012.AppController.Server
EnabledTrue
Frequency21600
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 Default

Source Code:

<Discovery ID="Microsoft.SystemCenter.2012.AppController.Database.Discovery" Target="Microsoft.SystemCenter.2012.AppController.Server" Enabled="true" ConfirmDelivery="false" Remotable="true" Priority="Normal">
<Category>Discovery</Category>
<DiscoveryTypes>
<DiscoveryClass TypeID="Microsoft.SystemCenter.2012.AppController.Database"/>
<DiscoveryRelationship TypeID="Microsoft.SystemCenter.2012.AppController.ServerContainsDatabase"/>
</DiscoveryTypes>
<DataSource ID="DS" TypeID="Windows!Microsoft.Windows.TimedScript.DiscoveryProvider">
<IntervalSeconds>21600</IntervalSeconds>
<SyncTime/>
<ScriptName>DiscoverWebSite.vbs</ScriptName>
<Arguments>$MPElement$ $Target/Id$ $Target/Host/Property[Type="Windows!Microsoft.Windows.Computer"]/PrincipalName$</Arguments>
<ScriptBody><Script>' Copyright (C) Microsoft. All rights reserved.
' DiscoverDatabase.vbs
Option Explicit
SetLocale("en-us")

Const StrDatabaseInstanceRegKey = "HKLM\SOFTWARE\Microsoft\Microsoft System Center App Controller\Settings\Setup\sql"
Const StrDatabaseNameRegKey = "HKLM\SOFTWARE\Microsoft\Microsoft System Center App Controller\Settings\Setup\sqldb"

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

Dim oAPI
Set oAPI = CreateObject("MOM.ScriptAPI")

Dim SourceId, ManagedEntityId, TargetComputer
SourceId = oArgs(0)
ManagedEntityId = oArgs(1)
TargetComputer = oArgs(2)

Dim strDatabaseInstanceRegValue, strDatabaseNameRegValue
Call ReadRegistry(StrDatabaseInstanceRegKey, strDatabaseInstanceRegValue)
Call ReadRegistry(StrDatabaseNameRegKey, strDatabaseNameRegValue)

Dim strHostname, strDatabaseInstance
ParseDatabaseInstanceRegValue strDatabaseInstanceRegValue, strHostname, strDatabaseInstance

Dim oDiscoveryData, oInst1, oInst2, oRelationship
Set oDiscoveryData = oAPI.CreateDiscoveryData(0, SourceId, ManagedEntityId)

Set oInst1 = oDiscoveryData.CreateClassInstance("$MPElement[Name='Microsoft.SystemCenter.2012.AppController.Database']$")
Call oInst1.AddProperty("$MPElement[Name='Windows!Microsoft.Windows.Computer']/PrincipalName$", Nslookup(strHostname))
Call oInst1.AddProperty("$MPElement[Name='SQLServer!Microsoft.SQLServer.Database']/DatabaseName$", strDatabaseNameRegValue)
Call oInst1.AddProperty("$MPElement[Name='SQLServer!Microsoft.SQLServer.ServerRole']/InstanceName$", strDatabaseInstance)
Call oDiscoveryData.AddInstance(oInst1)

Set oInst2 = oDiscoveryData.CreateClassInstance("$MPElement[Name='Microsoft.SystemCenter.2012.AppController.Server']$")
Call oInst2.AddProperty("$MPElement[Name='Windows!Microsoft.Windows.Computer']/PrincipalName$", TargetComputer)
Call oDiscoveryData.AddInstance(oInst2)

Set oRelationship = oDiscoveryData.CreateRelationshipInstance("$MPElement[Name='Microsoft.SystemCenter.2012.AppController.ServerContainsDatabase']$")
oRelationship.Source = oInst2
oRelationship.Target = oInst1
Call oDiscoveryData.AddInstance(oRelationship)

Call oAPI.Return(oDiscoveryData)

Function ReadRegistry(ByVal strRegKey, ByRef strRegValue)
Dim bRegKeyExists

Dim WshShell
Set WshShell = WScript.CreateObject("WScript.Shell")

On Error Resume Next
strRegValue = WshShell.RegRead(strRegKey)
If Err.number &lt;&gt; 0 Then
bRegKeyExists = False
Else
bRegKeyExists = True
End If

ReadRegistry = bRegKeyExists
End Function

Sub ParseDatabaseInstanceRegValue(ByVal strRegValue, ByRef strHostname, ByRef strDatabaseInstance)
Dim strTempArray
If InStr(strRegValue, "\") Then
strTempArray = Split(strRegValue, "\")
strHostname = strTempArray(0)
strDatabaseInstance = strTempArray(1)
Else
strHostname = strRegValue
strDatabaseInstance = "MSSQLSERVER"
End If
End Sub

Function Nslookup(ByVal strHostname)
Dim WshShell, oExec, strBuffer
Set WshShell = WScript.CreateObject("WScript.Shell")

' TODO: add support for (local) and "."
If strHostname = "localhost" Then
Set oExec = WshShell.Exec("hostname")

Do While Not oExec.StdOut.AtEndOfStream
strHostname = oExec.StdOut.ReadAll
Loop
End If

Set oExec = WshShell.Exec("nslookup " &amp; strHostname)

Do While Not oExec.StdOut.AtEndOfStream
strBuffer = oExec.StdOut.ReadLine
If InStr(strBuffer, "Name:") Then
Nslookup = Trim(Replace(strBuffer, "Name:", ""))
End If
Loop
End Function
</Script></ScriptBody>
<TimeoutSeconds>300</TimeoutSeconds>
</DataSource>
</Discovery>