Datawarehouse-database for Operations Manager

Microsoft.SystemCenter.OpsMgrDWDBProvider (DataSourceModuleType)

Element properties:

TypeDataSourceModuleType
IsolationAny
AccessibilityInternal
RunAsMicrosoft.SystemCenter.DatabaseWriteActionAccount
OutputTypeSystem.Discovery.Data

Member Modules:

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

Overrideable Parameters:

IDParameterTypeSelectorDisplay NameDescription
IntervalSecondsint$Config/IntervalSeconds$Interval i sekunder
TimeoutSecondsint$Config/TimeoutSeconds$Timeout i sekunder

Source Code:

<DataSourceModuleType ID="Microsoft.SystemCenter.OpsMgrDWDBProvider" Accessibility="Internal" RunAs="Microsoft.SystemCenter.DatabaseWriteActionAccount" Batching="false">
<Configuration>
<xsd:element name="IntervalSeconds" type="xsd:integer"/>
<xsd:element name="ComputerName" type="xsd:string"/>
<xsd:element name="DatabaseServerName" type="xsd:string"/>
<xsd:element name="DatabaseName" type="xsd:string"/>
<xsd:element name="TimeoutSeconds" type="xsd:int"/>
</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="DS" TypeID="Windows!Microsoft.Windows.TimedScript.DiscoveryProvider">
<IntervalSeconds>$Config/IntervalSeconds$</IntervalSeconds>
<SyncTime/>
<ScriptName>GetOpsMgrDWDBWatcherDiscovery.vbs</ScriptName>
<Arguments>$MPElement$ $Target/Id$ "$Config/DatabaseServerName$" "$Config/DatabaseName$" "$Config/ComputerName$"</Arguments>
<ScriptBody><Script>
'Copyright (c) Microsoft Corporation. All rights reserved.

'*************************************************************************
' $ScriptName: "GetSqlNativeClientComman" $
'
' Purpose: This script is used to get SQL native client Driver name.
'
' $File: GetSqlNativeClientComman.vbs $
'*************************************************************************


Option Explicit

Function GetSqlDriverName
Dim oAPI1, oReg
Const HKEY_LOCAL_MACHINE = &amp;H80000002
Dim strComputer, strDriverPath, strKeyPath, intValue, strValueName,arrSubKeys,oSubkey,strNewKeyPath,intDotIndex
strComputer = "."
strDriverPath="SQLOLEDB"
Set oReg=GetObject("winmgmts:\\" &amp; _
strComputer &amp; "\root\default:StdRegProv")
strKeyPath = "SOFTWARE\ODBC\ODBCINST.INI"
oReg.EnumKey HKEY_LOCAL_MACHINE, strKeyPath, arrSubKeys

For Each oSubkey In arrSubKeys
intValue = InStr(oSubkey, "SQL Server Native Client")
if intValue &lt;&gt; 0 Then
strValueName = "Driver"
strNewKeyPath = strKeyPath&amp;"\"&amp;oSubkey
oReg.GetStringValue HKEY_LOCAL_MACHINE, strNewKeyPath, strValueName , strDriverPath
strDriverPath = Mid (strDriverPath, InStrRev(strDriverPath, "\")+1)
intDotIndex = InStr(strDriverPath, ".")
strDriverPath = Left(strDriverPath , intDotIndex-1)
end if
Next
GetSqlDriverName = strDriverPath
End Function

'Copyright (c) Microsoft Corporation. All rights reserved.

'*************************************************************************
' $ScriptName: GetOpsMgrDWDBWatcherDiscovery" $
'
' $File: GetOpsMgrDWDBWatcherDiscovery.vbs $
'*************************************************************************

'Copyright (c) Microsoft Corporation. All rights reserved.
' Parameters that should be passed to this script
' 0 Source Guid
' 1 Target Guid
' 2 DatabaseServerName
' 3 DatabaseName
' 4 ComputerName


SetLocale("en-us")


Const SQL_DISCOVERY_SUCCESS = 0
Const SQL_DISCOVERY_ERROR = 1
Const SCOM_ERROR = 1
Const SCOM_WARNING = 2
Const SCOM_INFORMATIONAL = 4
Const SCOM_EVENTNUMBER = 1199
Const START_EVENTNUMBER = 9100
Const EVENTNUMBER = 9101
Const TRACEEVENTNUMBER = 9102
Const SCRIPTNAME = "GetOpsMgrDWDBWatcherDiscovery.vbs"

Dim ObjError
Set ObjError = New Error

On Error Resume Next

Dim oArgs, idSource, idManagedEntity, databaseServerName, databaseName, ComputerName, oDebugFlag
Dim oAPI, objDiscoveryData, strDriverName

Set oAPI = CreateObject("MOM.ScriptAPI")

Set oArgs = WScript.Arguments
If oArgs.Count &lt; 5 Then
ThrowErrorAndExit "Usage: " &amp; SCRIPTNAME &amp; " &lt;discovery object GUID&gt; &lt;ManagedEntityID GUID&gt; &lt;Database Server Name&gt; &lt;Database Name&gt; &lt;Computer Name&gt; [debug &lt;true | false&gt;]"
End If

idSource = oArgs(0)
idManagedEntity = oArgs(1)
databaseServerName = oArgs(2)
databaseName = oArgs(3)
ComputerName = oArgs(4)

If (oArgs.Count = 6) Then
oDebugFlag = CBool(oArgs(5))
Else
oDebugFlag = CBool(false)
End If

Trace "SourceID: " &amp; idSource &amp; " ManagedEntityID: " &amp; idManagedEntity &amp; " Database Server Name: " &amp; databaseServerName &amp; " Database Name: " &amp; databaseName &amp; " Computer Name: " &amp; ComputerName

Set objDiscoveryData = oAPI.CreateDiscoveryData(0, idSource, idManagedEntity)

'Set the connection string
strDriverName = GetSqlDriverName
Dim connectionString
connectionString = "Provider=" &amp; strDriverName &amp; ";Server=" &amp; _
databaseServerName &amp; ";" &amp; _
"Integrated Security=SSPI;Initial Catalog=" &amp; databaseName

GetDBProperties connectionString, objDiscoveryData
Call oAPI.Return(objDiscoveryData)
If Err.Number &lt;&gt; 0 Then ThrowErrorAndExit "Error returning discovery data. code = " &amp; Err.Number

Trace "Exiting normally"
WScript.Quit()

' Creates an object
Function MOMCreateObject(ByVal name)
'create the object
On Error Resume Next
Set MOMCreateObject = CreateObject(name)
If Err.Number &lt;&gt; 0 Then
ThrowErrorAndExit "Unable to create COM object '" &amp; name &amp; "'"
End If
End Function

Function GetDBProperties(ByVal connectionString, ByVal objDiscoveryData)
Dim cnADOConnection
Trace "Creating ADODB Connection"

Set cnADOConnection = CreateObject("ADODB.Connection")
If Err.Number &lt;&gt; 0 Then ThrowErrorAndExit "Unable to create ADODB Connection"

Trace "ADODB Connection Created"

Trace "Opening ADODB Connection"
cnADOConnection.Open connectionString
cnADOConnection.CommandTimeout = 300
Trace "ADODB Connection Opened"

If Err.Number &lt;&gt; 0 Then ThrowErrorAndExit "Unable to open ADODB Connection"

Dim oResults, DWDBName, DWDBServerName, objInstance, strViewName, strFieldName, strServerNameFieldName, strServerDBFieldName, Field, DWWatcherName
Trace "Executing Query"

Set oResults = cnADOConnection.Execute("select ManagedTypeViewName from (select ManagedTypeTableName from ManagedType where TypeName = 'Microsoft.SystemCenter.DataWarehouse' ) as MTDW, (select ManagedTypeId from ManagedType where TypeName = 'Microsoft.SystemCenter.DataWarehouse' ) as MTDW_IJ inner join ManagedType as MT on MT.ManagedTypeId = MTDW_IJ.ManagedTypeId",2)

strViewName = oResults(0).Value

Set oResults = cnADOConnection.Execute("select * from " &amp; strViewName,2)

For Each Field in oResults.Fields
strFieldName =Field.Name

If InStr(strFieldName, "MainDatabaseServerName") Then
strServerNameFieldName = strFieldName
End If

If InStr(strFieldName, "MainDatabaseName") Then
strServerDBFieldName = strFieldName
End If
Next

Trace "Query Executed"

Trace "Checking for returned columns"

If IsNull(oResults(strServerNameFieldName).Value) Or IsNull(oResults(strServerDBFieldName).Value) Then
Set oResults = nothing
cnADOConnection.Close
GetDBProperties = SQL_DISCOVERY_ERROR
Trace "Query is not returning data"
ReturnNothing
else
DWDBName = Cstr(Trim(oResults(strServerDBFieldName).Value))
DWDBServerName = Cstr(Trim(oResults(strServerNameFieldName).Value))
DWWatcherName = "$Target/Property[Type='System!System.Entity']/DisplayName$" &amp; " DW Watcher"

Trace "DW Database Name: " &amp; DWDBName &amp; " DW Database Server Name: " &amp; DWDBServerName

Set objInstance = objDiscoveryData.CreateClassInstance("$MPElement[Name='Microsoft.SystemCenter.OpsMgrDWWatcher']$")
Call objInstance.AddProperty("$MPElement[Name='Windows!Microsoft.Windows.Computer']/PrincipalName$",ComputerName)
Call objInstance.AddProperty("$MPElement[Name='Microsoft.SystemCenter.OpsMgrDWWatcher']/DatabaseName$",DWDBName)
Call objInstance.AddProperty("$MPElement[Name='Microsoft.SystemCenter.OpsMgrDWWatcher']/DatabaseServerName$",DWDBServerName)
Call objInstance.AddProperty("$MPElement[Name='System!System.Entity']/DisplayName$",DWWatcherName)

If Err.Number &lt;&gt; 0 Then ThrowErrorAndExit "Error adding instance properties. code = " &amp; Err.Number

Call objDiscoveryData.AddInstance(objInstance)

If Err.Number &lt;&gt; 0 Then ThrowErrorAndExit "Error adding discovery data. code = " &amp; Err.Number

Set oResults = nothing
cnADOConnection.Close
GetDBProperties = SQL_DISCOVERY_SUCCESS
End If

End Function

Sub ThrowErrorAndExit(Message)
Err.Clear
Call oAPI.LogScriptEvent(SCRIPTNAME, SCOM_EVENTNUMBER, SCOM_ERROR, Message)
WScript.Quit()
End Sub

Sub Trace(Message)
If (oDebugFlag = true) Then
Call oAPI.LogScriptEvent(SCRIPTNAME, TRACEEVENTNUMBER, SCOM_INFORMATIONAL, Message)
End If
End Sub

Sub ReturnNothing
objDiscoveryData.IsSnapshot = False
Call oAPI.Return(objDiscoveryData)
WScript.Quit()
End Sub

'---------------------------------------------------------------------------
' Retrieves a WMI object from the specified namespace.
'---------------------------------------------------------------------------
Function GetWMIObject(ByVal sNamespace)
dim oWMI

'get the object
on error resume next
set oWMI = GetObject(sNamespace)
ObjError.Save
on error goto 0

'did it work?
if IsEmpty(oWMI) then
'no
strMessageToUse = "Error Number: " &amp; ObjError.number &amp; " Unable to open WMI Namespace '" &amp; sNamespace &amp; "'. Check to see if the WMI service is enabled and running, and ensure this WMI namespace exists."
ThrowErrorAndExit strMessageToUse
end if

set GetWMIObject = oWMI
End Function

'---------------------------------------------------------------------------
' Execute a WMI Query.
'---------------------------------------------------------------------------
Function ExecuteWMIQuery(TargetComputer, strBaseClass, strQuery, strPropertyName)
Dim WbemSrv, WbemObjectSet, objItem
Set WbemSrv = GetWMIObject("winmgmts:{impersonationLevel=impersonate}!\\" &amp; TargetComputer &amp; "\root\" &amp; strBaseClass)
Set WbemObjectSet = WbemSrv.ExecQuery(strQuery)
For Each objItem in WbemObjectSet
ExecuteWMIQuery = objItem.Properties_(strPropertyName).value
Next
End Function

'---------------------------------------------------------------------------
' Error Handling Class
'---------------------------------------------------------------------------
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="DS"/>
</Composition>
</Composite>
</ModuleImplementation>
<OutputType>System!System.Discovery.Data</OutputType>
</DataSourceModuleType>