Microsoft Dynamics AX 2009 AOS Discovery

Microsoft.Dynamics.AX.Management.Pack.DynamicsServer.Discovery (Discovery)

Gathers information about the AOS's on this machine.

Element properties:

TargetMicrosoft.Dynamics.AX.Management.Pack.DynamicsServer.ServerSeed
EnabledTrue
Frequency300
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 Microsoft.Dynamics.AXUserAccount

Source Code:

<Discovery ID="Microsoft.Dynamics.AX.Management.Pack.DynamicsServer.Discovery" Enabled="true" Target="Microsoft.Dynamics.AX.Management.Pack.DynamicsServer.ServerSeed" ConfirmDelivery="false" Remotable="true" Priority="Normal">
<Category>Discovery</Category>
<DiscoveryTypes>
<DiscoveryClass TypeID="Microsoft.Dynamics.AX.Management.Pack.DynamicsServer">
<Property TypeID="System!System.Entity" PropertyID="DisplayName"/>
</DiscoveryClass>
<DiscoveryClass TypeID="Microsoft.Dynamics.AX.Management.Pack.DynamicsServer.Instance">
<Property TypeID="Microsoft.Dynamics.AX.Management.Pack.DynamicsServer.Instance" PropertyID="ID"/>
<Property TypeID="Microsoft.Dynamics.AX.Management.Pack.DynamicsServer.Instance" PropertyID="Name"/>
<Property TypeID="Microsoft.Dynamics.AX.Management.Pack.DynamicsServer.Instance" PropertyID="ActiveSessions"/>
<Property TypeID="Microsoft.Dynamics.AX.Management.Pack.DynamicsServer.Instance" PropertyID="ActiveConfig"/>
<Property TypeID="Microsoft.Dynamics.AX.Management.Pack.DynamicsServer.Instance" PropertyID="DatabaseType"/>
<Property TypeID="Microsoft.Dynamics.AX.Management.Pack.DynamicsServer.Instance" PropertyID="DBServer"/>
<Property TypeID="Microsoft.Dynamics.AX.Management.Pack.DynamicsServer.Instance" PropertyID="DatabaseName"/>
<Property TypeID="Microsoft.Dynamics.AX.Management.Pack.DynamicsServer.Instance" PropertyID="DBOraclePort"/>
<Property TypeID="Microsoft.Dynamics.AX.Management.Pack.DynamicsServer.Instance" PropertyID="DBOracleSchema"/>
<Property TypeID="Microsoft.Dynamics.AX.Management.Pack.DynamicsServer.Instance" PropertyID="DBOracleTNS"/>
<Property TypeID="Microsoft.Dynamics.AX.Management.Pack.DynamicsServer.Instance" PropertyID="DBMachineName"/>
<Property TypeID="Microsoft.Dynamics.AX.Management.Pack.DynamicsServer.Instance" PropertyID="Port"/>
<Property TypeID="Microsoft.Dynamics.AX.Management.Pack.DynamicsServer.Instance" PropertyID="SessionStartDate"/>
<Property TypeID="Microsoft.Dynamics.AX.Management.Pack.DynamicsServer.Instance" PropertyID="IsBatchServer"/>
<Property TypeID="Microsoft.Dynamics.AX.Management.Pack.DynamicsServer.Instance" PropertyID="MaxSessions"/>
<Property TypeID="Microsoft.Dynamics.AX.Management.Pack.DynamicsServer.Instance" PropertyID="ServiceName"/>
<Property TypeID="Microsoft.Dynamics.AX.Management.Pack.DynamicsServer.Instance" PropertyID="AosServerName"/>
<Property TypeID="System!System.Entity" PropertyID="DisplayName"/>
</DiscoveryClass>
<DiscoveryClass TypeID="Microsoft.Dynamics.AX.Management.Pack.DynamicsServer.Instance.User">
<Property TypeID="Microsoft.Dynamics.AX.Management.Pack.DynamicsServer.Instance.User" PropertyID="UserID"/>
<Property TypeID="Microsoft.Dynamics.AX.Management.Pack.DynamicsServer.Instance.User" PropertyID="UserName"/>
<Property TypeID="Microsoft.Dynamics.AX.Management.Pack.DynamicsServer.Instance.User" PropertyID="UserSessionType"/>
<Property TypeID="Microsoft.Dynamics.AX.Management.Pack.DynamicsServer.Instance.User" PropertyID="UserSessionState"/>
<Property TypeID="Microsoft.Dynamics.AX.Management.Pack.DynamicsServer.Instance.User" PropertyID="UserLoginDate"/>
<Property TypeID="Microsoft.Dynamics.AX.Management.Pack.DynamicsServer.Instance.User" PropertyID="UserSessionId"/>
<Property TypeID="Microsoft.Dynamics.AX.Management.Pack.DynamicsServer.Instance.User" PropertyID="UserSID"/>
<Property TypeID="System!System.Entity" PropertyID="DisplayName"/>
</DiscoveryClass>
<DiscoveryClass TypeID="Microsoft.Dynamics.AX.Management.Pack.DynamicsServer.Instance.User.Job">
<Property TypeID="Microsoft.Dynamics.AX.Management.Pack.DynamicsServer.Instance.User.Job" PropertyID="JobID"/>
<Property TypeID="Microsoft.Dynamics.AX.Management.Pack.DynamicsServer.Instance.User.Job" PropertyID="JobName"/>
<Property TypeID="Microsoft.Dynamics.AX.Management.Pack.DynamicsServer.Instance.User.Job" PropertyID="JobStatus"/>
<Property TypeID="Microsoft.Dynamics.AX.Management.Pack.DynamicsServer.Instance.User.Job" PropertyID="JobActDT"/>
<Property TypeID="Microsoft.Dynamics.AX.Management.Pack.DynamicsServer.Instance.User.Job" PropertyID="JobStartDT"/>
<Property TypeID="Microsoft.Dynamics.AX.Management.Pack.DynamicsServer.Instance.User.Job" PropertyID="JobCreateBy"/>
<Property TypeID="System!System.Entity" PropertyID="DisplayName"/>
</DiscoveryClass>
<DiscoveryClass TypeID="Microsoft.Dynamics.AX.Management.Pack.DynamicsServer.Instance.User.Job.Batch">
<Property TypeID="Microsoft.Dynamics.AX.Management.Pack.DynamicsServer.Instance.User.Job.Batch" PropertyID="BatchID"/>
<Property TypeID="Microsoft.Dynamics.AX.Management.Pack.DynamicsServer.Instance.User.Job.Batch" PropertyID="BatchName"/>
<Property TypeID="Microsoft.Dynamics.AX.Management.Pack.DynamicsServer.Instance.User.Job.Batch" PropertyID="BatchRunType"/>
<Property TypeID="Microsoft.Dynamics.AX.Management.Pack.DynamicsServer.Instance.User.Job.Batch" PropertyID="BatchStartDT"/>
<Property TypeID="Microsoft.Dynamics.AX.Management.Pack.DynamicsServer.Instance.User.Job.Batch" PropertyID="BatchAOS"/>
<Property TypeID="Microsoft.Dynamics.AX.Management.Pack.DynamicsServer.Instance.User.Job.Batch" PropertyID="Company"/>
<Property TypeID="Microsoft.Dynamics.AX.Management.Pack.DynamicsServer.Instance.User.Job.Batch" PropertyID="ExecutedBy"/>
<Property TypeID="Microsoft.Dynamics.AX.Management.Pack.DynamicsServer.Instance.User.Job.Batch" PropertyID="Status"/>
<Property TypeID="Microsoft.Dynamics.AX.Management.Pack.DynamicsServer.Instance.User.Job.Batch" PropertyID="BatchJobID"/>
<Property TypeID="Microsoft.Dynamics.AX.Management.Pack.DynamicsServer.Instance.User.Job.Batch" PropertyID="BatchJobName"/>
<Property TypeID="System!System.Entity" PropertyID="DisplayName"/>
</DiscoveryClass>
<DiscoveryRelationship TypeID="Microsoft.Dynamics.AX.Management.Pack.DynamicsServerInstances"/>
<DiscoveryRelationship TypeID="Microsoft.Dynamics.AX.Management.Pack.InstanceUsers"/>
<DiscoveryRelationship TypeID="Microsoft.Dynamics.AX.Management.Pack.UserJobs"/>
<DiscoveryRelationship TypeID="Microsoft.Dynamics.AX.Management.Pack.JobBatchs"/>
</DiscoveryTypes>
<DataSource ID="DS" RunAs="Microsoft.Dynamics.AXUserAccount" TypeID="Windows!Microsoft.Windows.TimedScript.DiscoveryProvider">
<IntervalSeconds>300</IntervalSeconds>
<SyncTime/>
<ScriptName>DiscoverDynamicsAXInstances.vbs</ScriptName>
<Arguments>$MPElement$ $Target/Id$ $Target/Host/Property[Type="Windows!Microsoft.Windows.Computer"]/PrincipalName$</Arguments>
<ScriptBody><Script>


On Error Resume Next
' Required discovery variables.
Dim oAPI, SourceType, SourceId, ManagedEntityId, TargetComputer, oDiscoveryData, oArgs
' Custom discovery variables.
Dim oInst ' , instanceName

Dim strFileName
GetLogFileName strFileName


' Create API instance
Set oAPI = CreateObject("MOM.ScriptAPI")

'Call oAPI.LogScriptEvent(strScriptName, 5000, 2, "Script STARTED" )

Set oArgs = WScript.Arguments
SourceType = 0
SourceId = oArgs(0)
ManagedEntityId = oArgs(1)
TargetComputer = oArgs(2)

Set oDiscoveryData = oAPI.CreateDiscoveryData(0, SourceId, ManagedEntityId)

Const HKEY_LOCAL_MACHINE = &amp;H80000002
Const SQLSERVERDISPLAY = "SQL Server"
Const ORACLEDISPLAY = "Oracle"
Dim strInstanceId, strKeyPath, strComputer, strEntryName, arrValueNames, arrValueTypes, objReg, strKeyOriginal
Dim strActiveConfig, strActiveConfigValueName
Dim strInstanceKeyPath, strValueNameInstanceName
Dim strKeySetupProperties, strSqlDataBaseValueName, strSqlServerValueName
Dim strOracleServerValueName, strOracleDatabaseValueName, strOraclePortValueName, strOracleSchemaValueName
Dim strTNSValueName, strUseTNSValueName
Dim strPortValueName, recordset
Dim strAOSPathReg, strAOSExeName

' Declare keys
strKeyPath = "SYSTEM\CurrentControlSet\Services\Dynamics Server\5.0"
strComputer = "."
strEntryName = ""

strKeySetupProperties = "Original (installed configuration)\SetupProperties"
strKeyOriginal = "Original (installed configuration)"
strSqlDataBaseValueName = "database"
strSqlServerValueName = "dbserver"
strActiveConfigValueName = "Current"
strPortValueName = "port"
strValueNameInstanceName = "InstanceName"
strDatabaseTypeValueName = "dbcli"
strTNSValueName = "ociservice"
strUseTNSValueName = "ociconnectservice"
strOracleServerValueName = "ocihost"
strOracleDatabaseValueName = "ocidbid"
strOraclePortValueName = "ocitcpipport"
strOracleSchemaValueName = "ocischema"
strAOSPathReg = "AOSPath"

Set objReg = GetObject("winmgmts:{impersonationLevel=impersonate}!\\" &amp; strComputer &amp; "\root\default:StdRegProv")
objReg.EnumKey HKEY_LOCAL_MACHINE, strKeyPath, arrValueNames

If IsNull(arrValueNames) Then
Call oDiscoveryData.AddInstance(null)
Else
' Create application class instance.
Set oInst = oDiscoveryData.CreateClassInstance("$MPElement[Name='Microsoft.Dynamics.AX.Management.Pack.DynamicsServer']$")
Call oInst.AddProperty("$MPElement[Name='Windows!Microsoft.Windows.Computer']/PrincipalName$", TargetComputer)
Call oInst.AddProperty("$MPElement[Name='System!System.Entity']/DisplayName$", Ucase("$Target/Host/Property[Type='Windows!Microsoft.Windows.Computer']/NetbiosComputerName$"))
Call oInst.AddProperty("$MPElement[Name='Microsoft.Dynamics.AX.Management.Pack.DynamicsServer']/DynamicsEventSourceAttribute$", "Dynamics Server ")
Call oDiscoveryData.AddInstance(oInst)

'Discovery Services
For Each strInstanceId In arrValueNames
Dim strInstanceName, strDatabase, strDBServer, strPort, strDBServerMachineName, strSessionStartDate, strIsBatchServer, intMaxSessions, strSSCID, strServiceName
Dim strInstanceConfigKeyPath
Dim strDBServerType
Dim strOracleUseTNS, strOracleTNSName, strOraclePort, strOracleSchema
Dim strSchema
Dim strAOSExePath, strAOSExeVersion, objFSO

strInstanceKeyPath = strKeyPath &amp; "\" &amp; strInstanceId
objReg.GetStringValue HKEY_LOCAL_MACHINE, strInstanceKeyPath, strActiveConfigValueName, strActiveConfig
objReg.GetStringValue HKEY_LOCAL_MACHINE, strInstanceKeyPath, strValueNameInstanceName, strInstanceName
objReg.GetStringValue HKEY_LOCAL_MACHINE, strInstanceKeyPath, strAOSPathReg, strAOSExePath

Set objFSO = CreateObject("Scripting.FileSystemObject")
strAOSExeVersion = objFSO.GetFileVersion(strAOSExePath)

strInstanceConfigKeyPath = strInstanceKeyPath &amp; "\" &amp; strActiveConfig

objReg.GetStringValue HKEY_LOCAL_MACHINE, strInstanceConfigKeyPath , strDatabaseTypeValueName, strDBServerType

If strDBServerType = "odbc" then
' SQL Server Database
strDBServerType = SQLSERVERDISPLAY
objReg.GetStringValue HKEY_LOCAL_MACHINE, strInstanceConfigKeyPath , strSqlDataBaseValueName, strDatabase
objReg.GetStringValue HKEY_LOCAL_MACHINE, strInstanceConfigKeyPath , strSqlServerValueName, strDBServer
strOracleUseTNS = "N/A"
strOracleTnsName = "N/A"
strOraclePort = "N/A"
strOracleSchema = "N/A"
strSchema = ""
Else
' Oracle Database
strDBServerType = ORACLEDISPLAY
objReg.GetStringValue HKEY_LOCAL_MACHINE, strInstanceConfigKeyPath , strUseTNSValueName, strOracleUseTNS
objReg.GetStringValue HKEY_LOCAL_MACHINE, strInstanceConfigKeyPath , strOracleSchemaValueName, strOracleSchema
If strOracleUseTNS = "1" Then
strOraclePort = "N/A"
strDatabase = "N/A"
strDBServer = "N/A"
objReg.GetStringValue HKEY_LOCAL_MACHINE, strInstanceConfigKeyPath , strTNSValueName, strOracleTNSName
Else
strOracleTNSName = "N/A"
objReg.GetStringValue HKEY_LOCAL_MACHINE, strInstanceConfigKeyPath , strOraclePortValueName, strOraclePort
objReg.GetStringValue HKEY_LOCAL_MACHINE, strInstanceConfigKeyPath , strOracleDatabaseValueName, strDatabase
objReg.GetStringValue HKEY_LOCAL_MACHINE, strInstanceConfigKeyPath , strOracleServerValueName, strDBServer
End If

strSchema = strOracleSchema &amp; "."
End If

objReg.GetStringValue HKEY_LOCAL_MACHINE, strInstanceConfigKeyPath , strPortValueName, strPort

' getting data from DB
Dim cnADOConnection, strConnectionString, strSQLCustomers, ServerDbId, strAosServerPort, intSessionStatus
Set cnADOConnection = CreateObject("ADODB.Connection")
cnADOConnection.ConnectionTimeout = 30

If strDBServerType = SQLSERVERDISPLAY Then
cnADOConnection.Provider = "sqloledb"
strConnectionString = "Server=" &amp; strDBServer &amp; ";Database=" &amp; strDatabase &amp; ";Trusted_Connection=yes"
Else
If strOracleUseTNS = "1" Then
strConnectionString = "Provider=MSDAORA;Data Source=" &amp; strOracleTNSName &amp; ";Persist Security Info=False;OSAuthent=1;"
Else
strConnectionString = "Provider=MSDAORA;Data Source=(DESCRIPTION = (ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP)(HOST = " &amp; strDBServer &amp; ")(PORT = " &amp; strOraclePort &amp; ")))(CONNECT_DATA = (SERVICE_NAME = " &amp; strDatabase &amp; ")));Persist Security Info=False;OSAuthent=1;"
End If
End If

strDBServerMachineName = strConnectionString

cnADOConnection.ConnectionString = strConnectionString
cnADOConnection.Open

Set recordset = CreateObject("ADODB.Recordset")
recordset.ActiveConnection = cnADOConnection

If strDBServerType = SQLSERVERDISPLAY Then
'Get Machine Name of SQL Server
recordset.Source = "select SERVERPROPERTY ('MachineName')"
Else
recordset.Source = "SELECT sys_context('USERENV', 'SERVER_HOST') FROM dual"
End If

recordset.Open
strDBServerMachineName = recordset(0)
recordset.Close

strAosServerPort = "$Target/Host/Property[Type='Windows!Microsoft.Windows.Computer']/NetbiosComputerName$" &amp; "@" &amp; strPort

recordset.Source = "select * from " &amp; strSchema &amp; "SYSSERVERSESSIONS where AOSID = '" &amp; strAosServerPort &amp; "'"

strSessionStartDate = ""

recordset.Open
ServerDbId = recordset("SERVERID")
strSessionStartDate = recordset("LOGINDATETIME")
intSessionStatus = recordset("STATUS")
recordset.Close

strSSCID = strInstanceId &amp; "@" &amp; Ucase("$Target/Host/Property[Type='Windows!Microsoft.Windows.Computer']/NetbiosComputerName$")

recordset.Source = "select * from " &amp; strSchema &amp; "SYSSERVERCONFIG where SERVERID = '" &amp; strSSCID &amp; "'"

recordset.Open
strIsBatchServer = CInt(recordset("ENABLEBATCH"))
intMaxSessions = CInt(recordset("MAXSESSIONS"))
recordset.Close

If strIsBatchServer = 1 Then
strIsBatchServer = "True"
Else
strIsBatchServer = "False"
End if

GetSessionStatusString Cint(intSessionStatus), strSessionStatus

strServiceName = "AOS50$" &amp; CStr(strInstanceId)
' Create child instance
Set oInst = oDiscoveryData.CreateClassInstance("$MPElement[Name='Microsoft.Dynamics.AX.Management.Pack.DynamicsServer.Instance']$")

Call oInst.AddProperty("$MPElement[Name='Windows!Microsoft.Windows.Computer']/PrincipalName$", TargetComputer)
Call oInst.AddProperty("$MPElement[Name='Microsoft.Dynamics.AX.Management.Pack.DynamicsServer.Instance']/ID$", CStr(strInstanceId) )
Call oInst.AddProperty("$MPElement[Name='Microsoft.Dynamics.AX.Management.Pack.DynamicsServer.Instance']/Name$", CStr(strInstanceName))
Call oInst.AddProperty("$MPElement[Name='Microsoft.Dynamics.AX.Management.Pack.DynamicsServer.Instance']/ActiveConfig$", CStr(strActiveConfig))
Call oInst.AddProperty("$MPElement[Name='Microsoft.Dynamics.AX.Management.Pack.DynamicsServer.Instance']/DatabaseType$", CStr(strDBServerType))
Call oInst.AddProperty("$MPElement[Name='Microsoft.Dynamics.AX.Management.Pack.DynamicsServer.Instance']/DBServer$", CStr(strDBServer))
Call oInst.AddProperty("$MPElement[Name='Microsoft.Dynamics.AX.Management.Pack.DynamicsServer.Instance']/DBOraclePort$", CStr(strOraclePort))
Call oInst.AddProperty("$MPElement[Name='Microsoft.Dynamics.AX.Management.Pack.DynamicsServer.Instance']/DBOracleSchema$", CStr(strOracleSchema))
Call oInst.AddProperty("$MPElement[Name='Microsoft.Dynamics.AX.Management.Pack.DynamicsServer.Instance']/DBOracleTNS$", CStr(strOracleTnsName))
Call oInst.AddProperty("$MPElement[Name='Microsoft.Dynamics.AX.Management.Pack.DynamicsServer.Instance']/DatabaseName$", CStr(strDatabase))
Call oInst.AddProperty("$MPElement[Name='Microsoft.Dynamics.AX.Management.Pack.DynamicsServer.Instance']/DBMachineName$", CStr(strDBServerMachineName))
Call oInst.AddProperty("$MPElement[Name='Microsoft.Dynamics.AX.Management.Pack.DynamicsServer.Instance']/Port$", CStr(strPort))
Call oInst.AddProperty("$MPElement[Name='Microsoft.Dynamics.AX.Management.Pack.DynamicsServer.Instance']/SessionStartDate$", CStr(strSessionStartDate))
Call oInst.AddProperty("$MPElement[Name='Microsoft.Dynamics.AX.Management.Pack.DynamicsServer.Instance']/IsBatchServer$", CStr(strIsBatchServer))
Call oInst.AddProperty("$MPElement[Name='Microsoft.Dynamics.AX.Management.Pack.DynamicsServer.Instance']/SessionStatus$", strSessionStatus)
Call oInst.AddProperty("$MPElement[Name='Microsoft.Dynamics.AX.Management.Pack.DynamicsServer.Instance']/MaxSessions$", CStr(intMaxSessions))
Call oInst.AddProperty("$MPElement[Name='Microsoft.Dynamics.AX.Management.Pack.DynamicsServer.Instance']/ServiceName$", strServiceName)
Call oInst.AddProperty("$MPElement[Name='Microsoft.Dynamics.AX.Management.Pack.DynamicsServer.Instance']/AosExeVersion$", strAOSExeVersion)
Call oInst.AddProperty("$MPElement[Name='Microsoft.Dynamics.AX.Management.Pack.DynamicsServer.Instance']/AosServerName$", Ucase("$Target/Host/Property[Type='Windows!Microsoft.Windows.Computer']/NetbiosComputerName$"))

Call oInst.AddProperty("$MPElement[Name='System!System.Entity']/DisplayName$", CStr(strInstanceName) )

Dim strAOSIDName, strAOSServerID, strAOSBatchID
strAOSIDName = Ucase("$Target/Host/Property[Type='Windows!Microsoft.Windows.Computer']/NetbiosComputerName$") &amp; "@" &amp; strPort

recordset.Source = "select " &amp; strSchema &amp; "SYSSERVERSESSIONS.AOSID, " &amp; _
strSchema &amp; "SYSSERVERSESSIONS.SERVERID " &amp; _
"FROM " &amp; strSchema &amp; "SYSSERVERSESSIONS " &amp; _
"WHERE " &amp; strSchema &amp; "SYSSERVERSESSIONS.AOSID = '" &amp; strAOSIDName &amp; "'"

Err.Clear
recordset.Open

If Err.number = 0 Then
strAOSServerID = recordset(1)
End If

recordset.Close

strAOSBatchID = CStr(strInstanceId) &amp; "@" &amp; Ucase("$Target/Host/Property[Type='Windows!Microsoft.Windows.Computer']/NetbiosComputerName$")

' Collect Batch Task info
recordset.Source = "SELECT " &amp; strSchema &amp; "BATCH.CAPTION, " &amp; _
strSchema &amp; "BATCH.SERVERID, " &amp; _
strSchema &amp; "BATCH.EXECUTEDBY, " &amp; _
strSchema &amp; "BATCH.COMPANY, " &amp; _
strSchema &amp; "BATCH.STATUS, " &amp; _
strSchema &amp; "BATCH.STARTDATETIME, " &amp; _
strSchema &amp; "BATCH.RECID, " &amp; _
strSchema &amp; "BATCH.RUNTYPE, " &amp; _
strSchema &amp; "BATCH.BATCHJOBID, " &amp; _
strSchema &amp; "BATCHJOB.CAPTION " &amp; _
"FROM " &amp; strSchema &amp; "BATCH, " &amp; strSchema &amp; "BATCHJOB " &amp; _
"WHERE " &amp; strSchema &amp; "BATCH.BATCHJOBID = " &amp; strSchema &amp; "BATCHJOB.RECID " &amp; _
"AND " &amp; strSchema &amp; "BATCH.SERVERID = '" &amp; strAOSBatchID &amp; "'" &amp; _
"AND (" &amp; strSchema &amp; "BATCH.STATUS = 0 " &amp; _
"OR " &amp; strSchema &amp; "BATCH.STATUS = 2 " &amp; _
"OR " &amp; strSchema &amp; "BATCH.STATUS = 3 " &amp; _
"OR " &amp; strSchema &amp; "BATCH.STATUS = 7 " &amp; _
"OR " &amp; strSchema &amp; "BATCH.STATUS = 8)"

recordset.Open
If Err.number = 0 Then
Do While Not recordset.EOF
Dim strBatchName, strBatchServerID, strBatchExecutedBy, strBatchCompany, intBatchStatus, strBatchStatus
Dim strBatchJobID, strBatchStartDateTime, strBatchID, intBatchRunType, strBatchRunType, strBatchJobCaption

strBatchName = recordset(0) 'BATCH.CAPTION
strBatchServerID = recordset(1) 'BATCH.SERVERID
strBatchExecutedBy = recordset(2) 'BATCH.EXECUTEDBY
strBatchCompany = recordset(3) 'BATCH.COMPANY
intBatchStatus = recordset(4) 'BATCH.STATUS

intBatchStatus = CInt(intBatchStatus)
GetBatchStatusString intBatchStatus, strBatchStatus

strBatchStartDateTime = recordset(5) 'BATCH.STARTDATETIME
strBatchID = recordset(6) 'BATCH.RECID
intBatchRunType = recordset(7) 'BATCH.RUNTYPE

GetRunTypeString intBatchRunType, strBatchRunType

strBatchJobID = recordset(8) 'BATCH.BATCHJOBID
strBatchJobCaption = recordset(9) 'BATCHJOB.CAPTION

'convert date to "1/1/1900 12:00:00 AM" format
FormatDate strBatchStartDateTime

Dim oBatchInst
Set oBatchInst = oDiscoveryData.CreateClassInstance("$MPElement[Name='Microsoft.Dynamics.AX.Management.Pack.DynamicsServer.Instance.User.Job.Batch']$")
Call oBatchInst.AddProperty("$MPElement[Name='Windows!Microsoft.Windows.Computer']/PrincipalName$", TargetComputer)
Call oBatchInst.AddProperty("$MPElement[Name='Microsoft.Dynamics.AX.Management.Pack.DynamicsServer.Instance']/ID$", CStr(strInstanceId) )

Call oBatchInst.AddProperty("$MPElement[Name='Microsoft.Dynamics.AX.Management.Pack.DynamicsServer.Instance.User.Job.Batch']/BatchID$", strBatchId )
Call oBatchInst.AddProperty("$MPElement[Name='Microsoft.Dynamics.AX.Management.Pack.DynamicsServer.Instance.User.Job.Batch']/BatchName$", strBatchName )
Call oBatchInst.AddProperty("$MPElement[Name='Microsoft.Dynamics.AX.Management.Pack.DynamicsServer.Instance.User.Job.Batch']/BatchRunType$", strBatchRunType )
Call oBatchInst.AddProperty("$MPElement[Name='Microsoft.Dynamics.AX.Management.Pack.DynamicsServer.Instance.User.Job.Batch']/BatchStartDT$", strBatchStartDateTime )
Call oBatchInst.AddProperty("$MPElement[Name='Microsoft.Dynamics.AX.Management.Pack.DynamicsServer.Instance.User.Job.Batch']/Company$", strBatchCompany )
Call oBatchInst.AddProperty("$MPElement[Name='Microsoft.Dynamics.AX.Management.Pack.DynamicsServer.Instance.User.Job.Batch']/BatchAOS$", "$Target/Host/Property[Type='Windows!Microsoft.Windows.Computer']/NetbiosComputerName$" &amp; "/" &amp; strInstanceName &amp; " (" &amp; strInstanceId &amp; ")" )
Call oBatchInst.AddProperty("$MPElement[Name='Microsoft.Dynamics.AX.Management.Pack.DynamicsServer.Instance.User.Job.Batch']/ExecutedBy$", CStr(strBatchExecutedBy) )
Call oBatchInst.AddProperty("$MPElement[Name='Microsoft.Dynamics.AX.Management.Pack.DynamicsServer.Instance.User.Job.Batch']/Status$", CStr(strBatchStatus) )
Call oBatchInst.AddProperty("$MPElement[Name='Microsoft.Dynamics.AX.Management.Pack.DynamicsServer.Instance.User.Job.Batch']/BatchJobID$", CStr(strBatchJobID) )
Call oBatchInst.AddProperty("$MPElement[Name='Microsoft.Dynamics.AX.Management.Pack.DynamicsServer.Instance.User.Job.Batch']/BatchJobName$", CStr(strBatchJobCaption) )

Call oBatchInst.AddProperty("$MPElement[Name='System!System.Entity']/DisplayName$", strBatchName )
Call oDiscoveryData.AddInstance(oBatchInst)

recordset.MoveNext

Loop ' Batch Tasks
End If

recordset.Close

recordset.Source = "SELECT " &amp; strSchema &amp; "SYSCLIENTSESSIONS.USERID, " &amp; _
strSchema &amp; "SYSCLIENTSESSIONS.CLIENTTYPE, " &amp; _
strSchema &amp; "SYSCLIENTSESSIONS.STATUS, " &amp; _
strSchema &amp; "SYSCLIENTSESSIONS.SID, " &amp; _
strSchema &amp; "SYSCLIENTSESSIONS.LOGINDATETIME, " &amp; _
strSchema &amp; "SYSCLIENTSESSIONS.SESSIONID, " &amp; _
strSchema &amp; "SYSCLIENTSESSIONS.CLIENTCOMPUTER, " &amp; _
strSchema &amp; "USERINFO.NAME, " &amp; _
strSchema &amp; "USERINFO.RECID, " &amp; _
strSchema &amp; "USERINFO.NETWORKDOMAIN, " &amp; _
strSchema &amp; "USERINFO.NETWORKALIAS, " &amp; _
strSchema &amp; "BATCHJOB.CAPTION, " &amp; _
strSchema &amp; "BATCHJOB.STATUS, " &amp; _
strSchema &amp; "BATCHJOB.ORIGSTARTDATETIME, " &amp; _
strSchema &amp; "BATCHJOB.STARTDATETIME, " &amp; _
strSchema &amp; "BATCHJOB.CREATEDBY, " &amp; _
strSchema &amp; "BATCHJOB.COMPANY, " &amp; _
strSchema &amp; "BATCHJOB.RECID " &amp; _
"FROM " &amp; strSchema &amp; "SYSCLIENTSESSIONS INNER JOIN " &amp; strSchema &amp; "USERINFO " &amp; _
"ON " &amp; strSchema &amp; "SYSCLIENTSESSIONS.USERID = " &amp; strSchema &amp; "USERINFO.ID " &amp; _
"LEFT OUTER JOIN " &amp; strSchema &amp; "BATCHJOB " &amp; _
"ON " &amp; strSchema &amp; "USERINFO.ID = " &amp; strSchema &amp; "BATCHJOB.CREATEDBY " &amp; _
"WHERE " &amp; strSchema &amp; "SYSCLIENTSESSIONS.STATUS != 0" &amp; _
" AND " &amp; strSchema &amp; "SYSCLIENTSESSIONS.SERVERID = " &amp; strAOSServerID &amp; _
" ORDER BY " &amp; strSchema &amp; "SYSCLIENTSESSIONS.USERID, " &amp; strSchema &amp; "SYSCLIENTSESSIONS.SESSIONID"

Dim intActiveSessionCount
intActiveSessionCount = 0

Err.Clear
recordset.Open

If Err.number = 0 Then

Dim intLastUserId
Dim intCurSession
intLastUserId = ""
intCurSession = -1

Do While Not recordset.EOF

Dim strUserId, intUserId, strUserName, strClientType, strSessionState, strLoginDate, _
strSessionId, strSID, strRecId, intClientType, intSessionState, strClientComp, strUserNetworkName, strTemp

strUserId = recordset(0) ' USERID
intClientType = CInt(recordset(1)) ' ClientType
intSessionState= CInt(recordset(2)) ' STATUS
strSID = recordset(3) ' SID
strLoginDate = recordset(4) ' LOGINDATETIME
strSessionId = recordset(5) ' SESSIONID
strClientComp = recordset(6) ' CLIENTCOMPUTER
strUserName = recordset(7) ' NAME
strRecId = recordset(8) ' RECID
strUserNetworkName = recordset(9) &amp; "\" &amp; recordset(10) ' NETWORKDOMAIN\NETWORKALIAS

GetClientTypeString intClientType, strClientType
GetClientSessionStatusString intSessionState, strSessionState

' Get rid of the weird 0x02 bug
If strDBServerType &lt;&gt; "odbc" Then
strTemp = chr(2)
If strUserName = strTemp Then
strUserName = ""
End If
End If

If (len(intLastUserId) = 0) Or (intLastUserId &lt;&gt; strUserId) or ((intLastUserId = strUserId) and (Cint(strSessionId) &lt;&gt; intCurSession)) Then

Dim oUserInst
Set oUserInst = oDiscoveryData.CreateClassInstance("$MPElement[Name='Microsoft.Dynamics.AX.Management.Pack.DynamicsServer.Instance.User']$")
Call oUserInst.AddProperty("$MPElement[Name='Windows!Microsoft.Windows.Computer']/PrincipalName$", TargetComputer)
Call oUserInst.AddProperty("$MPElement[Name='Microsoft.Dynamics.AX.Management.Pack.DynamicsServer.Instance']/ID$", CStr(strInstanceId) )
Call oUserInst.AddProperty("$MPElement[Name='Microsoft.Dynamics.AX.Management.Pack.DynamicsServer.Instance.User']/UserID$", strUserId)
Call oUserInst.AddProperty("$MPElement[Name='Microsoft.Dynamics.AX.Management.Pack.DynamicsServer.Instance.User']/UserName$", strUserName )
Call oUserInst.AddProperty("$MPElement[Name='Microsoft.Dynamics.AX.Management.Pack.DynamicsServer.Instance.User']/UserSessionType$", strClientType )
Call oUserInst.AddProperty("$MPElement[Name='Microsoft.Dynamics.AX.Management.Pack.DynamicsServer.Instance.User']/UserSessionState$", strSessionState )
Call oUserInst.AddProperty("$MPElement[Name='Microsoft.Dynamics.AX.Management.Pack.DynamicsServer.Instance.User']/UserLoginDate$", strLoginDate )
Call oUserInst.AddProperty("$MPElement[Name='Microsoft.Dynamics.AX.Management.Pack.DynamicsServer.Instance.User']/UserSessionId$", strSessionId )
Call oUserInst.AddProperty("$MPElement[Name='Microsoft.Dynamics.AX.Management.Pack.DynamicsServer.Instance.User']/UserSID$", strSID)
Call oUserInst.AddProperty("$MPElement[Name='Microsoft.Dynamics.AX.Management.Pack.DynamicsServer.Instance.User']/NetworkName$", strUserNetworkName)
Call oUserInst.AddProperty("$MPElement[Name='System!System.Entity']/DisplayName$", strClientComp &amp; "\" &amp; strUserId )
Call oDiscoveryData.AddInstance(oUserInst)

If intSessionState = 1 Then
intActiveSessionCount = intActiveSessionCount + 1
End If

End If

intCurSession = CInt(strSessionId)
intUserId = CInt(strUserId)

If (len(intLastUserId) = 0) Or (intLastUserId &lt;&gt; strUserId) Then
intLastUserId = strUserId
'Now we scan for all the batch jobs made by this user; they will all have the same session id

Dim intSession
intSession = intCurSession

Do While (Not recordset.EOF) AND (intCurSession = intSession)
Dim strJobName, strJobStatus, intJobStatus, strJobStartDT, strJobCreateBy, strJobId, strJobActDT, strCompany

strJobName = recordset(11)
if (strJobName &lt;&gt; "null") then
intJobStatus = CInt(recordset(12))
strJobStartDT = recordset(13)
strJobActDT = recordset(14)
strJobCreateBy = recordset(15)
strCompany = recordset(16)
strJobId = recordset(17)

if ( (intJobStatus = 0) OR (intJobStatus = 2) OR (intJobStatus = 3) OR (intJobStatus = 7) OR (intJobStatus = 8 )) Then

GetBatchStatusString intJobStatus, strJobStatus

'convert date to "1/1/1900 12:00:00 AM" format
FormatDate strJobActDT

Dim oJobInst
Set oJobInst = oDiscoveryData.CreateClassInstance("$MPElement[Name='Microsoft.Dynamics.AX.Management.Pack.DynamicsServer.Instance.User.Job']$")
Call oJobInst.AddProperty("$MPElement[Name='Windows!Microsoft.Windows.Computer']/PrincipalName$", TargetComputer)
Call oJobInst.AddProperty("$MPElement[Name='Microsoft.Dynamics.AX.Management.Pack.DynamicsServer.Instance']/ID$", CStr(strInstanceId) )
Call oJobInst.AddProperty("$MPElement[Name='Microsoft.Dynamics.AX.Management.Pack.DynamicsServer.Instance.User']/UserSessionId$", strSessionId )

Call oJobInst.AddProperty("$MPElement[Name='Microsoft.Dynamics.AX.Management.Pack.DynamicsServer.Instance.User.Job']/JobID$", strJobId )
Call oJobInst.AddProperty("$MPElement[Name='Microsoft.Dynamics.AX.Management.Pack.DynamicsServer.Instance.User.Job']/JobName$", strJobName )
Call oJobInst.AddProperty("$MPElement[Name='Microsoft.Dynamics.AX.Management.Pack.DynamicsServer.Instance.User.Job']/JobStatus$", strJobStatus )
Call oJobInst.AddProperty("$MPElement[Name='Microsoft.Dynamics.AX.Management.Pack.DynamicsServer.Instance.User.Job']/JobActDT$", strJobActDT )
Call oJobInst.AddProperty("$MPElement[Name='Microsoft.Dynamics.AX.Management.Pack.DynamicsServer.Instance.User.Job']/JobStartDT$", strJobStartDT )
Call oJobInst.AddProperty("$MPElement[Name='Microsoft.Dynamics.AX.Management.Pack.DynamicsServer.Instance.User.Job']/JobCreateBy$", strJobCreateBy )
Call oJobInst.AddProperty("$MPElement[Name='Microsoft.Dynamics.AX.Management.Pack.DynamicsServer.Instance.User.Job']/Company$", strCompany )

Call oJobInst.AddProperty("$MPElement[Name='System!System.Entity']/DisplayName$", strJobName )
Call oDiscoveryData.AddInstance(oJobInst)
End If
End If

recordset.MoveNext
if (Not recordset.EOF) then
intSession = CInt(recordset(5))
end if

Loop ' Recording batch jobs
Else
recordset.MoveNext
End If
Loop ' User

Call oInst.AddProperty("$MPElement[Name='Microsoft.Dynamics.AX.Management.Pack.DynamicsServer.Instance']/ActiveSessions$", CStr(intActiveSessionCount))


End If ' Error check

Call oDiscoveryData.AddInstance(oInst)


recordset.Close

cnADOConnection.Close
Next 'instance


End If

' Return data to the datasource.
Call oAPI.Return(oDiscoveryData)


Sub FormatDate(strDT)
If (strDT = "1/1/1900") Then
strDT = "1/1/1900 12:00:00 AM"
End If
End Sub

Sub GetSessionStatusString(intSessionStatus, strSessionStatus)
'0 - Dead
'1 - Alive
'2 - Draining
If intSessionStatus = 0 Then
strSessionStatus = "Dead"
Else If intSessionStatus = 1 Then
strSessionStatus = "Alive"
Else If intSessionStatus = 2 Then
strSessionStatus = "Draining"
Else
strSessionStatus = intSessionStatus
End If
End If
End If
End Sub

Sub GetClientSessionStatusString(intSessionStatus, strSessionStatus)
' 0 - Inactive
' 1 - Running
' 2 - Ending - Waiting for AOS
' 3 - Ending &#x2013; Blocked

If intSessionStatus = 0 Then
strSessionStatus = "Inactive"
Else If intSessionStatus = 1 Then
strSessionStatus = "Running"
Else If intSessionStatus = 2 Then
strSessionStatus = "Ending - Waiting for AOS"
Else If intSessionStatus = 2 Then
strSessionStatus = "Ending &#x2013; Blocked"
End If
End If
End If
End If
End Sub



Sub GetClientTypeString(intSessionType, strSessionType)
' 0 - User
' 1 - Business Connector
' 3 - Worker
' 5 - Web User

Select Case intSessionType
case 0
strSessionType = "User"
case 1
strSessionType = "Business Connector"
case 3
strSessionType = "Worker"
case 5
strSessionType = "Web User"
End Select

End Sub

Sub GetBatchStatusString(intBatchStatus, strBatchStatus)

Select Case intBatchStatus
Case 0
strBatchStatus = "Hold"
Case 1
strBatchStatus = "Waiting"
Case 2
strBatchStatus = "Executing"
Case 3
strBatchStatus = "Error"
Case 4
strBatchStatus = "Finished"
Case 5
strBatchStatus = "Ready"
Case 6
strBatchStatus = "NotRun"
Case 7
strBatchStatus = "Cancelling"
Case 8
strBatchStatus = "Canceled"
End Select

End Sub


Sub GetRunTypeString(intRunType, strRunType)
' 0 - Client
' 1 - Server
If intRunType = 1 Then
strRunType = "Server"
Else
strRunType = "Client"
End If

End Sub

Sub WriteLog(FileName, strMSG)
Dim FileSystemObject, Text, FolderName
Set FileSystemObject = CreateObject("Scripting.FileSystemObject")
FolderName = "SCOM LOG"
' If Not FileSystemObject.FolderExists("c:\" &amp; FolderName) Then
' Set Fldr = FileSystemObject.CreateFolder ("c:\" &amp; FolderName)
' End If

' Set Text = FileSystemObject.OpenTextFile("c:\" &amp; FolderName &amp; "\" &amp; FileName, 8, True)
' Text.WriteLine strMSG
' Text.Close
End Sub

Sub GetLogFileName(FileName)
FileName = Day(Now) &amp; "." &amp; Hour(Now) &amp; "." &amp; Minute(Now) &amp; "." &amp; Second(Now)&amp; ".txt"
End Sub
</Script></ScriptBody>
<TimeoutSeconds>240</TimeoutSeconds>
</DataSource>
</Discovery>