<ManagementPack ContentReadable="true" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <Manifest>
    <Identity>
      <ID>Demo.StoreApp</ID>
      <Version>1.1.1.24</Version>
    </Identity>
    <Name>Demo.Stores</Name>
    <References>
      <Reference Alias="SQL">
        <ID>Microsoft.SQLServer.Library</ID>
        <Version>6.0.6460.0</Version>
        <PublicKeyToken>31bf3856ad364e35</PublicKeyToken>
      </Reference>
      <Reference Alias="SCDW">
        <ID>Microsoft.SystemCenter.DataWarehouse.Library</ID>
        <Version>6.1.7043.0</Version>
        <PublicKeyToken>31bf3856ad364e35</PublicKeyToken>
      </Reference>
      <Reference Alias="SC">
        <ID>Microsoft.SystemCenter.Library</ID>
        <Version>6.1.7043.0</Version>
        <PublicKeyToken>31bf3856ad364e35</PublicKeyToken>
      </Reference>
      <Reference Alias="Process">
        <ID>Microsoft.SystemCenter.ProcessMonitoring.Library</ID>
        <Version>6.1.7043.0</Version>
        <PublicKeyToken>31bf3856ad364e35</PublicKeyToken>
      </Reference>
      <Reference Alias="Windows">
        <ID>Microsoft.Windows.Library</ID>
        <Version>6.1.7043.0</Version>
        <PublicKeyToken>31bf3856ad364e35</PublicKeyToken>
      </Reference>
      <Reference Alias="Health">
        <ID>System.Health.Library</ID>
        <Version>6.1.7043.0</Version>
        <PublicKeyToken>31bf3856ad364e35</PublicKeyToken>
      </Reference>
      <Reference Alias="System">
        <ID>System.Library</ID>
        <Version>6.1.7043.0</Version>
        <PublicKeyToken>31bf3856ad364e35</PublicKeyToken>
      </Reference>
      <Reference Alias="Performance">
        <ID>System.Performance.Library</ID>
        <Version>6.1.7043.0</Version>
        <PublicKeyToken>31bf3856ad364e35</PublicKeyToken>
      </Reference>
    </References>
  </Manifest>
  <TypeDefinitions>
    <EntityTypes>
      <ClassTypes>
        <ClassType ID="Demo.StoreApp.Application" Accessibility="Public" Abstract="false" Base="System!System.Service" Hosted="false" Singleton="true" />
        <ClassType ID="Demo.StoreApp.Central" Accessibility="Public" Abstract="false" Base="System!System.ApplicationComponent" Hosted="false" Singleton="true" />
        <ClassType ID="Demo.StoreApp.CentralQueue" Accessibility="Public" Abstract="false" Base="Windows!Microsoft.Windows.ApplicationComponent" Hosted="true" Singleton="false">
          <Property ID="StoreCode" Type="string" Key="true" CaseSensitive="false" Length="256" MinLength="0" />
          <Property ID="FolderPath" Type="string" Key="false" CaseSensitive="false" Length="256" MinLength="0" />
        </ClassType>
        <ClassType ID="Demo.StoreApp.ComputerRole" Accessibility="Public" Abstract="true" Base="Windows!Microsoft.Windows.ComputerRole" Hosted="true" Singleton="false">
          <Property ID="StoreCode" Type="string" Key="false" CaseSensitive="false" Length="256" MinLength="0" />
        </ClassType>
        <ClassType ID="Demo.StoreApp.ComputerRole.CentralServer" Accessibility="Public" Abstract="false" Base="Demo.StoreApp.ComputerRole" Hosted="true" Singleton="false">
          <Property ID="QueuePath" Type="string" Key="false" CaseSensitive="false" Length="256" MinLength="0" />
          <Property ID="DatabaseServer" Type="string" Key="false" CaseSensitive="false" Length="256" MinLength="0" />
          <Property ID="DatabaseName" Type="string" Key="false" CaseSensitive="false" Length="256" MinLength="0" />
        </ClassType>
        <ClassType ID="Demo.StoreApp.ComputerRole.StoreClient" Accessibility="Public" Abstract="false" Base="Demo.StoreApp.ComputerRole" Hosted="true" Singleton="false" />
        <ClassType ID="Demo.StoreApp.ComputerRole.StoreServer" Accessibility="Public" Abstract="false" Base="Demo.StoreApp.ComputerRole" Hosted="true" Singleton="false" />
        <ClassType ID="Demo.StoreApp.Store" Accessibility="Public" Abstract="false" Base="System!System.ApplicationComponent" Hosted="false" Singleton="false">
          <Property ID="StoreCode" Type="string" Key="true" CaseSensitive="false" Length="256" MinLength="0" />
        </ClassType>
        <ClassType ID="Demo.StoreApp.Stores" Accessibility="Public" Abstract="false" Base="System!System.ApplicationComponent" Hosted="false" Singleton="true" />
      </ClassTypes>
      <RelationshipTypes>
        <RelationshipType ID="Demo.StoreApp.ApplicationContainsCentral" Accessibility="Internal" Abstract="false" Base="System!System.Containment">
          <Source>Demo.StoreApp.Application</Source>
          <Target>Demo.StoreApp.Central</Target>
        </RelationshipType>
        <RelationshipType ID="Demo.StoreApp.ApplicationContainsStores" Accessibility="Internal" Abstract="false" Base="System!System.Containment">
          <Source>Demo.StoreApp.Application</Source>
          <Target>Demo.StoreApp.Stores</Target>
        </RelationshipType>
        <RelationshipType ID="Demo.StoreApp.CentralContainsCentralServer" Accessibility="Internal" Abstract="false" Base="System!System.Containment">
          <Source>Demo.StoreApp.Central</Source>
          <Target>Demo.StoreApp.ComputerRole.CentralServer</Target>
        </RelationshipType>
        <RelationshipType ID="Demo.StoreApp.CentralContainsSQLDatabase" Accessibility="Internal" Abstract="false" Base="System!System.Containment">
          <Source>Demo.StoreApp.Central</Source>
          <Target>SQL!Microsoft.SQLServer.Database</Target>
        </RelationshipType>
        <RelationshipType ID="Demo.StoreApp.ComputerRole.CentralServerHostsCentralQueue" Accessibility="Internal" Abstract="false" Base="System!System.Hosting">
          <Source>Demo.StoreApp.ComputerRole.CentralServer</Source>
          <Target>Demo.StoreApp.CentralQueue</Target>
        </RelationshipType>
        <RelationshipType ID="Demo.StoreApp.StoreContainsClients" Accessibility="Internal" Abstract="false" Base="System!System.Containment">
          <Source>Demo.StoreApp.Store</Source>
          <Target>Demo.StoreApp.ComputerRole.StoreClient</Target>
        </RelationshipType>
        <RelationshipType ID="Demo.StoreApp.StoreContainsStoreServer" Accessibility="Internal" Abstract="false" Base="System!System.Containment">
          <Source>Demo.StoreApp.Store</Source>
          <Target>Demo.StoreApp.ComputerRole.StoreServer</Target>
        </RelationshipType>
        <RelationshipType ID="Demo.StoreApp.StoresContainsStore" Accessibility="Internal" Abstract="false" Base="System!System.Containment">
          <Source>Demo.StoreApp.Stores</Source>
          <Target>Demo.StoreApp.Store</Target>
        </RelationshipType>
      </RelationshipTypes>
    </EntityTypes>
    <ModuleTypes>
      <DataSourceModuleType ID="Demo.StoreApp.DataSource.DiscoverStore" Accessibility="Internal" Batching="false">
        <Configuration>
          <xsd:element minOccurs="1" name="IntervalSeconds" type="xsd:integer" />
          <xsd:element minOccurs="1" name="ComputerName" type="xsd:string" />
          <xsd:element minOccurs="1" name="StoreCode" type="xsd:string" />
          <xsd:element minOccurs="1" name="ServerOrClient" type="xsd:string" />
          <xsd:element minOccurs="1" name="Debug" type="xsd:boolean" />
        </Configuration>
        <OverrideableParameters>
          <OverrideableParameter ID="IntervalSeconds" Selector="$Config/IntervalSeconds$" ParameterType="int" />
          <OverrideableParameter ID="Debug" Selector="$Config/Debug$" ParameterType="bool" />
        </OverrideableParameters>
        <ModuleImplementation Isolation="Any">
          <Composite>
            <MemberModules>
              <DataSource ID="Script" TypeID="Windows!Microsoft.Windows.TimedScript.DiscoveryProvider">
                <IntervalSeconds>$Config/IntervalSeconds$</IntervalSeconds>
                <SyncTime />
                <ScriptName>DiscoverStoreRelationships.vbs</ScriptName>
                <Arguments>$MPElement$ $Target/Id$ $Config/ComputerName$ $Config/StoreCode$ $Config/ServerOrClient$ $Config/Debug$</Arguments>
                <ScriptBody><![CDATA[
'==================================================================================
' Script: 	DiscoverStore.vbs
' Date:		4/27/09	
' Author: 	Brian Wren, Microsoft Consulting Services
' Purpose:	Discovers Store class and relationship with Store Server and Client Servers for StoreApp sample application
'==================================================================================

'Constants used for event logging
Const SCRIPT_NAME					= "DiscoverStore.vbs"
Const EVENT_LEVEL_ERROR	 	= 1
Const EVENT_LEVEL_WARNING 	= 2
Const EVENT_LEVEL_INFO 			= 4

Const SCRIPT_STARTED				= 801
Const CLASS_CREATED				= 802
Const RELATIONSHIP_CREATED	= 803
Const SCRIPT_ENDED					= 805

'Setup variables sent in through script arguments
SourceId = WScript.Arguments(0) 				'GUID of discovery calling the script.  Provided by the MPElement variable.
ManagedEntityId = WScript.Arguments(1)			'GUID of target object.  Provided by the Target/Id variable.
sComputerName = WScript.Arguments(2)			'Name of the computer holding the Store Server or Store Client class.
sStoreCode = WScript.Arguments(3)				'StoreCode of the Store to create.  Taken from the registry of the target computer.
sServerOrClient = LCase(WScript.Arguments(4))	'String of "server" or "client" depending on which type of class is calling script.
bDebug = CBool(WScript.Arguments(5))			'If true, information events are loggged.


'Start by setting up API object and creating a discovery data object.
'Discovery data object requires the MPElement and Target/ID variables.  The first argument in the method is always 0.
Set oAPI = CreateObject("MOM.ScriptAPI")
Set oDiscoveryData = oAPI.CreateDiscoveryData(0, SourceId, ManagedEntityId)

'Log a message that script is starting only if Debug argument is True
sMessage =	"Script started" & VbCrLf & _
			"Source ID: " & SourceId & VbCrLf & _
			"Managed Entity ID: " & ManagedEntityId & VbCrLf & _
			"Computer Name: " & sComputerName & VbCrLf & _
			"Store Code: " & sStoreCode & VbCrLf & _
			"Server or Client: " & sServerOrClient
Call LogDebugEvent(SCRIPT_STARTED,sMessage)


'Create an instance of the store class and add it to the discovery data.
'The StoreCode property is required because it is the key property of the class.
Set oStoreInstance = oDiscoveryData.CreateClassInstance("$MPElement[Name='Demo.StoreApp.Store']$")
oStoreInstance.AddProperty "$MPElement[Name='Demo.StoreApp.Store']/StoreCode$", sStoreCode
oDiscoveryData.AddInstance(oStoreInstance)

sMessage =	"Created store class" & VbCrLf & _
			"Store Code: " & sStoreCode
Call LogDebugEvent(CLASS_CREATED,sMessage)

'Create an instance of the appropriate classes depending on whether a Store Server or Store Client is calling the script.
If sServerOrClient = "server" Then
	'Create a class instance of Store Server and a Relationship Instance of Store Contains Store Server.
	Set oComputerInstance = oDiscoveryData.CreateClassInstance("$MPElement[Name='Demo.StoreApp.ComputerRole.StoreServer']$")
	Set oRelationshipInstance = oDiscoveryData.CreateRelationshipInstance("$MPElement[Name='Demo.StoreApp.StoreContainsStoreServer']$")	
Else
	'Create a class instance of Store Client and a Relationship Instance of Store Contains Store Client.
	Set oComputerInstance = oDiscoveryData.CreateClassInstance("$MPElement[Name='Demo.StoreApp.ComputerRole.StoreClient']$")
	Set oRelationshipInstance = oDiscoveryData.CreateRelationshipInstance("$MPElement[Name='Demo.StoreApp.StoreContainsClients']$")	
End If


'Provide the PrincipalName property for the computer instance created above and add to the discovery data.
'This is required because both the Store Server and Store Client classes are based on Windows ComputerRole.
'	Windows ComputerRole is hosted by Windows Computer.
'	When creating a new instance of a class, we need to provide the key properties of that class and any hosting classes.
oComputerInstance.AddProperty "$MPElement[Name='Windows!Microsoft.Windows.Computer']/PrincipalName$", sComputerName
oDiscoveryData.AddInstance(oComputerInstance)

sMessage =	"Created computer role class" & VbCrLf & _
			"Computer Name: " & sComputerName
Call LogDebugEvent(CLASS_CREATED,sMessage)

'With the instance of Store and either Store Server or Store Client created, we can set the Source and Target of the relationship.
oRelationshipInstance.Source = oStoreInstance
oRelationshipInstance.Target = oComputerInstance
oDiscoveryData.AddInstance(oRelationshipInstance)

sMessage =	"Created relationship"
Call LogDebugEvent(RELATIONSHIP_CREATED,sMessage)

'Return the discovery data.
oAPI.Return(oDiscoveryData)

Call LogDebugEvent (SCRIPT_ENDED,"Script ended.")

'==================================================================================
' Sub:		LogDebugEvent
' Purpose:	Logs an informational event to the Operations Manager event log 
'			only if Debug argument is true
'==================================================================================
Sub LogDebugEvent(EventNo,Message)

	Message = VbCrLf & Message
	If bDebug = True Then
    	Call oAPI.LogScriptEvent(SCRIPT_NAME,EventNo,EVENT_LEVEL_INFO,Message)
	End If
	
End Sub  
]]></ScriptBody>
                <TimeoutSeconds>60</TimeoutSeconds>
              </DataSource>
            </MemberModules>
            <Composition>
              <Node ID="Script" />
            </Composition>
          </Composite>
        </ModuleImplementation>
        <OutputType>System!System.Discovery.Data</OutputType>
      </DataSourceModuleType>
      <DataSourceModuleType ID="Demo.StoreApp.DataSource.QueueStatistics" Accessibility="Public" Batching="false">
        <Configuration>
          <xsd:element minOccurs="1" name="IntervalSeconds" type="xsd:integer" />
          <xsd:element minOccurs="1" name="SyncTime" type="xsd:string" />
          <xsd:element minOccurs="1" name="TopFolder" type="xsd:string" />
          <xsd:element minOccurs="1" name="StoreCode" type="xsd:string" />
          <xsd:element minOccurs="1" name="Debug" type="xsd:boolean" />
        </Configuration>
        <OverrideableParameters>
          <OverrideableParameter ID="IntervalSeconds" Selector="$Config/IntervalSeconds$" ParameterType="int" />
          <OverrideableParameter ID="SyncTime" Selector="$Config/SyncTime$" ParameterType="string" />
          <OverrideableParameter ID="Debug" Selector="$Config/Debug$" ParameterType="bool" />
        </OverrideableParameters>
        <ModuleImplementation Isolation="Any">
          <Composite>
            <MemberModules>
              <DataSource ID="Script" TypeID="Windows!Microsoft.Windows.TimedScript.PropertyBagProvider">
                <IntervalSeconds>$Config/IntervalSeconds$</IntervalSeconds>
                <SyncTime>$Config/SyncTime$</SyncTime>
                <ScriptName>QueueStatistics.vbs</ScriptName>
                <Arguments>"$Config/TopFolder$" $Config/Debug$</Arguments>
                <ScriptBody><![CDATA[
'==================================================================================
' Script: 	QueueStatsCookdown.vbs
' Date:		4/27/09	
' Author: 	Brian Wren, Microsoft Consulting Services
' Purpose:	Collects statistics for the entire set of queue folders for StoreApp sample application.
'			Script supports cookdown because it doesn't require any arguments that will vary for each target instance.
'==================================================================================

'Constants used for event logging
Const SCRIPT_NAME			= "QueueStatsCookdown.vbs"
Const EVENT_LEVEL_ERROR 	= 1
Const EVENT_LEVEL_WARNING 	= 2
Const EVENT_LEVEL_INFO 		= 4

Const SCRIPT_STARTED		= 831
Const PROPERTYBAG_CREATED	= 832
Const SCRIPT_ENDED			= 835

'Setup variables sent in through script arguments
sTopFolder = WScript.Arguments(0)		'Path of the top level folder where queue folders are located.
bDebug = CBool(WScript.Arguments(1))	'If true, information events are loggged..

'Start by setting up API object.
Set oAPI = CreateObject("MOM.ScriptAPI")
sMessage =	"Top Folder: " & sTopFolder
Call LogDebugEvent(SCRIPT_STARTED,sMessage)

'Get the FileSystemObject and the top level folder.
Set fso = CreateObject("Scripting.FileSystemObject")
Set oFolder = fso.GetFolder(sTopFolder)

'Enumerate each folder under the top level.
For Each oSubFolder in oFolder.SubFolders
	
	'Create a property bag for each folder.
	Set oBag = oAPI.CreatePropertyBag()
	
	'Get the statistics we're interested in for the current subfolder.
	iCount = oSubFolder.Files.Count
	iSize = 0
	iOldestFile = 0
	For Each oFile In oSubFolder.Files
		iSize = iSize + oFile.Size
		iAgeInMinutes = DateDiff("n",oFile.DateCreated,Now)
		If iAgeInMinutes > iOldestFile Then
			iOldestFile = iAgeInMinutes
		End If
	Next 
	
	sMessage =	"Property bag created" & VbCrLf & _
				"StoreCode: " & oSubFolder.Name & VbCrLf & _
				"FileCount: " & iCount & VbCrLf & _
				"OldestFile: " & iOldestFile & VbCrLf & _
				"TotalSize: " & iSize
	Call LogDebugEvent(PROPERTYBAG_CREATED,sMessage)
	
	'Put the gathered statistics into the property bag.  
	'Includes a value for the folder name so that we can tell which folder the data is from.
	Call oBag.AddValue("StoreCode",oSubFolder.Name)
	Call oBag.AddValue("FileCount",iCount)
	Call oBag.AddValue("OldestFile",iOldestFile)
	Call oBag.AddValue("TotalSize",iSize)
	Call oAPI.AddItem(oBag)
Next

'Return all property bags.
oAPI.ReturnItems()

Call LogDebugEvent (SCRIPT_ENDED,"Script ended.")

'==================================================================================
' Sub:		LogDebugEvent
' Purpose:	Logs an informational event to the Operations Manager event log 
'			only if Debug argument is true
'==================================================================================
Sub LogDebugEvent(EventNo,Message)

	Message = VbCrLf & Message
	If bDebug = True Then
    	Call oAPI.LogScriptEvent(SCRIPT_NAME,EventNo,EVENT_LEVEL_INFO,Message)
	End If
	
End Sub   

]]></ScriptBody>
                <TimeoutSeconds>30</TimeoutSeconds>
              </DataSource>
              <ConditionDetection ID="FilterStoreCode" TypeID="System!System.ExpressionFilter">
                <Expression>
                  <SimpleExpression>
                    <ValueExpression>
                      <XPathQuery Type="String">Property[@Name='StoreCode']</XPathQuery>
                    </ValueExpression>
                    <Operator>Equal</Operator>
                    <ValueExpression>
                      <Value Type="String">$Config/StoreCode$</Value>
                    </ValueExpression>
                  </SimpleExpression>
                </Expression>
              </ConditionDetection>
            </MemberModules>
            <Composition>
              <Node ID="FilterStoreCode">
                <Node ID="Script" />
              </Node>
            </Composition>
          </Composite>
        </ModuleImplementation>
        <OutputType>System!System.PropertyBagData</OutputType>
      </DataSourceModuleType>
      <DataSourceModuleType ID="Demo.StoreApp.DataSource.QueueStatistics.PowerShell" Accessibility="Public" Batching="false">
        <Configuration>
          <IncludeSchemaTypes>
            <SchemaType>Windows!Microsoft.Windows.PowerShellSchema</SchemaType>
          </IncludeSchemaTypes>
          <xsd:element minOccurs="1" name="IntervalSeconds" type="xsd:integer" />
          <xsd:element minOccurs="1" name="SyncTime" type="xsd:string" />
          <xsd:element minOccurs="1" name="TopFolder" type="xsd:string" />
          <xsd:element minOccurs="1" name="StoreCode" type="xsd:string" />
          <xsd:element minOccurs="1" name="Debug" type="xsd:boolean" />
        </Configuration>
        <OverrideableParameters>
          <OverrideableParameter ID="IntervalSeconds" Selector="$Config/IntervalSeconds$" ParameterType="int" />
          <OverrideableParameter ID="SyncTime" Selector="$Config/SyncTime$" ParameterType="string" />
        </OverrideableParameters>
        <ModuleImplementation Isolation="Any">
          <Composite>
            <MemberModules>
              <DataSource ID="Script" TypeID="Demo.StoreApp.TimedPowerShell.PropertyBagProvider">
                <IntervalSeconds>$Config/IntervalSeconds$</IntervalSeconds>
                <SyncTime>$Config/SyncTime$</SyncTime>
                <ScriptName>QueueStats.ps1</ScriptName>
                <ScriptBody><![CDATA[
#==================================================================================
# Script: 	QueueStatsCookdown.ps1
# Date:		6/4/09	
# Author: 	Brian Wren, Microsoft Consulting Services
# Purpose:	Collects statistics for the entire set of queue folders for StoreApp sample application.
#			Script supports cookdown because it doesn't require any arguments that will vary for each target instance.
#==================================================================================

# Get the named parameters
param($topFolder,$debug)

#Constants used for event logging
$SCRIPT_NAME			= 'QueueStatsCookdown.vbs'
$EVENT_LEVEL_ERROR 		= 1
$VENT_LEVEL_WARNING 	= 2
$EVENT_LEVEL_INFO 		= 4

$SCRIPT_STARTED			= 831
$PROPERTYBAG_CREATED	= 832
$SCRIPT_ENDED			= 835

#==================================================================================
# Sub:		LogDebugEvent
# Purpose:	Logs an informational event to the Operations Manager event log 
#			only if Debug argument is true
#==================================================================================
function Log-DebugEvent
{
	param($eventNo,$message)

	$message = "`n" + $message
	if ($debug -eq $true)
	{
    	$api.LogScriptEvent($SCRIPT_NAME,$eventNo,$EVENT_LEVEL_INFO,$message)
	}
}

#Start by setting up API object.
$api = New-Object -comObject 'MOM.ScriptAPI'
$message =	'Top Folder: ' + $topFolder
Log-DebugEvent $SCRIPT_STARTED $message

#Enumerate all subfolders under the top level folder.
foreach ($folder in (Get-ChildItem -path $topFolder | where {$_.psIsContainer -eq $true}))
{

	#Get the statistics we're interested in for the current subfolder.
	$files = Get-ChildItem -Path $folder.FullName | where {$_.psIsContainer -eq $false}
	$count = $files.count
	$size = 0
	$oldestFile = 0
	foreach ($file in $files)
	{
		$size = $size + $file.Size
		$ageInMinutes = ((Get-Date) - ($file.creationTime)).TotalMinutes
		if ($ageInMinutes -gt $oldestFile)
		{
			$oldestFile = $ageInMinutes
		}
	}
	$message = $folder.name + ' ' + $count
	Log-DebugEvent $PROPERTYBAG_CREATED $message
	
	#Create a property bag for each folder.
	$bag = $api.CreatePropertyBag()
	
	#Put the gathered statistics into the property bag.  
	#Includes a value for the folder name so that we can tell which folder the data is from.
	$bag.AddValue('StoreCode',$folder.name)
	$bag.AddValue('FileCount',$count)
	$bag.AddValue('OldestFile',$oldestFile)
	$bag.AddValue('TotalSize',$size)
	
	#Return each property bag as we create and populate it.
	$bag
}
Log-DebugEvent $SCRIPT_ENDED 'Script ended.'
]]></ScriptBody>
                <SnapIns />
                <Parameters>
                  <Parameter>
                    <Name>topFolder</Name>
                    <Value>$Config/TopFolder$</Value>
                  </Parameter>
                  <Parameter>
                    <Name>debug</Name>
                    <Value>$Config/Debug$</Value>
                  </Parameter>
                </Parameters>
                <TimeoutSeconds>30</TimeoutSeconds>
              </DataSource>
              <ConditionDetection ID="FilterStoreCode" TypeID="System!System.ExpressionFilter">
                <Expression>
                  <SimpleExpression>
                    <ValueExpression>
                      <XPathQuery Type="String">Property[@Name='StoreCode']</XPathQuery>
                    </ValueExpression>
                    <Operator>Equal</Operator>
                    <ValueExpression>
                      <Value Type="String">$Config/StoreCode$</Value>
                    </ValueExpression>
                  </SimpleExpression>
                </Expression>
              </ConditionDetection>
            </MemberModules>
            <Composition>
              <Node ID="FilterStoreCode">
                <Node ID="Script" />
              </Node>
            </Composition>
          </Composite>
        </ModuleImplementation>
        <OutputType>System!System.PropertyBagData</OutputType>
      </DataSourceModuleType>
      <DataSourceModuleType ID="Demo.StoreApp.DataSource.RegistryRelationshipDiscoveryProvider" Accessibility="Public" Batching="false">
        <Configuration>
          <IncludeSchemaTypes>
            <SchemaType>Windows!Microsoft.Windows.RegistryAttributeDefinitionsSchema</SchemaType>
            <SchemaType>System!System.Discovery.MapperSchema</SchemaType>
          </IncludeSchemaTypes>
          <xsd:element name="ComputerName" type="xsd:string" />
          <xsd:element name="RegistryAttributeDefinitions" type="RegistryAttributeDefinitionsType" />
          <xsd:element name="Frequency" type="xsd:integer" />
          <xsd:element name="RelationshipId" type="xsd:string" />
          <xsd:element name="SourceTypeId" type="xsd:string" />
          <xsd:element name="SourceRoleSettings" minOccurs="0" maxOccurs="1" type="SettingsType" />
          <xsd:element name="TargetTypeId" type="xsd:string" />
          <xsd:element name="TargetRoleSettings" minOccurs="0" maxOccurs="1" type="SettingsType" />
        </Configuration>
        <OverrideableParameters>
          <OverrideableParameter ID="Frequency" Selector="$Config/Frequency$" ParameterType="int" />
        </OverrideableParameters>
        <ModuleImplementation Isolation="Any">
          <Composite>
            <MemberModules>
              <DataSource ID="DS" TypeID="Windows!Microsoft.Windows.Discovery.RegistryProvider">
                <ComputerName>$Config/ComputerName$</ComputerName>
                <RegistryAttributeDefinitions>$Config/RegistryAttributeDefinitions$</RegistryAttributeDefinitions>
                <Frequency>$Config/Frequency$</Frequency>
              </DataSource>
              <ConditionDetection ID="Mapping" TypeID="System!System.Discovery.RelationshipSnapshotDataMapper">
                <RelationshipId>$Config/RelationshipId$</RelationshipId>
                <SourceTypeId>$Config/SourceTypeId$</SourceTypeId>
                <TargetTypeId>$Config/TargetTypeId$</TargetTypeId>
                <SourceRoleSettings>$Config/SourceRoleSettings$</SourceRoleSettings>
                <TargetRoleSettings>$Config/TargetRoleSettings$</TargetRoleSettings>
              </ConditionDetection>
            </MemberModules>
            <Composition>
              <Node ID="Mapping">
                <Node ID="DS" />
              </Node>
            </Composition>
          </Composite>
        </ModuleImplementation>
        <OutputType>System!System.Discovery.Data</OutputType>
      </DataSourceModuleType>
      <DataSourceModuleType ID="Demo.StoreApp.TimedPowerShell.EventProvider" Accessibility="Public" Batching="false">
        <Configuration>
          <IncludeSchemaTypes>
            <SchemaType>System!System.ParamListSchema</SchemaType>
            <SchemaType>System!System.ExpressionEvaluatorSchema</SchemaType>
            <SchemaType>Windows!Microsoft.Windows.PowerShellSchema</SchemaType>
          </IncludeSchemaTypes>
          <xsd:element name="IntervalSeconds" type="xsd:int" />
          <xsd:element name="SyncTime" type="xsd:string" />
          <xsd:element name="ScriptName" type="NonNullString" />
          <xsd:element name="ScriptBody" type="NonNullString" />
          <xsd:element name="SnapIns" type="SnapInsType" minOccurs="0" maxOccurs="1" />
          <xsd:element name="Parameters" type="NamedParametersType" minOccurs="0" maxOccurs="1" />
          <xsd:element name="TimeoutSeconds" type="xsd:integer" />
          <xsd:element name="StrictErrorHandling" type="xsd:boolean" minOccurs="0" maxOccurs="1" />
          <xsd:element name="EventOriginId" type="xsd:string" />
          <xsd:element name="PublisherId" type="xsd:string" />
          <xsd:element name="PublisherName" type="xsd:string" />
          <xsd:element name="Channel" type="xsd:string" />
          <xsd:element name="LoggingComputer" type="xsd:string" />
          <xsd:element name="EventNumber" type="xsd:string" />
          <xsd:element name="EventCategory" type="xsd:string" />
          <xsd:element name="EventLevel" type="xsd:string" />
          <xsd:element name="UserName" type="xsd:string" />
          <xsd:element name="Description" type="xsd:string" minOccurs="0" maxOccurs="1" />
          <xsd:element name="Params" type="ParamListType" />
        </Configuration>
        <OverrideableParameters>
          <OverrideableParameter ID="IntervalSeconds" Selector="$Config/IntervalSeconds$" ParameterType="int" />
          <OverrideableParameter ID="SyncTime" Selector="$Config/SyncTime$" ParameterType="string" />
          <OverrideableParameter ID="TimeoutSeconds" Selector="$Config/TimeoutSeconds$" ParameterType="int" />
        </OverrideableParameters>
        <ModuleImplementation Isolation="Any">
          <Composite>
            <MemberModules>
              <DataSource ID="DS1" TypeID="Demo.StoreApp.TimedPowerShell.PropertyBagProvider">
                <IntervalSeconds>$Config/IntervalSeconds$</IntervalSeconds>
                <SyncTime>$Config/SyncTime$</SyncTime>
                <ScriptName>$Config/ScriptName$</ScriptName>
                <ScriptBody>$Config/ScriptBody$</ScriptBody>
                <SnapIns>$Config/SnapIns$</SnapIns>
                <Parameters>$Config/Parameters$</Parameters>
                <TimeoutSeconds>$Config/TimeoutSeconds$</TimeoutSeconds>
                <StrictErrorHandling>$Config/StrictErrorHandling$</StrictErrorHandling>
              </DataSource>
              <ConditionDetection ID="Mapper1" TypeID="System!System.Event.GenericDataMapper">
                <EventOriginId>$Config/EventOriginId$</EventOriginId>
                <PublisherId>$Config/PublisherId$</PublisherId>
                <PublisherName>$Config/PublisherName$</PublisherName>
                <Channel>$Config/Channel$</Channel>
                <LoggingComputer>$Config/LoggingComputer$</LoggingComputer>
                <EventNumber>$Config/EventNumber$</EventNumber>
                <EventCategory>$Config/EventCategory$</EventCategory>
                <EventLevel>$Config/EventLevel$</EventLevel>
                <UserName>$Config/UserName$</UserName>
                <Description>$Config/Description$</Description>
                <Params>$Config/Params$</Params>
              </ConditionDetection>
            </MemberModules>
            <Composition>
              <Node ID="Mapper1">
                <Node ID="DS1" />
              </Node>
            </Composition>
          </Composite>
        </ModuleImplementation>
        <OutputType>System!System.Event.Data</OutputType>
      </DataSourceModuleType>
      <DataSourceModuleType ID="Demo.StoreApp.TimedPowerShell.PerformanceProvider" Accessibility="Public" Batching="false">
        <Configuration>
          <IncludeSchemaTypes>
            <SchemaType>System!System.ParamListSchema</SchemaType>
            <SchemaType>System!System.ExpressionEvaluatorSchema</SchemaType>
            <SchemaType>Windows!Microsoft.Windows.PowerShellSchema</SchemaType>
          </IncludeSchemaTypes>
          <xsd:element name="IntervalSeconds" type="xsd:int" />
          <xsd:element name="SyncTime" type="xsd:string" />
          <xsd:element name="ScriptName" type="NonNullString" />
          <xsd:element name="ScriptBody" type="NonNullString" />
          <xsd:element name="SnapIns" type="SnapInsType" minOccurs="0" maxOccurs="1" />
          <xsd:element name="Parameters" type="NamedParametersType" minOccurs="0" maxOccurs="1" />
          <xsd:element name="TimeoutSeconds" type="xsd:integer" />
          <xsd:element name="StrictErrorHandling" type="xsd:boolean" minOccurs="0" maxOccurs="1" />
          <xsd:element name="ObjectName" type="xsd:string" />
          <xsd:element name="CounterName" type="xsd:string" />
          <xsd:element name="InstanceName" type="xsd:string" />
          <xsd:element name="Value" type="xsd:string" />
        </Configuration>
        <OverrideableParameters>
          <OverrideableParameter ID="IntervalSeconds" Selector="$Config/IntervalSeconds$" ParameterType="int" />
          <OverrideableParameter ID="SyncTime" Selector="$Config/SyncTime$" ParameterType="string" />
          <OverrideableParameter ID="TimeoutSeconds" Selector="$Config/TimeoutSeconds$" ParameterType="int" />
        </OverrideableParameters>
        <ModuleImplementation Isolation="Any">
          <Composite>
            <MemberModules>
              <DataSource ID="DS1" TypeID="Demo.StoreApp.TimedPowerShell.PropertyBagProvider">
                <IntervalSeconds>$Config/IntervalSeconds$</IntervalSeconds>
                <SyncTime>$Config/SyncTime$</SyncTime>
                <ScriptName>$Config/ScriptName$</ScriptName>
                <ScriptBody>$Config/ScriptBody$</ScriptBody>
                <SnapIns>$Config/SnapIns$</SnapIns>
                <Parameters>$Config/Parameters$</Parameters>
                <TimeoutSeconds>$Config/TimeoutSeconds$</TimeoutSeconds>
                <StrictErrorHandling>$Config/StrictErrorHandling$</StrictErrorHandling>
              </DataSource>
              <ConditionDetection ID="Mapper1" TypeID="Performance!System.Performance.DataGenericMapper">
                <ObjectName>$Config/ObjectName$</ObjectName>
                <CounterName>$Config/CounterName$</CounterName>
                <InstanceName>$Config/InstanceName$</InstanceName>
                <Value>$Config/Value$</Value>
              </ConditionDetection>
            </MemberModules>
            <Composition>
              <Node ID="Mapper1">
                <Node ID="DS1" />
              </Node>
            </Composition>
          </Composite>
        </ModuleImplementation>
        <OutputType>Performance!System.Performance.Data</OutputType>
      </DataSourceModuleType>
      <DataSourceModuleType ID="Demo.StoreApp.TimedPowerShell.PropertyBagProvider" Accessibility="Public" Batching="false">
        <Configuration>
          <IncludeSchemaTypes>
            <SchemaType>Windows!Microsoft.Windows.PowerShellSchema</SchemaType>
          </IncludeSchemaTypes>
          <xsd:element minOccurs="1" name="IntervalSeconds" type="xsd:integer" />
          <xsd:element minOccurs="1" name="SyncTime" type="xsd:string" />
          <xsd:element minOccurs="1" name="ScriptName" type="NonNullString" />
          <xsd:element minOccurs="1" name="ScriptBody" type="NonNullString" />
          <xsd:element minOccurs="1" name="SnapIns" type="SnapInsType" />
          <xsd:element minOccurs="1" name="Parameters" type="NamedParametersType" />
          <xsd:element minOccurs="1" name="TimeoutSeconds" type="xsd:integer" />
          <xsd:element minOccurs="0" maxOccurs="1" name="StrictErrorHandling" type="xsd:boolean" />
        </Configuration>
        <OverrideableParameters>
          <OverrideableParameter ID="IntervalSeconds" Selector="$Config/IntervalSeconds$" ParameterType="int" />
          <OverrideableParameter ID="SyncTime" Selector="$Config/SyncTime$" ParameterType="string" />
          <OverrideableParameter ID="TimeoutSeconds" Selector="$Config/TimeoutSeconds$" ParameterType="int" />
        </OverrideableParameters>
        <ModuleImplementation Isolation="Any">
          <Composite>
            <MemberModules>
              <DataSource ID="DS1" TypeID="System!System.SimpleScheduler">
                <IntervalSeconds>$Config/IntervalSeconds$</IntervalSeconds>
                <SyncTime>$Config/SyncTime$</SyncTime>
              </DataSource>
              <ProbeAction ID="PSScript" TypeID="Windows!Microsoft.Windows.PowerShellPropertyBagProbe">
                <ScriptName>$Config/ScriptName$</ScriptName>
                <ScriptBody>$Config/ScriptBody$</ScriptBody>
                <SnapIns>$Config/SnapIns$</SnapIns>
                <Parameters>$Config/Parameters$</Parameters>
                <TimeoutSeconds>$Config/TimeoutSeconds$</TimeoutSeconds>
                <StrictErrorHandling>$Config/StrictErrorHandling$</StrictErrorHandling>
              </ProbeAction>
            </MemberModules>
            <Composition>
              <Node ID="PSScript">
                <Node ID="DS1" />
              </Node>
            </Composition>
          </Composite>
        </ModuleImplementation>
        <OutputType>System!System.PropertyBagData</OutputType>
      </DataSourceModuleType>
    </ModuleTypes>
    <MonitorTypes>
      <UnitMonitorType ID="Demo.StoreApp.MonitorType.QueueLength" Accessibility="Internal">
        <MonitorTypeStates>
          <MonitorTypeState ID="OverErrorThreshold" NoDetection="false" />
          <MonitorTypeState ID="OverWarningThreshold" NoDetection="false" />
          <MonitorTypeState ID="UnderThreshold" NoDetection="false" />
        </MonitorTypeStates>
        <Configuration>
          <xsd:element minOccurs="1" name="IntervalSeconds" type="xsd:integer" />
          <xsd:element minOccurs="1" name="SyncTime" type="xsd:string" />
          <xsd:element minOccurs="1" name="TopFolder" type="xsd:string" />
          <xsd:element minOccurs="1" name="StoreCode" type="xsd:string" />
          <xsd:element minOccurs="1" name="WarningThreshold" type="xsd:integer" />
          <xsd:element minOccurs="1" name="ErrorThreshold" type="xsd:integer" />
          <xsd:element minOccurs="1" name="Debug" type="xsd:boolean" />
        </Configuration>
        <OverrideableParameters>
          <OverrideableParameter ID="IntervalSeconds" Selector="$Config/IntervalSeconds$" ParameterType="int" />
          <OverrideableParameter ID="SyncTime" Selector="$Config/SyncTime$" ParameterType="string" />
          <OverrideableParameter ID="WarningThreshold" Selector="$Config/WarningThreshold$" ParameterType="int" />
          <OverrideableParameter ID="ErrorThreshold" Selector="$Config/ErrorThreshold$" ParameterType="int" />
          <OverrideableParameter ID="Debug" Selector="$Config/Debug$" ParameterType="bool" />
        </OverrideableParameters>
        <MonitorImplementation>
          <MemberModules>
            <DataSource ID="DS" TypeID="Demo.StoreApp.DataSource.QueueStatistics">
              <IntervalSeconds>$Config/IntervalSeconds$</IntervalSeconds>
              <SyncTime>$Config/SyncTime$</SyncTime>
              <TopFolder>$Config/TopFolder$</TopFolder>
              <StoreCode>$Config/StoreCode$</StoreCode>
              <Debug>$Config/Debug$</Debug>
            </DataSource>
            <ConditionDetection ID="FilterUnderThreshold" TypeID="System!System.ExpressionFilter">
              <Expression>
                <SimpleExpression>
                  <ValueExpression>
                    <XPathQuery Type="Integer">Property[@Name='FileCount']</XPathQuery>
                  </ValueExpression>
                  <Operator>LessEqual</Operator>
                  <ValueExpression>
                    <Value Type="Integer">$Config/WarningThreshold$</Value>
                  </ValueExpression>
                </SimpleExpression>
              </Expression>
            </ConditionDetection>
            <ConditionDetection ID="FilterOverWarningThreshold" TypeID="System!System.ExpressionFilter">
              <Expression>
                <And>
                  <Expression>
                    <SimpleExpression>
                      <ValueExpression>
                        <XPathQuery Type="Integer">Property[@Name='FileCount']</XPathQuery>
                      </ValueExpression>
                      <Operator>Greater</Operator>
                      <ValueExpression>
                        <Value Type="Integer">$Config/WarningThreshold$</Value>
                      </ValueExpression>
                    </SimpleExpression>
                  </Expression>
                  <Expression>
                    <SimpleExpression>
                      <ValueExpression>
                        <XPathQuery Type="Integer">Property[@Name='FileCount']</XPathQuery>
                      </ValueExpression>
                      <Operator>Less</Operator>
                      <ValueExpression>
                        <Value Type="Integer">$Config/ErrorThreshold$</Value>
                      </ValueExpression>
                    </SimpleExpression>
                  </Expression>
                </And>
              </Expression>
            </ConditionDetection>
            <ConditionDetection ID="FilterOverErrorThreshold" TypeID="System!System.ExpressionFilter">
              <Expression>
                <SimpleExpression>
                  <ValueExpression>
                    <XPathQuery Type="Integer">Property[@Name='FileCount']</XPathQuery>
                  </ValueExpression>
                  <Operator>Greater</Operator>
                  <ValueExpression>
                    <Value Type="Integer">$Config/ErrorThreshold$</Value>
                  </ValueExpression>
                </SimpleExpression>
              </Expression>
            </ConditionDetection>
          </MemberModules>
          <RegularDetections>
            <RegularDetection MonitorTypeStateID="OverErrorThreshold">
              <Node ID="FilterOverErrorThreshold">
                <Node ID="DS" />
              </Node>
            </RegularDetection>
            <RegularDetection MonitorTypeStateID="UnderThreshold">
              <Node ID="FilterUnderThreshold">
                <Node ID="DS" />
              </Node>
            </RegularDetection>
            <RegularDetection MonitorTypeStateID="OverWarningThreshold">
              <Node ID="FilterOverWarningThreshold">
                <Node ID="DS" />
              </Node>
            </RegularDetection>
          </RegularDetections>
        </MonitorImplementation>
      </UnitMonitorType>
      <UnitMonitorType ID="Demo.StoreApp.MonitorType.QueueLength.PowerShell" Accessibility="Internal">
        <MonitorTypeStates>
          <MonitorTypeState ID="OverErrorThreshold" NoDetection="false" />
          <MonitorTypeState ID="OverWarningThreshold" NoDetection="false" />
          <MonitorTypeState ID="UnderThreshold" NoDetection="false" />
        </MonitorTypeStates>
        <Configuration>
          <xsd:element minOccurs="1" name="IntervalSeconds" type="xsd:integer" />
          <xsd:element minOccurs="1" name="SyncTime" type="xsd:string" />
          <xsd:element minOccurs="1" name="TopFolder" type="xsd:string" />
          <xsd:element minOccurs="1" name="StoreCode" type="xsd:string" />
          <xsd:element minOccurs="1" name="WarningThreshold" type="xsd:integer" />
          <xsd:element minOccurs="1" name="ErrorThreshold" type="xsd:integer" />
          <xsd:element minOccurs="1" name="Debug" type="xsd:boolean" />
        </Configuration>
        <OverrideableParameters>
          <OverrideableParameter ID="IntervalSeconds" Selector="$Config/IntervalSeconds$" ParameterType="int" />
          <OverrideableParameter ID="SyncTime" Selector="$Config/SyncTime$" ParameterType="string" />
          <OverrideableParameter ID="WarningThreshold" Selector="$Config/WarningThreshold$" ParameterType="int" />
          <OverrideableParameter ID="ErrorThreshold" Selector="$Config/ErrorThreshold$" ParameterType="int" />
          <OverrideableParameter ID="Debug" Selector="$Config/Debug$" ParameterType="bool" />
        </OverrideableParameters>
        <MonitorImplementation>
          <MemberModules>
            <DataSource ID="DS" TypeID="Demo.StoreApp.DataSource.QueueStatistics.PowerShell">
              <IntervalSeconds>$Config/IntervalSeconds$</IntervalSeconds>
              <SyncTime>$Config/SyncTime$</SyncTime>
              <TopFolder>$Config/TopFolder$</TopFolder>
              <StoreCode>$Config/StoreCode$</StoreCode>
              <Debug>$Config/Debug$</Debug>
            </DataSource>
            <ConditionDetection ID="FilterUnderThreshold" TypeID="System!System.ExpressionFilter">
              <Expression>
                <SimpleExpression>
                  <ValueExpression>
                    <XPathQuery Type="Integer">Property[@Name='FileCount']</XPathQuery>
                  </ValueExpression>
                  <Operator>LessEqual</Operator>
                  <ValueExpression>
                    <Value Type="Integer">$Config/WarningThreshold$</Value>
                  </ValueExpression>
                </SimpleExpression>
              </Expression>
            </ConditionDetection>
            <ConditionDetection ID="FilterOverWarningThreshold" TypeID="System!System.ExpressionFilter">
              <Expression>
                <And>
                  <Expression>
                    <SimpleExpression>
                      <ValueExpression>
                        <XPathQuery Type="Integer">Property[@Name='FileCount']</XPathQuery>
                      </ValueExpression>
                      <Operator>Greater</Operator>
                      <ValueExpression>
                        <Value Type="Integer">$Config/WarningThreshold$</Value>
                      </ValueExpression>
                    </SimpleExpression>
                  </Expression>
                  <Expression>
                    <SimpleExpression>
                      <ValueExpression>
                        <XPathQuery Type="Integer">Property[@Name='FileCount']</XPathQuery>
                      </ValueExpression>
                      <Operator>Less</Operator>
                      <ValueExpression>
                        <Value Type="Integer">$Config/ErrorThreshold$</Value>
                      </ValueExpression>
                    </SimpleExpression>
                  </Expression>
                </And>
              </Expression>
            </ConditionDetection>
            <ConditionDetection ID="FilterOverErrorThreshold" TypeID="System!System.ExpressionFilter">
              <Expression>
                <SimpleExpression>
                  <ValueExpression>
                    <XPathQuery Type="Integer">Property[@Name='FileCount']</XPathQuery>
                  </ValueExpression>
                  <Operator>Greater</Operator>
                  <ValueExpression>
                    <Value Type="Integer">$Config/ErrorThreshold$</Value>
                  </ValueExpression>
                </SimpleExpression>
              </Expression>
            </ConditionDetection>
          </MemberModules>
          <RegularDetections>
            <RegularDetection MonitorTypeStateID="OverErrorThreshold">
              <Node ID="FilterOverErrorThreshold">
                <Node ID="DS" />
              </Node>
            </RegularDetection>
            <RegularDetection MonitorTypeStateID="UnderThreshold">
              <Node ID="FilterUnderThreshold">
                <Node ID="DS" />
              </Node>
            </RegularDetection>
            <RegularDetection MonitorTypeStateID="OverWarningThreshold">
              <Node ID="FilterOverWarningThreshold">
                <Node ID="DS" />
              </Node>
            </RegularDetection>
          </RegularDetections>
        </MonitorImplementation>
      </UnitMonitorType>
    </MonitorTypes>
  </TypeDefinitions>
  <Monitoring>
    <Discoveries>
      <Discovery ID="Demo.StoreApp.Discovery.CentralDatabaseRelationship" Enabled="true" Target="Demo.StoreApp.ComputerRole.CentralServer" ConfirmDelivery="true" Remotable="true" Priority="Normal">
        <Category>Discovery</Category>
        <DiscoveryTypes>
          <DiscoveryRelationship TypeID="Demo.StoreApp.CentralContainsSQLDatabase" />
        </DiscoveryTypes>
        <DataSource ID="DS" TypeID="Demo.StoreApp.DataSource.RegistryRelationshipDiscoveryProvider">
          <ComputerName>$Target/Host/Property[Type="Windows!Microsoft.Windows.Computer"]/PrincipalName$</ComputerName>
          <RegistryAttributeDefinitions>
            <RegistryAttributeDefinition>
              <AttributeName>DatabaseName</AttributeName>
              <Path>SOFTWARE\Demo\StoreApp\DatabaseName</Path>
              <PathType>1</PathType>
              <AttributeType>1</AttributeType>
            </RegistryAttributeDefinition>
            <RegistryAttributeDefinition>
              <AttributeName>DatabaseServer</AttributeName>
              <Path>SOFTWARE\Demo\StoreApp\DatabaseServer</Path>
              <PathType>1</PathType>
              <AttributeType>1</AttributeType>
            </RegistryAttributeDefinition>
          </RegistryAttributeDefinitions>
          <Frequency>120</Frequency>
          <RelationshipId>$MPElement[Name='Demo.StoreApp.CentralContainsSQLDatabase']$</RelationshipId>
          <SourceTypeId>$MPElement[Name='Demo.StoreApp.Central']$</SourceTypeId>
          <TargetTypeId>$MPElement[Name='SQL!Microsoft.SQLServer.Database']$</TargetTypeId>
          <TargetRoleSettings>
            <Settings>
              <Setting>
                <Name>$MPElement[Name="Windows!Microsoft.Windows.Computer"]/PrincipalName$</Name>
                <Value>$Data/Values/DatabaseServer$</Value>
              </Setting>
              <Setting>
                <Name>$MPElement[Name="SQL!Microsoft.SQLServer.ServerRole"]/InstanceName$</Name>
                <Value>MSSQLServer</Value>
              </Setting>
              <Setting>
                <Name>$MPElement[Name="SQL!Microsoft.SQLServer.Database"]/DatabaseName$</Name>
                <Value>$Data/Values/DatabaseName$</Value>
              </Setting>
            </Settings>
          </TargetRoleSettings>
        </DataSource>
      </Discovery>
      <Discovery ID="Demo.StoreApp.Discovery.CentralQueues" Enabled="false" Target="Demo.StoreApp.ComputerRole.CentralServer" ConfirmDelivery="false" Remotable="true" Priority="Normal">
        <Category>Discovery</Category>
        <DiscoveryTypes>
          <DiscoveryClass TypeID="Demo.StoreApp.CentralQueue" />
        </DiscoveryTypes>
        <DataSource ID="DS" TypeID="Windows!Microsoft.Windows.TimedScript.DiscoveryProvider">
          <IntervalSeconds>120</IntervalSeconds>
          <SyncTime />
          <ScriptName>DiscoverCentralQueues.vbs</ScriptName>
          <Arguments>$MPElement$ $Target/Id$ "$Target/Property[Type="Demo.StoreApp.ComputerRole.CentralServer"]/QueuePath$" $Target/Host/Property[Type="Windows!Microsoft.Windows.Computer"]/PrincipalName$ false</Arguments>
          <ScriptBody><![CDATA['==================================================================================
' Script: 	DiscoverCentralQueues.vbs
' Date:	4/27/09	
' Author: 	Brian Wren, Microsoft Consulting Services
' Purpose:	Discovers Queue class for StoreApp sample application
'==================================================================================

'Constants used for event logging
Const SCRIPT_NAME			= "DiscoverCentralQueues.vbs"
Const EVENT_LEVEL_ERROR 	= 1
Const EVENT_LEVEL_WARNING 	= 2
Const EVENT_LEVEL_INFO 		= 4

Const SCRIPT_STARTED		= 811
Const CLASS_CREATED		= 812
Const SCRIPT_ENDED		= 815


'Setup variables sent in through script arguments
SourceId = WScript.Arguments(0) 			'GUID of discovery calling the script.  Provided by the MPElement variable.
ManagedEntityId = WScript.Arguments(1)		'GUID of target object.  Provided by the Target/Id variable.
sTopFolder = WScript.Arguments(2)			'Path of the top level folder where queue folders are located.
sComputerName = WScript.Arguments(3)		'Name of the computer holding the Store Server or Store Client class.
bDebug = CBool(WScript.Arguments(4))		'If true, information events are loggged.

'Start by setting up API object and creating a discovery data object.
'Discovery data object requires the MPElement and Target/ID variables.  The first argument in the method is always 0.
Set oAPI = CreateObject("MOM.ScriptAPI")
Set oDiscoveryData = oAPI.CreateDiscoveryData(0, SourceId, ManagedEntityId)

'Log a message that script is starting only if Debug argument is True
sMessage =	"Script started" & VbCrLf & _
		"Source ID: " & SourceId & VbCrLf & _
		"Managed Entity ID: " & ManagedEntityId & VbCrLf & _
		"Top Folder: " & sTopFolder & VbCrLf & _
		"Computer Name: " & sComputerName
Call LogDebugEvent(SCRIPT_STARTED,sMessage)

'Get the top level folder and then enumerate through each subfolder.
Set fso = CreateObject("Scripting.FileSystemObject")
Set oFolders = fso.GetFolder(sTopFolder)
For Each oFolder In oFolders.SubFolders

	'Create a Central Queue class instance for each subfolder.
	Set oInstance = oDiscoveryData.CreateClassInstance("$MPElement[Name='Demo.StoreApp.CentralQueue']$")
	
	'Since the CentralQueue class is hosted, we need to provide it's key property and the key properties of any parents.
	'The key property of CentralQueue is StoreCode.
	'The hosting class for CentralQueue is CentralServer which has no key property.
	'The hosting class for CentralServer is Windows Computer which has a key property of PrincipalName.
	oInstance.AddProperty "$MPElement[Name='Windows!Microsoft.Windows.Computer']/PrincipalName$", sComputerName
	oInstance.AddProperty "$MPElement[Name='Demo.StoreApp.CentralQueue']/StoreCode$", oFolder.Name
	oInstance.AddProperty "$MPElement[Name='Demo.StoreApp.CentralQueue']/FolderPath$", oFolder.Path
	oDiscoveryData.AddInstance(oInstance)
	
	sMessage =	"Created CentralQueue class" & VbCrLf & _
			"Computer Name: " & sComputerName & VbCrLf & _
			"Store Code: " & oFolder.Name
	Call LogDebugEvent(CLASS_CREATED,sMessage)

Next 

'Return the discovery data.
oAPI.Return(oDiscoveryData)

Call LogDebugEvent (SCRIPT_ENDED,"Script ended.")

'==================================================================================
' Sub:	LogDebugEvent
' Purpose:	Logs an informational event to the Operations Manager event log 
'		only if Debug argument is true
'==================================================================================
Sub LogDebugEvent(EventNo,Message)

	Message = VbCrLf & Message
	If bDebug = True Then
    	Call oAPI.LogScriptEvent(SCRIPT_NAME,EventNo,EVENT_LEVEL_INFO,Message)
	End If
	
End Sub  ]]></ScriptBody>
          <TimeoutSeconds>60</TimeoutSeconds>
        </DataSource>
      </Discovery>
      <Discovery ID="Demo.StoreApp.Discovery.CentralQueues.PowerShell" Enabled="true" Target="Demo.StoreApp.ComputerRole.CentralServer" ConfirmDelivery="true" Remotable="true" Priority="Normal">
        <Category>Discovery</Category>
        <DiscoveryTypes>
          <DiscoveryClass TypeID="Demo.StoreApp.CentralQueue" />
        </DiscoveryTypes>
        <DataSource ID="DS" TypeID="Windows!Microsoft.Windows.TimedPowerShell.DiscoveryProvider">
          <IntervalSeconds>600</IntervalSeconds>
          <SyncTime />
          <ScriptName>DiscoverQueues.ps1</ScriptName>
          <ScriptBody><![CDATA[
#==================================================================================
# Script: 	DiscoverCentralQueues.vbs
# Date:		4/27/09	
# Author: 	Brian Wren, Microsoft Consulting Services
# Purpose:	Discovers Queue class for StoreApp sample application
#==================================================================================

param($sourceId,$managedEntityId,$topFolder,$computerName,$debug)

#Constants used for event logging
$SCRIPT_NAME			= 'DiscoverCentralQueues.ps1'
$EVENT_LEVEL_ERROR 		= 1
$EVENT_LEVEL_WARNING 	= 2
$EVENT_LEVEL_INFO 		= 4

$SCRIPT_STARTED			= 811
$CLASS_CREATED			= 812
$SCRIPT_ENDED			= 815

#==================================================================================
# Sub:		LogDebugEvent
# Purpose:	Logs an informational event to the Operations Manager event log 
#			only if Debug argument is true
#==================================================================================
function Log-DebugEvent
{
	param($eventNo,$message)

	$message = "`n" + $message
	if ($debug = $true)
	{
    	$api.LogScriptEvent($SCRIPT_NAME,$eventNo,$EVENT_LEVEL_INFO,$message)
	}
}
 

#Start by setting up API object and creating a discovery data object.
#Discovery data object requires the MPElement and Target/ID variables.  The first argument in the method is always 0.
$api = New-Object -comObject 'MOM.ScriptAPI'
$discoveryData = $api.CreateDiscoveryData(0, $sourceId, $managedEntityId)

#Log a message that script is starting only if Debug argument is True
$message =	'Script started' + "`n" + `
			'Source ID: ' + $sourceId + "`n" + `
			'Managed Entity ID: ' + $managedEntityId + "`n" + `
			'Top Folder: ' + $topFolder + "`n" + `
			'Computer Name: ' + $computerName
Log-DebugEvent $SCRIPT_STARTED $message

#Get the top level folder and then enumerate through each subfolder.
$subFolders = Get-ChildItem -Path $topFolder | where {$_.psIsContainer -eq $true}
foreach ($subFolder in $subFolders)
{
	#Create a Central Queue class instance for each subfolder.
	$instance = $discoveryData.CreateClassInstance("$MPElement[Name='Demo.StoreApp.CentralQueue']$")
	
	#Since the CentralQueue class is hosted, we need to provide it's key property and the key properties of any parents.
	#The key property of CentralQueue is StoreCode.
	#The hosting class for CentralQueue is CentralServer which has no key property.
	#The hosting class for CentralServer is Windows Computer which has a key property of PrincipalName.
	$instance.AddProperty("$MPElement[Name='Windows!Microsoft.Windows.Computer']/PrincipalName$", $computerName)
	$instance.AddProperty("$MPElement[Name='Demo.StoreApp.CentralQueue']/StoreCode$", $subFolder.name)
	$instance.AddProperty("$MPElement[Name='Demo.StoreApp.CentralQueue']/FolderPath$", $subFolder.fullName)
	$discoveryData.AddInstance($instance)
	
	$message =	'Created CentralQueue class' + "`n" + `
				'Computer Name: ' + $computerName + "`n" + 
				'Store Code: ' + $subFolder.name
	Log-DebugEvent $CLASS_CREATED $message
}

#Return the discovery data.
$discoveryData

Log-DebugEvent -eventNo $SCRIPT_ENDED -message 'Script ended.'

#{286671bf-40d1-133e-e623-68fe42a3c091}
]]></ScriptBody>
          <Parameters>
            <Parameter>
              <Name>sourceID</Name>
              <Value>$MPElement$</Value>
            </Parameter>
            <Parameter>
              <Name>managedEntityID</Name>
              <Value>$Target/Id$</Value>
            </Parameter>
            <Parameter>
              <Name>topFolder</Name>
              <Value>$Target/Property[Type="Demo.StoreApp.ComputerRole.CentralServer"]/QueuePath$</Value>
            </Parameter>
            <Parameter>
              <Name>computerName</Name>
              <Value>$Target/Host/Property[Type="Windows!Microsoft.Windows.Computer"]/PrincipalName$</Value>
            </Parameter>
            <Parameter>
              <Name>debug</Name>
              <Value>$true</Value>
            </Parameter>
          </Parameters>
          <TimeoutSeconds>30</TimeoutSeconds>
        </DataSource>
      </Discovery>
      <Discovery ID="Demo.StoreApp.Discovery.CentralServer" Enabled="true" Target="Windows!Microsoft.Windows.Server.OperatingSystem" ConfirmDelivery="false" Remotable="true" Priority="Normal">
        <Category>Discovery</Category>
        <DiscoveryTypes>
          <DiscoveryClass TypeID="Demo.StoreApp.ComputerRole.CentralServer" />
        </DiscoveryTypes>
        <DataSource ID="DS" TypeID="Windows!Microsoft.Windows.FilteredRegistryDiscoveryProvider">
          <ComputerName>$Target/Host/Property[Type="Windows!Microsoft.Windows.Computer"]/NetworkName$</ComputerName>
          <RegistryAttributeDefinitions>
            <RegistryAttributeDefinition>
              <AttributeName>AppExists</AttributeName>
              <Path>SOFTWARE\Demo\StoreApp</Path>
              <PathType>0</PathType>
              <AttributeType>0</AttributeType>
            </RegistryAttributeDefinition>
            <RegistryAttributeDefinition>
              <AttributeName>StoreCode</AttributeName>
              <Path>SOFTWARE\Demo\StoreApp\StoreCode</Path>
              <PathType>1</PathType>
              <AttributeType>1</AttributeType>
            </RegistryAttributeDefinition>
            <RegistryAttributeDefinition>
              <AttributeName>QueuePath</AttributeName>
              <Path>SOFTWARE\Demo\StoreApp\QueuePath</Path>
              <PathType>1</PathType>
              <AttributeType>1</AttributeType>
            </RegistryAttributeDefinition>
            <RegistryAttributeDefinition>
              <AttributeName>StoreCodeExists</AttributeName>
              <Path>SOFTWARE\Demo\StoreApp\StoreCode</Path>
              <PathType>1</PathType>
              <AttributeType>0</AttributeType>
            </RegistryAttributeDefinition>
            <RegistryAttributeDefinition>
              <AttributeName>DatabaseName</AttributeName>
              <Path>SOFTWARE\Demo\StoreApp\DatabaseName</Path>
              <PathType>1</PathType>
              <AttributeType>1</AttributeType>
            </RegistryAttributeDefinition>
            <RegistryAttributeDefinition>
              <AttributeName>DatabaseServer</AttributeName>
              <Path>SOFTWARE\Demo\StoreApp\DatabaseServer</Path>
              <PathType>1</PathType>
              <AttributeType>1</AttributeType>
            </RegistryAttributeDefinition>
          </RegistryAttributeDefinitions>
          <Frequency>120</Frequency>
          <ClassId>$MPElement[Name="Demo.StoreApp.ComputerRole.CentralServer"]$</ClassId>
          <InstanceSettings>
            <Settings>
              <Setting>
                <Name>$MPElement[Name="Windows!Microsoft.Windows.Computer"]/PrincipalName$</Name>
                <Value>$Target/Host/Property[Type="Windows!Microsoft.Windows.Computer"]/PrincipalName$</Value>
              </Setting>
              <Setting>
                <Name>$MPElement[Name="Demo.StoreApp.ComputerRole.CentralServer"]/QueuePath$</Name>
                <Value>$Data/Values/QueuePath$</Value>
              </Setting>
              <Setting>
                <Name>$MPElement[Name="Demo.StoreApp.ComputerRole.CentralServer"]/DatabaseServer$</Name>
                <Value>$Data/Values/DatabaseServer$</Value>
              </Setting>
              <Setting>
                <Name>$MPElement[Name="Demo.StoreApp.ComputerRole.CentralServer"]/DatabaseName$</Name>
                <Value>$Data/Values/DatabaseName$</Value>
              </Setting>
              <Setting>
                <Name>$MPElement[Name="System!System.Entity"]/DisplayName$</Name>
                <Value>$Target/Host/Property[Type="Windows!Microsoft.Windows.Computer"]/PrincipalName$</Value>
              </Setting>
            </Settings>
          </InstanceSettings>
          <Expression>
            <And>
              <Expression>
                <SimpleExpression>
                  <ValueExpression>
                    <XPathQuery Type="String">Values/AppExists</XPathQuery>
                  </ValueExpression>
                  <Operator>Equal</Operator>
                  <ValueExpression>
                    <Value Type="String">true</Value>
                  </ValueExpression>
                </SimpleExpression>
              </Expression>
              <Expression>
                <SimpleExpression>
                  <ValueExpression>
                    <XPathQuery Type="String">Values/StoreCodeExists</XPathQuery>
                  </ValueExpression>
                  <Operator>NotEqual</Operator>
                  <ValueExpression>
                    <Value Type="String">true</Value>
                  </ValueExpression>
                </SimpleExpression>
              </Expression>
            </And>
          </Expression>
        </DataSource>
      </Discovery>
      <Discovery ID="Demo.StoreApp.Discovery.PopulateApplication" Enabled="true" Target="Demo.StoreApp.Application" ConfirmDelivery="false" Remotable="true" Priority="Normal">
        <Category>Discovery</Category>
        <DiscoveryTypes>
          <DiscoveryRelationship TypeID="Demo.StoreApp.ApplicationContainsStores" />
          <DiscoveryRelationship TypeID="Demo.StoreApp.ApplicationContainsCentral" />
        </DiscoveryTypes>
        <DataSource ID="DS" TypeID="SC!Microsoft.SystemCenter.GroupPopulator">
          <RuleId>$MPElement$</RuleId>
          <GroupInstanceId>$Target/Id$</GroupInstanceId>
          <MembershipRules>
            <MembershipRule>
              <MonitoringClass>$MPElement[Name="Demo.StoreApp.Stores"]$</MonitoringClass>
              <RelationshipClass>$MPElement[Name="Demo.StoreApp.ApplicationContainsStores"]$</RelationshipClass>
            </MembershipRule>
            <MembershipRule>
              <MonitoringClass>$MPElement[Name="Demo.StoreApp.Central"]$</MonitoringClass>
              <RelationshipClass>$MPElement[Name="Demo.StoreApp.ApplicationContainsCentral"]$</RelationshipClass>
            </MembershipRule>
          </MembershipRules>
        </DataSource>
      </Discovery>
      <Discovery ID="Demo.StoreApp.Discovery.PopulateCentral" Enabled="true" Target="Demo.StoreApp.Central" ConfirmDelivery="false" Remotable="true" Priority="Normal">
        <Category>Discovery</Category>
        <DiscoveryTypes>
          <DiscoveryRelationship TypeID="Demo.StoreApp.CentralContainsCentralServer" />
        </DiscoveryTypes>
        <DataSource ID="DS" TypeID="SC!Microsoft.SystemCenter.GroupPopulator">
          <RuleId>$MPElement$</RuleId>
          <GroupInstanceId>$Target/Id$</GroupInstanceId>
          <MembershipRules>
            <MembershipRule>
              <MonitoringClass>$MPElement[Name="Demo.StoreApp.ComputerRole.CentralServer"]$</MonitoringClass>
              <RelationshipClass>$MPElement[Name="Demo.StoreApp.CentralContainsCentralServer"]$</RelationshipClass>
            </MembershipRule>
          </MembershipRules>
        </DataSource>
      </Discovery>
      <Discovery ID="Demo.StoreApp.Discovery.PopulateStores" Enabled="true" Target="Demo.StoreApp.Stores" ConfirmDelivery="false" Remotable="true" Priority="Normal">
        <Category>Discovery</Category>
        <DiscoveryTypes>
          <DiscoveryRelationship TypeID="Demo.StoreApp.StoresContainsStore" />
        </DiscoveryTypes>
        <DataSource ID="DS" TypeID="SC!Microsoft.SystemCenter.GroupPopulator">
          <RuleId>$MPElement$</RuleId>
          <GroupInstanceId>$Target/Id$</GroupInstanceId>
          <MembershipRules>
            <MembershipRule>
              <MonitoringClass>$MPElement[Name="Demo.StoreApp.Store"]$</MonitoringClass>
              <RelationshipClass>$MPElement[Name="Demo.StoreApp.StoresContainsStore"]$</RelationshipClass>
            </MembershipRule>
          </MembershipRules>
        </DataSource>
      </Discovery>
      <Discovery ID="Demo.StoreApp.Discovery.Store.Client" Enabled="true" Target="Demo.StoreApp.ComputerRole.StoreClient" ConfirmDelivery="true" Remotable="true" Priority="Normal">
        <Category>Discovery</Category>
        <DiscoveryTypes>
          <DiscoveryClass TypeID="Demo.StoreApp.Store" />
          <DiscoveryRelationship TypeID="Demo.StoreApp.StoreContainsClients" />
        </DiscoveryTypes>
        <DataSource ID="DS" TypeID="Demo.StoreApp.DataSource.DiscoverStore">
          <IntervalSeconds>600</IntervalSeconds>
          <ComputerName>$Target/Host/Property[Type="Windows!Microsoft.Windows.Computer"]/PrincipalName$</ComputerName>
          <StoreCode>$Target/Property[Type="Demo.StoreApp.ComputerRole"]/StoreCode$</StoreCode>
          <ServerOrClient>client</ServerOrClient>
          <Debug>true</Debug>
        </DataSource>
      </Discovery>
      <Discovery ID="Demo.StoreApp.Discovery.Store.Server" Enabled="true" Target="Demo.StoreApp.ComputerRole.StoreServer" ConfirmDelivery="true" Remotable="true" Priority="Normal">
        <Category>Discovery</Category>
        <DiscoveryTypes>
          <DiscoveryClass TypeID="Demo.StoreApp.Store" />
          <DiscoveryRelationship TypeID="Demo.StoreApp.StoreContainsStoreServer" />
        </DiscoveryTypes>
        <DataSource ID="DS" TypeID="Demo.StoreApp.DataSource.DiscoverStore">
          <IntervalSeconds>600</IntervalSeconds>
          <ComputerName>$Target/Host/Property[Type="Windows!Microsoft.Windows.Computer"]/PrincipalName$</ComputerName>
          <StoreCode>$Target/Property[Type="Demo.StoreApp.ComputerRole"]/StoreCode$</StoreCode>
          <ServerOrClient>server</ServerOrClient>
          <Debug>true</Debug>
        </DataSource>
      </Discovery>
      <Discovery ID="Demo.StoreApp.Discovery.StoreClient" Enabled="true" Target="Windows!Microsoft.Windows.Client.Computer" ConfirmDelivery="false" Remotable="true" Priority="Normal">
        <Category>Discovery</Category>
        <DiscoveryTypes>
          <DiscoveryClass TypeID="Demo.StoreApp.ComputerRole.StoreClient" />
        </DiscoveryTypes>
        <DataSource ID="DS" TypeID="Windows!Microsoft.Windows.FilteredRegistryDiscoveryProvider">
          <ComputerName>$Target/Property[Type="Windows!Microsoft.Windows.Computer"]/NetworkName$</ComputerName>
          <RegistryAttributeDefinitions>
            <RegistryAttributeDefinition>
              <AttributeName>AppExists</AttributeName>
              <Path>SOFTWARE\Demo\StoreApp</Path>
              <PathType>0</PathType>
              <AttributeType>0</AttributeType>
            </RegistryAttributeDefinition>
            <RegistryAttributeDefinition>
              <AttributeName>StoreCode</AttributeName>
              <Path>SOFTWARE\Demo\StoreApp\StoreCode</Path>
              <PathType>1</PathType>
              <AttributeType>1</AttributeType>
            </RegistryAttributeDefinition>
          </RegistryAttributeDefinitions>
          <Frequency>120</Frequency>
          <ClassId>$MPElement[Name="Demo.StoreApp.ComputerRole.StoreClient"]$</ClassId>
          <InstanceSettings>
            <Settings>
              <Setting>
                <Name>$MPElement[Name="Windows!Microsoft.Windows.Computer"]/PrincipalName$</Name>
                <Value>$Target/Property[Type="Windows!Microsoft.Windows.Computer"]/PrincipalName$</Value>
              </Setting>
              <Setting>
                <Name>$MPElement[Name="Demo.StoreApp.ComputerRole"]/StoreCode$</Name>
                <Value>$Data/Values/StoreCode$</Value>
              </Setting>
              <Setting>
                <Name>$MPElement[Name="System!System.Entity"]/DisplayName$</Name>
                <Value>$Target/Property[Type="Windows!Microsoft.Windows.Computer"]/PrincipalName$</Value>
              </Setting>
            </Settings>
          </InstanceSettings>
          <Expression>
            <SimpleExpression>
              <ValueExpression>
                <XPathQuery Type="String">Values/AppExists</XPathQuery>
              </ValueExpression>
              <Operator>Equal</Operator>
              <ValueExpression>
                <Value Type="String">true</Value>
              </ValueExpression>
            </SimpleExpression>
          </Expression>
        </DataSource>
      </Discovery>
      <Discovery ID="Demo.StoreApp.Discovery.StoreServer" Enabled="true" Target="Windows!Microsoft.Windows.Server.OperatingSystem" ConfirmDelivery="false" Remotable="true" Priority="Normal">
        <Category>Discovery</Category>
        <DiscoveryTypes>
          <DiscoveryClass TypeID="Demo.StoreApp.ComputerRole.StoreServer" />
        </DiscoveryTypes>
        <DataSource ID="DS" TypeID="Windows!Microsoft.Windows.FilteredRegistryDiscoveryProvider">
          <ComputerName>$Target/Host/Property[Type="Windows!Microsoft.Windows.Computer"]/NetworkName$</ComputerName>
          <RegistryAttributeDefinitions>
            <RegistryAttributeDefinition>
              <AttributeName>AppExists</AttributeName>
              <Path>SOFTWARE\Demo\StoreApp</Path>
              <PathType>0</PathType>
              <AttributeType>0</AttributeType>
            </RegistryAttributeDefinition>
            <RegistryAttributeDefinition>
              <AttributeName>StoreCode</AttributeName>
              <Path>SOFTWARE\Demo\StoreApp\StoreCode</Path>
              <PathType>1</PathType>
              <AttributeType>1</AttributeType>
            </RegistryAttributeDefinition>
            <RegistryAttributeDefinition>
              <AttributeName>StoreCodeExists</AttributeName>
              <Path>SOFTWARE\Demo\StoreApp\StoreCode</Path>
              <PathType>1</PathType>
              <AttributeType>0</AttributeType>
            </RegistryAttributeDefinition>
          </RegistryAttributeDefinitions>
          <Frequency>120</Frequency>
          <ClassId>$MPElement[Name="Demo.StoreApp.ComputerRole.StoreServer"]$</ClassId>
          <InstanceSettings>
            <Settings>
              <Setting>
                <Name>$MPElement[Name="Windows!Microsoft.Windows.Computer"]/PrincipalName$</Name>
                <Value>$Target/Host/Property[Type="Windows!Microsoft.Windows.Computer"]/PrincipalName$</Value>
              </Setting>
              <Setting>
                <Name>$MPElement[Name="Demo.StoreApp.ComputerRole"]/StoreCode$</Name>
                <Value>$Data/Values/StoreCode$</Value>
              </Setting>
              <Setting>
                <Name>$MPElement[Name="System!System.Entity"]/DisplayName$</Name>
                <Value>$Target/Host/Property[Type="Windows!Microsoft.Windows.Computer"]/PrincipalName$</Value>
              </Setting>
            </Settings>
          </InstanceSettings>
          <Expression>
            <And>
              <Expression>
                <SimpleExpression>
                  <ValueExpression>
                    <XPathQuery Type="String">Values/AppExists</XPathQuery>
                  </ValueExpression>
                  <Operator>Equal</Operator>
                  <ValueExpression>
                    <Value Type="String">true</Value>
                  </ValueExpression>
                </SimpleExpression>
              </Expression>
              <Expression>
                <SimpleExpression>
                  <ValueExpression>
                    <XPathQuery Type="String">Values/StoreCodeExists</XPathQuery>
                  </ValueExpression>
                  <Operator>Equal</Operator>
                  <ValueExpression>
                    <Value Type="String">true</Value>
                  </ValueExpression>
                </SimpleExpression>
              </Expression>
            </And>
          </Expression>
        </DataSource>
      </Discovery>
    </Discoveries>
    <Rules>
      <Rule ID="Demo.StoreApp.Rule.CollectClientReceiverMemory" Enabled="true" Target="Demo.StoreApp.ComputerRole.StoreServer" ConfirmDelivery="false" Remotable="true" Priority="Normal" DiscardLevel="100">
        <Category>PerformanceCollection</Category>
        <DataSources>
          <DataSource ID="DS" TypeID="Performance!System.Performance.OptimizedDataProvider">
            <ComputerName>$Target/Host/Property[Type="Windows!Microsoft.Windows.Computer"]/NetworkName$</ComputerName>
            <CounterName>Working Set</CounterName>
            <ObjectName>Process</ObjectName>
            <InstanceName>explorer</InstanceName>
            <AllInstances>false</AllInstances>
            <Frequency>900</Frequency>
            <Tolerance>10</Tolerance>
            <ToleranceType>Percentage</ToleranceType>
            <MaximumSampleSeparation>10</MaximumSampleSeparation>
          </DataSource>
        </DataSources>
        <WriteActions>
          <WriteAction ID="WriteToDB" TypeID="SC!Microsoft.SystemCenter.CollectPerformanceData" />
          <WriteAction ID="WriteToDW" TypeID="SCDW!Microsoft.SystemCenter.DataWarehouse.PublishPerformanceData" />
        </WriteActions>
      </Rule>
      <Rule ID="Demo.StoreApp.Rule.CollectQueueLength" Enabled="false" Target="Demo.StoreApp.CentralQueue" ConfirmDelivery="false" Remotable="true" Priority="Normal" DiscardLevel="100">
        <Category>PerformanceCollection</Category>
        <DataSources>
          <DataSource ID="DS" TypeID="Windows!Microsoft.Windows.TimedScript.PerformanceProvider">
            <IntervalSeconds>600</IntervalSeconds>
            <SyncTime />
            <ScriptName>QueueStatistics.vbs</ScriptName>
            <Arguments>"$Target/Property[Type="Demo.StoreApp.CentralQueue"]/FolderPath$" false</Arguments>
            <ScriptBody><![CDATA['==================================================================================
' Script: 	QueueStats.vbs
' Date:	4/27/09	
' Author: 	Brian Wren, Microsoft Consulting Services
' Purpose:	Collects statistics for a single queue folder for StoreApp sample application.
'		Script does not support cookdown because it requires the folder path as an argument.
'		Since we expect multiple instances of queue folders on a particular agent, 
'			each instance will have its own instance of the script.
'==================================================================================

'Constants used for event logging
Const SCRIPT_NAME			= "QueueStats.vbs"
Const EVENT_LEVEL_ERROR 	= 1
Const EVENT_LEVEL_WARNING 	= 2
Const EVENT_LEVEL_INFO 		= 4

Const SCRIPT_STARTED		= 821
Const PROPERTYBAG_CREATED	= 822
Const SCRIPT_ENDED		= 825

'Setup variables sent in through script arguments
sFolder = WScript.Arguments(0)			'Path of the folder we'll be collecting statistics for.
bDebug = CBool(WScript.Arguments(1))	'If true, information events are loggged..

'Start by setting up API object.
Set oAPI = CreateObject("MOM.ScriptAPI")

'Log a message that script is starting only if Debug argument is True
sMessage =	"Script started" & VbCrLf & _
		"Folder: " & sFolder
Call LogDebugEvent(SCRIPT_STARTED,sMessage)

'Create a property bag.
Set oBag = oAPI.CreatePropertyBag()

'Get the FileSystemObject and the folder.
Set fso = CreateObject("Scripting.FileSystemObject")
Set oFolder = fso.GetFolder(sFolder)

'Get the statistics we're interested in for the specified folder.	
iCount = oFolder.Files.Count
iSize = 0
iOldestFile = 0
For Each oFile In oFolder.Files
	iSize = iSize + oFile.Size
	iAgeInMinutes = DateDiff("n",oFile.DateCreated,Now)
	If iAgeInMinutes > iOldestFile Then
		iOldestFile = iAgeInMinutes
	End If
Next 
sMessage =	"Property bag created" & VbCrLf & _
		"FileCount: " & iCount & VbCrLf & _
		"OldestFile: " & iOldestFile & VbCrLf & _
		"TotalSize: " & iSize
Call LogDebugEvent(PROPERTYBAG_CREATED,sMessage)

'Put the gathered statistics into the property bag.
Call oBag.AddValue("FileCount",iCount)
Call oBag.AddValue("OldestFile",iOldestFile)
Call oBag.AddValue("TotalSize",iSize)

'Return the property bag.
Call oAPI.Return(oBag)

Call LogDebugEvent (SCRIPT_ENDED,"Script ended.")

'==================================================================================
' Sub:		LogDebugEvent
' Purpose:	Logs an informational event to the Operations Manager event log 
'			only if Debug argument is true
'==================================================================================
Sub LogDebugEvent(EventNo,Message)

	Message = VbCrLf & Message
	If bDebug = True Then
    	Call oAPI.LogScriptEvent(SCRIPT_NAME,EventNo,EVENT_LEVEL_INFO,Message)
	End If
	
End Sub  ]]></ScriptBody>
            <TimeoutSeconds>60</TimeoutSeconds>
            <ObjectName>StoreApp</ObjectName>
            <CounterName>QueueLength</CounterName>
            <InstanceName>$Target/Property[Type="Demo.StoreApp.CentralQueue"]/StoreCode$</InstanceName>
            <Value>$Data/Property[@Name='FileCount']$</Value>
          </DataSource>
        </DataSources>
        <WriteActions>
          <WriteAction ID="WriteToDB" TypeID="SC!Microsoft.SystemCenter.CollectPerformanceData" />
          <WriteAction ID="WriteToDW" TypeID="SCDW!Microsoft.SystemCenter.DataWarehouse.PublishPerformanceData" />
        </WriteActions>
      </Rule>
      <Rule ID="Demo.StoreApp.Rule.CollectQueueLength.Cookdown" Enabled="false" Target="Demo.StoreApp.CentralQueue" ConfirmDelivery="true" Remotable="true" Priority="Normal" DiscardLevel="100">
        <Category>PerformanceCollection</Category>
        <DataSources>
          <DataSource ID="DS" TypeID="Demo.StoreApp.DataSource.QueueStatistics">
            <IntervalSeconds>600</IntervalSeconds>
            <SyncTime />
            <TopFolder>$Target/Host/Property[Type="Demo.StoreApp.ComputerRole.CentralServer"]/QueuePath$</TopFolder>
            <StoreCode>$Target/Property[Type="Demo.StoreApp.CentralQueue"]/StoreCode$</StoreCode>
            <Debug>false</Debug>
          </DataSource>
        </DataSources>
        <ConditionDetection ID="MapToPerf" TypeID="Performance!System.Performance.DataGenericMapper">
          <ObjectName>StoreApp</ObjectName>
          <CounterName>QueueLength</CounterName>
          <InstanceName>$Data/Property[@Name='StoreCode']$</InstanceName>
          <Value>$Data/Property[@Name='FileCount']$</Value>
        </ConditionDetection>
        <WriteActions>
          <WriteAction ID="WriteToDB" TypeID="SC!Microsoft.SystemCenter.CollectPerformanceData" />
          <WriteAction ID="WriteToDW" TypeID="SCDW!Microsoft.SystemCenter.DataWarehouse.PublishPerformanceData" />
        </WriteActions>
      </Rule>
      <Rule ID="Demo.StoreApp.Rule.CollectQueueLength.Cookdown.PowerShell" Enabled="true" Target="Demo.StoreApp.CentralQueue" ConfirmDelivery="true" Remotable="true" Priority="Normal" DiscardLevel="100">
        <Category>PerformanceCollection</Category>
        <DataSources>
          <DataSource ID="Script" TypeID="Demo.StoreApp.DataSource.QueueStatistics.PowerShell">
            <IntervalSeconds>600</IntervalSeconds>
            <SyncTime />
            <TopFolder>$Target/Host/Property[Type="Demo.StoreApp.ComputerRole.CentralServer"]/QueuePath$</TopFolder>
            <StoreCode>$Target/Property[Type="Demo.StoreApp.CentralQueue"]/StoreCode$</StoreCode>
            <Debug>true</Debug>
          </DataSource>
        </DataSources>
        <ConditionDetection ID="MapToPerf" TypeID="Performance!System.Performance.DataGenericMapper">
          <ObjectName>StoreApp</ObjectName>
          <CounterName>QueueLength</CounterName>
          <InstanceName>$Data/Property[@Name='StoreCode']$</InstanceName>
          <Value>$Data/Property[@Name='FileCount']$</Value>
        </ConditionDetection>
        <WriteActions>
          <WriteAction ID="WriteToDB" TypeID="SC!Microsoft.SystemCenter.CollectPerformanceData" />
          <WriteAction ID="WriteToDW" TypeID="SCDW!Microsoft.SystemCenter.DataWarehouse.PublishPerformanceData" />
        </WriteActions>
      </Rule>
    </Rules>
    <Monitors>
      <UnitMonitor ID="Demo.StoreApp.Monitor.BadQueueEntry" Accessibility="Internal" Enabled="true" Target="Demo.StoreApp.CentralQueue" ParentMonitorID="Health!System.Health.AvailabilityState" Remotable="true" Priority="Normal" TypeID="Windows!Microsoft.Windows.SingleEventLogManualReset2StateMonitorType" ConfirmDelivery="true">
        <Category>AvailabilityHealth</Category>
        <OperationalStates>
          <OperationalState ID="EventRaised" MonitorTypeStateID="EventRaised" HealthState="Warning" />
          <OperationalState ID="ManualResetEventRaised" MonitorTypeStateID="ManualResetEventRaised" HealthState="Success" />
        </OperationalStates>
        <Configuration>
          <ComputerName>$Target/Host/Host/Property[Type="Windows!Microsoft.Windows.Computer"]/NetworkName$</ComputerName>
          <LogName>Application</LogName>
          <Expression>
            <And>
              <Expression>
                <SimpleExpression>
                  <ValueExpression>
                    <XPathQuery Type="UnsignedInteger">EventDisplayNumber</XPathQuery>
                  </ValueExpression>
                  <Operator>Equal</Operator>
                  <ValueExpression>
                    <Value Type="UnsignedInteger">101</Value>
                  </ValueExpression>
                </SimpleExpression>
              </Expression>
              <Expression>
                <SimpleExpression>
                  <ValueExpression>
                    <XPathQuery Type="String">PublisherName</XPathQuery>
                  </ValueExpression>
                  <Operator>Equal</Operator>
                  <ValueExpression>
                    <Value Type="String">StoreApp</Value>
                  </ValueExpression>
                </SimpleExpression>
              </Expression>
              <Expression>
                <RegExExpression>
                  <ValueExpression>
                    <XPathQuery Type="String">Params/Param[1]</XPathQuery>
                  </ValueExpression>
                  <Operator>ContainsSubstring</Operator>
                  <Pattern>$Target/Property[Type="Demo.StoreApp.CentralQueue"]/StoreCode$</Pattern>
                </RegExExpression>
              </Expression>
            </And>
          </Expression>
        </Configuration>
      </UnitMonitor>
      <UnitMonitor ID="Demo.StoreApp.Monitor.BadQueueEntry.Bad" Accessibility="Internal" Enabled="true" Target="Demo.StoreApp.CentralQueue" ParentMonitorID="Health!System.Health.AvailabilityState" Remotable="true" Priority="Normal" TypeID="Windows!Microsoft.Windows.SingleEventLogManualReset2StateMonitorType" ConfirmDelivery="true">
        <Category>AvailabilityHealth</Category>
        <OperationalStates>
          <OperationalState ID="EventRaised" MonitorTypeStateID="EventRaised" HealthState="Warning" />
          <OperationalState ID="ManualResetEventRaised" MonitorTypeStateID="ManualResetEventRaised" HealthState="Success" />
        </OperationalStates>
        <Configuration>
          <ComputerName>$Target/Host/Host/Property[Type="Windows!Microsoft.Windows.Computer"]/NetworkName$</ComputerName>
          <LogName>Application</LogName>
          <Expression>
            <And>
              <Expression>
                <SimpleExpression>
                  <ValueExpression>
                    <XPathQuery Type="UnsignedInteger">EventDisplayNumber</XPathQuery>
                  </ValueExpression>
                  <Operator>Equal</Operator>
                  <ValueExpression>
                    <Value Type="UnsignedInteger">101</Value>
                  </ValueExpression>
                </SimpleExpression>
              </Expression>
              <Expression>
                <SimpleExpression>
                  <ValueExpression>
                    <XPathQuery Type="String">PublisherName</XPathQuery>
                  </ValueExpression>
                  <Operator>Equal</Operator>
                  <ValueExpression>
                    <Value Type="String">StoreApp</Value>
                  </ValueExpression>
                </SimpleExpression>
              </Expression>
            </And>
          </Expression>
        </Configuration>
      </UnitMonitor>
      <UnitMonitor ID="Demo.StoreApp.Monitor.ClientApplicationRunning" Accessibility="Internal" Enabled="true" Target="Demo.StoreApp.ComputerRole.StoreClient" ParentMonitorID="Health!System.Health.AvailabilityState" Remotable="true" Priority="Normal" TypeID="Process!Microsoft.SystemCenter.Process.ProcessInstanceCountMonitorType" ConfirmDelivery="true">
        <Category>Custom</Category>
        <AlertSettings AlertMessage="Demo.StoreApp.Monitor.ClientApplicationRunning_AlertMessageResourceID">
          <AlertOnState>Error</AlertOnState>
          <AutoResolve>true</AutoResolve>
          <AlertPriority>Normal</AlertPriority>
          <AlertSeverity>Error</AlertSeverity>
        </AlertSettings>
        <OperationalStates>
          <OperationalState ID="UIGeneratedOpStateId4a2f9d702096492b9359f26cac6e8687" MonitorTypeStateID="OutsideRangeState" HealthState="Error" />
          <OperationalState ID="UIGeneratedOpStateIdc4f7c56f35144002b312310b3cb6cebd" MonitorTypeStateID="InsideRangeState" HealthState="Success" />
        </OperationalStates>
        <Configuration>
          <ProcessName>notepad.exe</ProcessName>
          <Frequency>60</Frequency>
          <MinInstanceCount>1</MinInstanceCount>
          <MaxInstanceCount>1</MaxInstanceCount>
          <InstanceCountOutOfRangeTimeThresholdInSeconds>120</InstanceCountOutOfRangeTimeThresholdInSeconds>
        </Configuration>
      </UnitMonitor>
      <UnitMonitor ID="Demo.StoreApp.Monitor.ClientReceiver" Accessibility="Internal" Enabled="true" Target="Demo.StoreApp.ComputerRole.StoreServer" ParentMonitorID="Health!System.Health.AvailabilityState" Remotable="true" Priority="Normal" TypeID="Windows!Microsoft.Windows.CheckNTServiceStateMonitorType" ConfirmDelivery="false">
        <Category>AvailabilityHealth</Category>
        <AlertSettings AlertMessage="Demo.StoreApp.Monitor.ClientReceiver_AlertMessageResourceID">
          <AlertOnState>Error</AlertOnState>
          <AutoResolve>true</AutoResolve>
          <AlertPriority>Normal</AlertPriority>
          <AlertSeverity>Error</AlertSeverity>
        </AlertSettings>
        <OperationalStates>
          <OperationalState ID="Running" MonitorTypeStateID="Running" HealthState="Success" />
          <OperationalState ID="NotRunning" MonitorTypeStateID="NotRunning" HealthState="Error" />
        </OperationalStates>
        <Configuration>
          <ComputerName>$Target/Host/Property[Type="Windows!Microsoft.Windows.Computer"]/PrincipalName$</ComputerName>
          <ServiceName>wmiApSrv</ServiceName>
          <CheckStartupType />
        </Configuration>
      </UnitMonitor>
      <UnitMonitor ID="Demo.StoreApp.Monitor.ClientReceiverProcessor" Accessibility="Internal" Enabled="true" Target="Demo.StoreApp.ComputerRole.StoreServer" ParentMonitorID="Health!System.Health.PerformanceState" Remotable="true" Priority="Normal" TypeID="Performance!System.Performance.ConsecutiveSamplesThreshold" ConfirmDelivery="false">
        <Category>PerformanceHealth</Category>
        <AlertSettings AlertMessage="Demo.StoreApp.Monitor.ClientReceiverProcessor_AlertMessageResourceID">
          <AlertOnState>Warning</AlertOnState>
          <AutoResolve>true</AutoResolve>
          <AlertPriority>Normal</AlertPriority>
          <AlertSeverity>Error</AlertSeverity>
          <AlertParameters>
            <AlertParameter1>$Data/Context/InstanceName$</AlertParameter1>
            <AlertParameter2>$Data/Context/ObjectName$</AlertParameter2>
            <AlertParameter3>$Data/Context/CounterName$</AlertParameter3>
            <AlertParameter4>$Data/Context/Value$</AlertParameter4>
            <AlertParameter5>$Data/Context/TimeSampled$</AlertParameter5>
          </AlertParameters>
        </AlertSettings>
        <OperationalStates>
          <OperationalState ID="ConditionFalse" MonitorTypeStateID="ConditionFalse" HealthState="Success" />
          <OperationalState ID="ConditionTrue" MonitorTypeStateID="ConditionTrue" HealthState="Warning" />
        </OperationalStates>
        <Configuration>
          <ComputerName>$Target/Host/Property[Type="Windows!Microsoft.Windows.Computer"]/NetworkName$</ComputerName>
          <CounterName><![CDATA[% Processor Time]]></CounterName>
          <ObjectName>Process</ObjectName>
          <InstanceName>WmiApSrv</InstanceName>
          <AllInstances>false</AllInstances>
          <Frequency>300</Frequency>
          <Threshold>80</Threshold>
          <Direction>greater</Direction>
          <NumSamples>3</NumSamples>
        </Configuration>
      </UnitMonitor>
      <UnitMonitor ID="Demo.StoreApp.Monitor.ConnectionToStoreServer" Accessibility="Internal" Enabled="true" Target="Demo.StoreApp.ComputerRole.StoreClient" ParentMonitorID="Health!System.Health.AvailabilityState" Remotable="true" Priority="Normal" TypeID="Windows!Microsoft.Windows.2SingleEventLog2StateMonitorType" ConfirmDelivery="true">
        <Category>StateCollection</Category>
        <AlertSettings AlertMessage="Demo.StoreApp.Monitor.ConnectionToStoreServer_AlertMessageResourceID">
          <AlertOnState>Error</AlertOnState>
          <AutoResolve>true</AutoResolve>
          <AlertPriority>Normal</AlertPriority>
          <AlertSeverity>Error</AlertSeverity>
          <AlertParameters>
            <AlertParameter1>$Data/Context/EventDescription$</AlertParameter1>
          </AlertParameters>
        </AlertSettings>
        <OperationalStates>
          <OperationalState ID="FirstEventRaised" MonitorTypeStateID="FirstEventRaised" HealthState="Error" />
          <OperationalState ID="SecondEventRaised" MonitorTypeStateID="SecondEventRaised" HealthState="Success" />
        </OperationalStates>
        <Configuration>
          <FirstComputerName>$Target/Host/Property[Type="Windows!Microsoft.Windows.Computer"]/NetworkName$</FirstComputerName>
          <FirstLogName>Application</FirstLogName>
          <FirstExpression>
            <And>
              <Expression>
                <SimpleExpression>
                  <ValueExpression>
                    <XPathQuery Type="UnsignedInteger">EventDisplayNumber</XPathQuery>
                  </ValueExpression>
                  <Operator>Equal</Operator>
                  <ValueExpression>
                    <Value Type="UnsignedInteger">302</Value>
                  </ValueExpression>
                </SimpleExpression>
              </Expression>
              <Expression>
                <SimpleExpression>
                  <ValueExpression>
                    <XPathQuery Type="String">PublisherName</XPathQuery>
                  </ValueExpression>
                  <Operator>Equal</Operator>
                  <ValueExpression>
                    <Value Type="String">StoreAppClient</Value>
                  </ValueExpression>
                </SimpleExpression>
              </Expression>
            </And>
          </FirstExpression>
          <SecondComputerName>$Target/Host/Property[Type="Windows!Microsoft.Windows.Computer"]/NetworkName$</SecondComputerName>
          <SecondLogName>Application</SecondLogName>
          <SecondExpression>
            <And>
              <Expression>
                <SimpleExpression>
                  <ValueExpression>
                    <XPathQuery Type="UnsignedInteger">EventDisplayNumber</XPathQuery>
                  </ValueExpression>
                  <Operator>Equal</Operator>
                  <ValueExpression>
                    <Value Type="UnsignedInteger">301</Value>
                  </ValueExpression>
                </SimpleExpression>
              </Expression>
              <Expression>
                <SimpleExpression>
                  <ValueExpression>
                    <XPathQuery Type="String">PublisherName</XPathQuery>
                  </ValueExpression>
                  <Operator>Equal</Operator>
                  <ValueExpression>
                    <Value Type="String">StoreAppClient</Value>
                  </ValueExpression>
                </SimpleExpression>
              </Expression>
            </And>
          </SecondExpression>
        </Configuration>
      </UnitMonitor>
      <UnitMonitor ID="Demo.StoreApp.Monitor.ProcessingService" Accessibility="Internal" Enabled="true" Target="Demo.StoreApp.ComputerRole.CentralServer" ParentMonitorID="Health!System.Health.AvailabilityState" Remotable="true" Priority="Normal" TypeID="Windows!Microsoft.Windows.CheckNTServiceStateMonitorType" ConfirmDelivery="false">
        <Category>AvailabilityHealth</Category>
        <AlertSettings AlertMessage="Demo.StoreApp.Monitor.ProcessingService_AlertMessageResourceID">
          <AlertOnState>Error</AlertOnState>
          <AutoResolve>true</AutoResolve>
          <AlertPriority>Normal</AlertPriority>
          <AlertSeverity>Error</AlertSeverity>
        </AlertSettings>
        <OperationalStates>
          <OperationalState ID="Running" MonitorTypeStateID="Running" HealthState="Success" />
          <OperationalState ID="NotRunning" MonitorTypeStateID="NotRunning" HealthState="Error" />
        </OperationalStates>
        <Configuration>
          <ComputerName />
          <ServiceName>wmiApSrv</ServiceName>
          <CheckStartupType />
        </Configuration>
      </UnitMonitor>
      <UnitMonitor ID="Demo.StoreApp.Monitor.QueueLength" Accessibility="Internal" Enabled="false" Target="Demo.StoreApp.CentralQueue" ParentMonitorID="Health!System.Health.PerformanceState" Remotable="true" Priority="Normal" TypeID="Windows!Microsoft.Windows.TimedScript.ThreeStateMonitorType" ConfirmDelivery="false">
        <Category>AvailabilityHealth</Category>
        <OperationalStates>
          <OperationalState ID="Success" MonitorTypeStateID="Success" HealthState="Success" />
          <OperationalState ID="Warning" MonitorTypeStateID="Warning" HealthState="Warning" />
          <OperationalState ID="Error" MonitorTypeStateID="Error" HealthState="Error" />
        </OperationalStates>
        <Configuration>
          <IntervalSeconds>600</IntervalSeconds>
          <SyncTime />
          <ScriptName>QueueStatistics.vbs</ScriptName>
          <Arguments>"$Target/Property[Type="Demo.StoreApp.CentralQueue"]/FolderPath$" false</Arguments>
          <ScriptBody><![CDATA['==================================================================================
' Script: 	QueueStats.vbs
' Date:	4/27/09	
' Author: 	Brian Wren, Microsoft Consulting Services
' Purpose:	Collects statistics for a single queue folder for StoreApp sample application.
'		Script does not support cookdown because it requires the folder path as an argument.
'		Since we expect multiple instances of queue folders on a particular agent, 
'			each instance will have its own instance of the script.
'==================================================================================

'Constants used for event logging
Const SCRIPT_NAME			= "QueueStats.vbs"
Const EVENT_LEVEL_ERROR 	= 1
Const EVENT_LEVEL_WARNING 	= 2
Const EVENT_LEVEL_INFO 		= 4

Const SCRIPT_STARTED		= 821
Const PROPERTYBAG_CREATED	= 822
Const SCRIPT_ENDED		= 825

'Setup variables sent in through script arguments
sFolder = WScript.Arguments(0)			'Path of the folder we'll be collecting statistics for.
bDebug = CBool(WScript.Arguments(1))	'If true, information events are loggged..

'Start by setting up API object.
Set oAPI = CreateObject("MOM.ScriptAPI")

'Log a message that script is starting only if Debug argument is True
sMessage =	"Script started" & VbCrLf & _
		"Folder: " & sFolder
Call LogDebugEvent(SCRIPT_STARTED,sMessage)

'Create a property bag.
Set oBag = oAPI.CreatePropertyBag()

'Get the FileSystemObject and the folder.
Set fso = CreateObject("Scripting.FileSystemObject")
Set oFolder = fso.GetFolder(sFolder)

'Get the statistics we're interested in for the specified folder.	
iCount = oFolder.Files.Count
iSize = 0
iOldestFile = 0
For Each oFile In oFolder.Files
	iSize = iSize + oFile.Size
	iAgeInMinutes = DateDiff("n",oFile.DateCreated,Now)
	If iAgeInMinutes > iOldestFile Then
		iOldestFile = iAgeInMinutes
	End If
Next 
sMessage =	"Property bag created" & VbCrLf & _
		"FileCount: " & iCount & VbCrLf & _
		"OldestFile: " & iOldestFile & VbCrLf & _
		"TotalSize: " & iSize
Call LogDebugEvent(PROPERTYBAG_CREATED,sMessage)

'Put the gathered statistics into the property bag.
Call oBag.AddValue("FileCount",iCount)
Call oBag.AddValue("OldestFile",iOldestFile)
Call oBag.AddValue("TotalSize",iSize)

'Return the property bag.
Call oAPI.Return(oBag)

Call LogDebugEvent (SCRIPT_ENDED,"Script ended.")

'==================================================================================
' Sub:		LogDebugEvent
' Purpose:	Logs an informational event to the Operations Manager event log 
'			only if Debug argument is true
'==================================================================================
Sub LogDebugEvent(EventNo,Message)

	Message = VbCrLf & Message
	If bDebug = True Then
    	Call oAPI.LogScriptEvent(SCRIPT_NAME,EventNo,EVENT_LEVEL_INFO,Message)
	End If
	
End Sub  
]]></ScriptBody>
          <TimeoutSeconds>60</TimeoutSeconds>
          <ErrorExpression>
            <SimpleExpression>
              <ValueExpression>
                <XPathQuery Type="Integer">Property[@Name='FileCount']</XPathQuery>
              </ValueExpression>
              <Operator>GreaterEqual</Operator>
              <ValueExpression>
                <Value Type="Integer">20</Value>
              </ValueExpression>
            </SimpleExpression>
          </ErrorExpression>
          <WarningExpression>
            <And>
              <Expression>
                <SimpleExpression>
                  <ValueExpression>
                    <XPathQuery Type="Integer">Property[@Name='FileCount']</XPathQuery>
                  </ValueExpression>
                  <Operator>GreaterEqual</Operator>
                  <ValueExpression>
                    <Value Type="Integer">10</Value>
                  </ValueExpression>
                </SimpleExpression>
              </Expression>
              <Expression>
                <SimpleExpression>
                  <ValueExpression>
                    <XPathQuery Type="Integer">Property[@Name='FileCount']</XPathQuery>
                  </ValueExpression>
                  <Operator>Less</Operator>
                  <ValueExpression>
                    <Value Type="Integer">20</Value>
                  </ValueExpression>
                </SimpleExpression>
              </Expression>
            </And>
          </WarningExpression>
          <SuccessExpression>
            <SimpleExpression>
              <ValueExpression>
                <XPathQuery Type="Integer">Property[@Name='FileCount']</XPathQuery>
              </ValueExpression>
              <Operator>Less</Operator>
              <ValueExpression>
                <Value Type="Integer">10</Value>
              </ValueExpression>
            </SimpleExpression>
          </SuccessExpression>
        </Configuration>
      </UnitMonitor>
      <UnitMonitor ID="Demo.StoreApp.Monitor.QueueLength.Cookdown" Accessibility="Internal" Enabled="false" Target="Demo.StoreApp.CentralQueue" ParentMonitorID="Health!System.Health.PerformanceState" Remotable="true" Priority="Normal" TypeID="Demo.StoreApp.MonitorType.QueueLength" ConfirmDelivery="true">
        <Category>Custom</Category>
        <OperationalStates>
          <OperationalState ID="UIGeneratedOpStateIddbbd15e4705043399862b19b47af8d16" MonitorTypeStateID="OverErrorThreshold" HealthState="Error" />
          <OperationalState ID="UIGeneratedOpStateId9fdedb393bf04e27baf2d7bc59da4663" MonitorTypeStateID="OverWarningThreshold" HealthState="Warning" />
          <OperationalState ID="UIGeneratedOpStateId5b20398cf4414b0ca0dee1a9db8f0146" MonitorTypeStateID="UnderThreshold" HealthState="Success" />
        </OperationalStates>
        <Configuration>
          <IntervalSeconds>600</IntervalSeconds>
          <SyncTime />
          <TopFolder>$Target/Host/Property[Type="Demo.StoreApp.ComputerRole.CentralServer"]/QueuePath$</TopFolder>
          <StoreCode>$Target/Property[Type="Demo.StoreApp.CentralQueue"]/StoreCode$</StoreCode>
          <WarningThreshold>10</WarningThreshold>
          <ErrorThreshold>20</ErrorThreshold>
          <Debug>false</Debug>
        </Configuration>
      </UnitMonitor>
      <UnitMonitor ID="Demo.StoreApp.Monitor.QueueLength.Cookdown.PowerShell" Accessibility="Internal" Enabled="true" Target="Demo.StoreApp.CentralQueue" ParentMonitorID="Health!System.Health.PerformanceState" Remotable="true" Priority="Normal" TypeID="Demo.StoreApp.MonitorType.QueueLength.PowerShell" ConfirmDelivery="true">
        <Category>Custom</Category>
        <OperationalStates>
          <OperationalState ID="UIGeneratedOpStateIddbbd15e4705043399862b19b47af8d16" MonitorTypeStateID="OverErrorThreshold" HealthState="Error" />
          <OperationalState ID="UIGeneratedOpStateId9fdedb393bf04e27baf2d7bc59da4663" MonitorTypeStateID="OverWarningThreshold" HealthState="Warning" />
          <OperationalState ID="UIGeneratedOpStateId5b20398cf4414b0ca0dee1a9db8f0146" MonitorTypeStateID="UnderThreshold" HealthState="Success" />
        </OperationalStates>
        <Configuration>
          <IntervalSeconds>600</IntervalSeconds>
          <SyncTime />
          <TopFolder>$Target/Host/Property[Type="Demo.StoreApp.ComputerRole.CentralServer"]/QueuePath$</TopFolder>
          <StoreCode>$Target/Property[Type="Demo.StoreApp.CentralQueue"]/StoreCode$</StoreCode>
          <WarningThreshold>10</WarningThreshold>
          <ErrorThreshold>20</ErrorThreshold>
          <Debug>true</Debug>
        </Configuration>
      </UnitMonitor>
      <DependencyMonitor ID="Demo.StoreApp.DependencyMonitor.ApplicationCentral" Accessibility="Internal" Enabled="true" Target="Demo.StoreApp.Application" ParentMonitorID="Health!System.Health.EntityState" Remotable="true" Priority="Normal" RelationshipType="Demo.StoreApp.ApplicationContainsCentral" MemberMonitor="Health!System.Health.EntityState">
        <Category>Custom</Category>
        <Algorithm>WorstOf</Algorithm>
        <MemberUnAvailable>Error</MemberUnAvailable>
      </DependencyMonitor>
      <DependencyMonitor ID="Demo.StoreApp.DependencyMonitor.ApplicationStores" Accessibility="Internal" Enabled="true" Target="Demo.StoreApp.Application" ParentMonitorID="Health!System.Health.EntityState" Remotable="true" Priority="Normal" RelationshipType="Demo.StoreApp.ApplicationContainsStores" MemberMonitor="Health!System.Health.EntityState">
        <Category>Custom</Category>
        <Algorithm>WorstOf</Algorithm>
        <MemberUnAvailable>Error</MemberUnAvailable>
      </DependencyMonitor>
      <DependencyMonitor ID="Demo.StoreApp.DependencyMonitor.CentralDependsOnCentralDatabase" Accessibility="Internal" Enabled="true" Target="Demo.StoreApp.Central" ParentMonitorID="Health!System.Health.AvailabilityState" Remotable="true" Priority="Normal" RelationshipType="Demo.StoreApp.CentralContainsSQLDatabase" MemberMonitor="Health!System.Health.AvailabilityState">
        <Category>Custom</Category>
        <Algorithm>WorstOf</Algorithm>
        <MemberUnAvailable>Error</MemberUnAvailable>
      </DependencyMonitor>
      <DependencyMonitor ID="Demo.StoreApp.DependencyMonitor.CentralDependsOnCentralServer" Accessibility="Internal" Enabled="true" Target="Demo.StoreApp.Central" ParentMonitorID="Health!System.Health.AvailabilityState" Remotable="true" Priority="Normal" RelationshipType="Demo.StoreApp.CentralContainsCentralServer" MemberMonitor="Health!System.Health.AvailabilityState">
        <Category>Custom</Category>
        <Algorithm>WorstOf</Algorithm>
        <MemberUnAvailable>Error</MemberUnAvailable>
      </DependencyMonitor>
      <DependencyMonitor ID="Demo.StoreApp.DependencyMonitor.CentralQueues" Accessibility="Internal" Enabled="true" Target="Demo.StoreApp.ComputerRole.CentralServer" ParentMonitorID="Health!System.Health.EntityState" Remotable="true" Priority="Normal" RelationshipType="Demo.StoreApp.ComputerRole.CentralServerHostsCentralQueue" MemberMonitor="Health!System.Health.EntityState">
        <Category>Custom</Category>
        <Algorithm>WorstOf</Algorithm>
        <MemberUnAvailable>Error</MemberUnAvailable>
      </DependencyMonitor>
      <DependencyMonitor ID="Demo.StoreApp.DependencyMonitor.StoreClients" Accessibility="Internal" Enabled="true" Target="Demo.StoreApp.Store" ParentMonitorID="Health!System.Health.AvailabilityState" Remotable="true" Priority="Normal" RelationshipType="Demo.StoreApp.StoreContainsClients" MemberMonitor="Health!System.Health.AvailabilityState">
        <Category>Custom</Category>
        <Algorithm>Percentage</Algorithm>
        <AlgorithmParameter>80</AlgorithmParameter>
        <MemberUnAvailable>Error</MemberUnAvailable>
      </DependencyMonitor>
      <DependencyMonitor ID="Demo.StoreApp.DependencyMonitor.StoreServer" Accessibility="Internal" Enabled="true" Target="Demo.StoreApp.Store" ParentMonitorID="Health!System.Health.AvailabilityState" Remotable="true" Priority="Normal" RelationshipType="Demo.StoreApp.StoreContainsStoreServer" MemberMonitor="Health!System.Health.AvailabilityState">
        <Category>Custom</Category>
        <Algorithm>WorstOf</Algorithm>
        <MemberUnAvailable>Error</MemberUnAvailable>
      </DependencyMonitor>
      <DependencyMonitor ID="Demo.StoreApp.DependencyMonitor.StoresStore" Accessibility="Internal" Enabled="true" Target="Demo.StoreApp.Stores" ParentMonitorID="Health!System.Health.AvailabilityState" Remotable="true" Priority="Normal" RelationshipType="Demo.StoreApp.StoresContainsStore" MemberMonitor="Health!System.Health.AvailabilityState">
        <Category>Custom</Category>
        <Algorithm>WorstOf</Algorithm>
        <MemberUnAvailable>Error</MemberUnAvailable>
      </DependencyMonitor>
    </Monitors>
    <Diagnostics>
      <Diagnostic ID="Demo.StoreApp.Diagnostic.CheckForDumpFile" Accessibility="Internal" Enabled="true" Target="Demo.StoreApp.ComputerRole.StoreServer" Monitor="Demo.StoreApp.Monitor.ClientReceiver" ExecuteOnState="Error" Remotable="true" Timeout="300">
        <Category>Custom</Category>
        <ProbeAction ID="Script" TypeID="Windows!Microsoft.Windows.ScriptPropertyBagProbe">
          <ScriptName>DumpFileExists.vbs</ScriptName>
          <Arguments />
          <ScriptBody><![CDATA[
'==================================================================================
' Script: 	CheckForDumpFile.vbs
' Date:		4/27/09	
' Author: 	Brian Wren, Microsoft Consulting Services
' Purpose:	Checks for existance of dump file for StoreApp sample application.
'			Dump file is dummy text file located at C:\StoreApp\ClientReceiver.dmp.
'==================================================================================

Set oAPI = CreateObject("MOM.ScriptAPI")
Set oBag = oAPI.CreatePropertyBag()

Set fso = CreateObject("Scripting.FileSystemObject")
If (fso.FileExists("C:\StoreApp\ClientReceiver.dmp")) Then
	Call oBag.AddValue("FileExists","yes")
Else
	Call oBag.AddValue("FileExists","no")
End If
oAPI.Return(oBag)
]]></ScriptBody>
          <TimeoutSeconds>30</TimeoutSeconds>
        </ProbeAction>
      </Diagnostic>
    </Diagnostics>
    <Recoveries>
      <Recovery ID="Demo.StoreApp.Recovery.ClearDumpFile" Accessibility="Internal" Enabled="true" Target="Demo.StoreApp.ComputerRole.StoreServer" Monitor="Demo.StoreApp.Monitor.ClientReceiver" ResetMonitor="true" ExecuteOnDiagnostic="Demo.StoreApp.Diagnostic.CheckForDumpFile" Remotable="true" Timeout="300">
        <Category>Custom</Category>
        <ConditionDetection ID="CheckForFileExists" TypeID="System!System.ExpressionFilter">
          <Expression>
            <SimpleExpression>
              <ValueExpression>
                <XPathQuery Type="String">Diagnostic/DataItem/Property[@Name='FileExists']</XPathQuery>
              </ValueExpression>
              <Operator>Equal</Operator>
              <ValueExpression>
                <Value Type="String">yes</Value>
              </ValueExpression>
            </SimpleExpression>
          </Expression>
        </ConditionDetection>
        <WriteAction ID="ClearDumpFile" TypeID="Windows!Microsoft.Windows.ScriptWriteAction">
          <ScriptName>ClearDumpFile.vbs</ScriptName>
          <Arguments />
          <ScriptBody><![CDATA[
'==================================================================================
' Script: 	ClearDumpFile.vbs
' Date:		4/27/09	
' Author: 	Brian Wren, Microsoft Consulting Services
' Purpose:	Clears dump file and restarts ClientReceiver service for StoreApp sample application.
'			Dump file is dummy text file located at C:\StoreApp\ClientReceiver.dmp.
'==================================================================================
Const EVENT_LEVEL_ERROR 	= 1
Const EVENT_LEVEL_WARNING 	= 2
Const EVENT_LEVEL_INFO 		= 4

Set oAPI = CreateObject("MOM.ScriptAPI")

Set fso = CreateObject("Scripting.FileSystemObject")
fso.DeleteFile("C:\StoreApp\ClientReceiver.dmp")

Set oWMI = GetObject("winmgmts:\\.\root\cimv2")
Set cServices = oWMI.ExecQuery("SELECT * FROM Win32_Service WHERE Name = 'Alerter'")
For Each oService in cServices
    oService.StartService()
Next

Call oAPI.LogScriptEvent("ClearDumpFile.vbs",850,EVENT_LEVEL_INFO, "Dump file removed and service restarted.")
WScript.Echo "Dump file removed and service restarted."]]></ScriptBody>
          <TimeoutSeconds>30</TimeoutSeconds>
        </WriteAction>
      </Recovery>
    </Recoveries>
  </Monitoring>
  <Presentation>
    <Views>
      <View ID="Demo.StoreApp.View.Performance.QueueLength" Accessibility="Internal" Enabled="true" Target="Demo.StoreApp.CentralQueue" TypeID="SC!Microsoft.SystemCenter.PerformanceViewType" Visible="true">
        <Category>Operations</Category>
        <Criteria>
          <Object>StoreApp</Object>
          <Counter>QueueLength</Counter>
        </Criteria>
        <Presentation />
        <Target />
      </View>
      <View ID="Demo.StoreApp.View.State.CentralQueues" Accessibility="Internal" Enabled="true" Target="Demo.StoreApp.CentralQueue" TypeID="SC!Microsoft.SystemCenter.StateViewType" Visible="true">
        <Category>StateCollection</Category>
        <Criteria />
      </View>
      <View ID="Demo.StoreApp.View.State.CentralServer" Accessibility="Internal" Enabled="true" Target="Demo.StoreApp.ComputerRole.CentralServer" TypeID="SC!Microsoft.SystemCenter.StateViewType" Visible="true">
        <Category>StateCollection</Category>
        <Criteria />
      </View>
      <View ID="Demo.StoreApp.View.State.StoreApp" Accessibility="Internal" Enabled="true" Target="Demo.StoreApp.Application" TypeID="SC!Microsoft.SystemCenter.StateViewType" Visible="true">
        <Category>StateCollection</Category>
        <Criteria />
      </View>
      <View ID="Demo.StoreApp.View.State.StoreClients" Accessibility="Internal" Enabled="true" Target="Demo.StoreApp.ComputerRole.StoreClient" TypeID="SC!Microsoft.SystemCenter.StateViewType" Visible="true">
        <Category>StateCollection</Category>
        <Criteria />
      </View>
      <View ID="Demo.StoreApp.View.State.Stores" Accessibility="Internal" Enabled="true" Target="Demo.StoreApp.Store" TypeID="SC!Microsoft.SystemCenter.StateViewType" Visible="true">
        <Category>StateCollection</Category>
        <Criteria />
      </View>
      <View ID="Demo.StoreApp.View.State.StoreServers" Accessibility="Internal" Enabled="true" Target="Demo.StoreApp.ComputerRole.StoreServer" TypeID="SC!Microsoft.SystemCenter.StateViewType" Visible="true">
        <Category>StateCollection</Category>
        <Criteria />
      </View>
    </Views>
    <Folders>
      <Folder ID="Demo.StoreApp.Folder.Central" Accessibility="Internal" ParentFolder="Demo.StoreApp.Folder.Top" />
      <Folder ID="Demo.StoreApp.Folder.Stores" Accessibility="Internal" ParentFolder="Demo.StoreApp.Folder.Top" />
      <Folder ID="Demo.StoreApp.Folder.Top" Accessibility="Internal" ParentFolder="SC!Microsoft.SystemCenter.Monitoring.ViewFolder.Root" />
    </Folders>
    <FolderItems>
      <FolderItem ElementID="Demo.StoreApp.View.Performance.QueueLength" Folder="Demo.StoreApp.Folder.Central" />
      <FolderItem ElementID="Demo.StoreApp.View.State.CentralQueues" Folder="Demo.StoreApp.Folder.Central" />
      <FolderItem ElementID="Demo.StoreApp.View.State.CentralServer" Folder="Demo.StoreApp.Folder.Central" />
      <FolderItem ElementID="Demo.StoreApp.View.State.StoreApp" Folder="Demo.StoreApp.Folder.Top" />
      <FolderItem ElementID="Demo.StoreApp.View.State.StoreClients" Folder="Demo.StoreApp.Folder.Stores" />
      <FolderItem ElementID="Demo.StoreApp.View.State.Stores" Folder="Demo.StoreApp.Folder.Stores" />
      <FolderItem ElementID="Demo.StoreApp.View.State.StoreServers" Folder="Demo.StoreApp.Folder.Stores" />
    </FolderItems>
    <StringResources>
      <StringResource ID="Demo.StoreApp.Monitor.ClientApplicationRunning_AlertMessageResourceID" />
      <StringResource ID="Demo.StoreApp.Monitor.ClientReceiver_AlertMessageResourceID" />
      <StringResource ID="Demo.StoreApp.Monitor.ClientReceiverProcessor_AlertMessageResourceID" />
      <StringResource ID="Demo.StoreApp.Monitor.ConnectionToStoreServer_AlertMessageResourceID" />
      <StringResource ID="Demo.StoreApp.Monitor.ProcessingService_AlertMessageResourceID" />
      <StringResource ID="Demo.StoreApp.Rule.BadQueueEntry.Bad.AlertMessage" />
    </StringResources>
  </Presentation>
  <LanguagePacks>
    <LanguagePack ID="ENU" IsDefault="true">
      <DisplayStrings>
        <DisplayString ElementID="Demo.StoreApp">
          <Name>Demo Stores</Name>
        </DisplayString>
        <DisplayString ElementID="Demo.StoreApp.Application">
          <Name>StoreApp</Name>
        </DisplayString>
        <DisplayString ElementID="Demo.StoreApp.ApplicationContainsCentral">
          <Name>Application Contains Central</Name>
        </DisplayString>
        <DisplayString ElementID="Demo.StoreApp.ApplicationContainsStores">
          <Name>Application Hosts Stores</Name>
        </DisplayString>
        <DisplayString ElementID="Demo.StoreApp.Central">
          <Name>Central</Name>
        </DisplayString>
        <DisplayString ElementID="Demo.StoreApp.CentralContainsCentralServer">
          <Name>Central Contains Central Server</Name>
        </DisplayString>
        <DisplayString ElementID="Demo.StoreApp.CentralContainsSQLDatabase">
          <Name>Central Contains SQL Database</Name>
        </DisplayString>
        <DisplayString ElementID="Demo.StoreApp.CentralQueue">
          <Name>Central Queue</Name>
        </DisplayString>
        <DisplayString ElementID="Demo.StoreApp.CentralQueue" SubElementID="FolderPath">
          <Name>Folder Path</Name>
        </DisplayString>
        <DisplayString ElementID="Demo.StoreApp.CentralQueue" SubElementID="StoreCode">
          <Name>Store Code</Name>
        </DisplayString>
        <DisplayString ElementID="Demo.StoreApp.ComputerRole">
          <Name>Store Computer</Name>
        </DisplayString>
        <DisplayString ElementID="Demo.StoreApp.ComputerRole" SubElementID="StoreCode">
          <Name>Store Code</Name>
        </DisplayString>
        <DisplayString ElementID="Demo.StoreApp.ComputerRole.CentralServer">
          <Name>Central Server</Name>
        </DisplayString>
        <DisplayString ElementID="Demo.StoreApp.ComputerRole.CentralServer" SubElementID="DatabaseName">
          <Name>Database Name</Name>
        </DisplayString>
        <DisplayString ElementID="Demo.StoreApp.ComputerRole.CentralServer" SubElementID="DatabaseServer">
          <Name>Database Server</Name>
        </DisplayString>
        <DisplayString ElementID="Demo.StoreApp.ComputerRole.CentralServer" SubElementID="QueuePath">
          <Name>Queue Path</Name>
        </DisplayString>
        <DisplayString ElementID="Demo.StoreApp.ComputerRole.CentralServerHostsCentralQueue">
          <Name>Central Server Hosts Central Queue</Name>
        </DisplayString>
        <DisplayString ElementID="Demo.StoreApp.ComputerRole.StoreClient">
          <Name>Store Client</Name>
        </DisplayString>
        <DisplayString ElementID="Demo.StoreApp.ComputerRole.StoreServer">
          <Name>Store Server</Name>
        </DisplayString>
        <DisplayString ElementID="Demo.StoreApp.DataSource.DiscoverStore">
          <Name>Discover Store Data Source</Name>
        </DisplayString>
        <DisplayString ElementID="Demo.StoreApp.DataSource.QueueStatistics">
          <Name>Queue Statistics Data Source</Name>
        </DisplayString>
        <DisplayString ElementID="Demo.StoreApp.DataSource.QueueStatistics.PowerShell">
          <Name>Queue Statistics PowerShell Data Source</Name>
          <Description />
        </DisplayString>
        <DisplayString ElementID="Demo.StoreApp.DependencyMonitor.ApplicationCentral">
          <Name>Central Components</Name>
        </DisplayString>
        <DisplayString ElementID="Demo.StoreApp.DependencyMonitor.ApplicationStores">
          <Name>Stores</Name>
        </DisplayString>
        <DisplayString ElementID="Demo.StoreApp.DependencyMonitor.CentralDependsOnCentralDatabase">
          <Name>Central Database</Name>
        </DisplayString>
        <DisplayString ElementID="Demo.StoreApp.DependencyMonitor.CentralDependsOnCentralServer">
          <Name>Central Server</Name>
        </DisplayString>
        <DisplayString ElementID="Demo.StoreApp.DependencyMonitor.CentralQueues">
          <Name>Queues</Name>
        </DisplayString>
        <DisplayString ElementID="Demo.StoreApp.DependencyMonitor.StoreClients">
          <Name>Clients</Name>
        </DisplayString>
        <DisplayString ElementID="Demo.StoreApp.DependencyMonitor.StoreServer">
          <Name>Store Server</Name>
        </DisplayString>
        <DisplayString ElementID="Demo.StoreApp.DependencyMonitor.StoresStore">
          <Name>Store</Name>
        </DisplayString>
        <DisplayString ElementID="Demo.StoreApp.Diagnostic.CheckForDumpFile">
          <Name>Check for Dump File</Name>
        </DisplayString>
        <DisplayString ElementID="Demo.StoreApp.Discovery.CentralDatabaseRelationship">
          <Name>Discover Central Database Relationship</Name>
        </DisplayString>
        <DisplayString ElementID="Demo.StoreApp.Discovery.CentralQueues">
          <Name>Discover Central Queues</Name>
        </DisplayString>
        <DisplayString ElementID="Demo.StoreApp.Discovery.CentralQueues.PowerShell">
          <Name>Discover Central Queues (PowerShell)</Name>
          <Description />
        </DisplayString>
        <DisplayString ElementID="Demo.StoreApp.Discovery.CentralServer">
          <Name>Discover Central Server</Name>
        </DisplayString>
        <DisplayString ElementID="Demo.StoreApp.Discovery.PopulateApplication">
          <Name>Populate Application</Name>
        </DisplayString>
        <DisplayString ElementID="Demo.StoreApp.Discovery.PopulateStores">
          <Name>Populate Stores</Name>
        </DisplayString>
        <DisplayString ElementID="Demo.StoreApp.Discovery.Store.Client">
          <Name>Discover Store (Client)</Name>
        </DisplayString>
        <DisplayString ElementID="Demo.StoreApp.Discovery.Store.Server">
          <Name>Discover Store (Server)</Name>
        </DisplayString>
        <DisplayString ElementID="Demo.StoreApp.Discovery.StoreClient">
          <Name>Discover Store Client</Name>
        </DisplayString>
        <DisplayString ElementID="Demo.StoreApp.Discovery.StoreServer">
          <Name>Discover Store Server</Name>
        </DisplayString>
        <DisplayString ElementID="Demo.StoreApp.Folder.Central">
          <Name>Central</Name>
        </DisplayString>
        <DisplayString ElementID="Demo.StoreApp.Folder.Stores">
          <Name>Stores</Name>
        </DisplayString>
        <DisplayString ElementID="Demo.StoreApp.Folder.Top">
          <Name>Stores Demo</Name>
        </DisplayString>
        <DisplayString ElementID="Demo.StoreApp.Monitor.BadQueueEntry">
          <Name>Queue Entries</Name>
        </DisplayString>
        <DisplayString ElementID="Demo.StoreApp.Monitor.BadQueueEntry.Bad">
          <Name>Queue Entries (Bad)</Name>
        </DisplayString>
        <DisplayString ElementID="Demo.StoreApp.Monitor.ClientApplicationRunning">
          <Name>Client Application Running</Name>
        </DisplayString>
        <DisplayString ElementID="Demo.StoreApp.Monitor.ClientApplicationRunning" SubElementID="UIGeneratedOpStateId4a2f9d702096492b9359f26cac6e8687">
          <Name>OutsideRangeState</Name>
        </DisplayString>
        <DisplayString ElementID="Demo.StoreApp.Monitor.ClientApplicationRunning" SubElementID="UIGeneratedOpStateIdc4f7c56f35144002b312310b3cb6cebd">
          <Name>InsideRangeState</Name>
        </DisplayString>
        <DisplayString ElementID="Demo.StoreApp.Monitor.ClientApplicationRunning_AlertMessageResourceID">
          <Name>Store client application not running.</Name>
          <Description>Please see the alert context for details.</Description>
        </DisplayString>
        <DisplayString ElementID="Demo.StoreApp.Monitor.ClientReceiver">
          <Name>Client Receiver Service</Name>
        </DisplayString>
        <DisplayString ElementID="Demo.StoreApp.Monitor.ClientReceiver" SubElementID="NotRunning">
          <Name>NotRunning</Name>
        </DisplayString>
        <DisplayString ElementID="Demo.StoreApp.Monitor.ClientReceiver" SubElementID="Running">
          <Name>Running</Name>
        </DisplayString>
        <DisplayString ElementID="Demo.StoreApp.Monitor.ClientReceiver_AlertMessageResourceID">
          <Name>Client Receiver Service is not running.</Name>
          <Description>Please see the alert context for details.</Description>
        </DisplayString>
        <DisplayString ElementID="Demo.StoreApp.Monitor.ClientReceiverProcessor">
          <Name>Client Receiver Processor</Name>
        </DisplayString>
        <DisplayString ElementID="Demo.StoreApp.Monitor.ClientReceiverProcessor" SubElementID="ConditionFalse">
          <Name>ConditionFalse</Name>
        </DisplayString>
        <DisplayString ElementID="Demo.StoreApp.Monitor.ClientReceiverProcessor" SubElementID="ConditionTrue">
          <Name>ConditionTrue</Name>
        </DisplayString>
        <DisplayString ElementID="Demo.StoreApp.Monitor.ClientReceiverProcessor_AlertMessageResourceID">
          <Name>Client Receiver Processor</Name>
          <Description>
            Instance {0}
            Object {1}
            Counter {2}
            Has a value {3}
            At time {4}
          </Description>
        </DisplayString>
        <DisplayString ElementID="Demo.StoreApp.Monitor.ConnectionToStoreServer">
          <Name>Connection to Store Server</Name>
        </DisplayString>
        <DisplayString ElementID="Demo.StoreApp.Monitor.ConnectionToStoreServer" SubElementID="FirstEventRaised">
          <Name>FirstEventRaised</Name>
        </DisplayString>
        <DisplayString ElementID="Demo.StoreApp.Monitor.ConnectionToStoreServer" SubElementID="SecondEventRaised">
          <Name>SecondEventRaised</Name>
        </DisplayString>
        <DisplayString ElementID="Demo.StoreApp.Monitor.ConnectionToStoreServer_AlertMessageResourceID">
          <Name>Connection to store server was lost.</Name>
          <Description>Event Description: {0}</Description>
        </DisplayString>
        <DisplayString ElementID="Demo.StoreApp.Monitor.ProcessingService">
          <Name>Processing Service</Name>
        </DisplayString>
        <DisplayString ElementID="Demo.StoreApp.Monitor.ProcessingService" SubElementID="NotRunning">
          <Name>NotRunning</Name>
        </DisplayString>
        <DisplayString ElementID="Demo.StoreApp.Monitor.ProcessingService" SubElementID="Running">
          <Name>Running</Name>
        </DisplayString>
        <DisplayString ElementID="Demo.StoreApp.Monitor.ProcessingService_AlertMessageResourceID">
          <Name>Processing Service has stopped on Central Server.</Name>
          <Description>Please see the alert context for details.</Description>
        </DisplayString>
        <DisplayString ElementID="Demo.StoreApp.Monitor.QueueLength">
          <Name>Queue Length</Name>
          <Description />
        </DisplayString>
        <DisplayString ElementID="Demo.StoreApp.Monitor.QueueLength" SubElementID="Error">
          <Name>Error</Name>
        </DisplayString>
        <DisplayString ElementID="Demo.StoreApp.Monitor.QueueLength" SubElementID="Success">
          <Name>Success</Name>
        </DisplayString>
        <DisplayString ElementID="Demo.StoreApp.Monitor.QueueLength" SubElementID="Warning">
          <Name>Warning</Name>
        </DisplayString>
        <DisplayString ElementID="Demo.StoreApp.Monitor.QueueLength.Cookdown">
          <Name>Queue Length (Cookdown)</Name>
          <Description />
        </DisplayString>
        <DisplayString ElementID="Demo.StoreApp.Monitor.QueueLength.Cookdown" SubElementID="UIGeneratedOpStateId5b20398cf4414b0ca0dee1a9db8f0146">
          <Name>UnderThreshold</Name>
        </DisplayString>
        <DisplayString ElementID="Demo.StoreApp.Monitor.QueueLength.Cookdown" SubElementID="UIGeneratedOpStateId9fdedb393bf04e27baf2d7bc59da4663">
          <Name>OverWarningThreshold</Name>
        </DisplayString>
        <DisplayString ElementID="Demo.StoreApp.Monitor.QueueLength.Cookdown" SubElementID="UIGeneratedOpStateIddbbd15e4705043399862b19b47af8d16">
          <Name>OverErrorThreshold</Name>
        </DisplayString>
        <DisplayString ElementID="Demo.StoreApp.Monitor.QueueLength.Cookdown.PowerShell">
          <Name>Queue Length (PowerShell)</Name>
          <Description />
        </DisplayString>
        <DisplayString ElementID="Demo.StoreApp.Monitor.QueueLength.Cookdown.PowerShell" SubElementID="UIGeneratedOpStateId5b20398cf4414b0ca0dee1a9db8f0146">
          <Name>UIGeneratedOpStateId5b20398cf4414b0ca0dee1a9db8f0146</Name>
        </DisplayString>
        <DisplayString ElementID="Demo.StoreApp.Monitor.QueueLength.Cookdown.PowerShell" SubElementID="UIGeneratedOpStateId9fdedb393bf04e27baf2d7bc59da4663">
          <Name>UIGeneratedOpStateId9fdedb393bf04e27baf2d7bc59da4663</Name>
        </DisplayString>
        <DisplayString ElementID="Demo.StoreApp.Monitor.QueueLength.Cookdown.PowerShell" SubElementID="UIGeneratedOpStateIddbbd15e4705043399862b19b47af8d16">
          <Name>UIGeneratedOpStateIddbbd15e4705043399862b19b47af8d16</Name>
        </DisplayString>
        <DisplayString ElementID="Demo.StoreApp.MonitorType.QueueLength">
          <Name>Queue Length Monitor Type</Name>
        </DisplayString>
        <DisplayString ElementID="Demo.StoreApp.MonitorType.QueueLength.PowerShell">
          <Name>Queue Length Monitor Type (PowerShell)</Name>
        </DisplayString>
        <DisplayString ElementID="Demo.StoreApp.Recovery.ClearDumpFile">
          <Name>Clear Dump File and Restart Service</Name>
        </DisplayString>
        <DisplayString ElementID="Demo.StoreApp.Rule.BadQueueEntry.Bad.AlertMessage">
          <Name>Invalid queue entry</Name>
          <Description>Event Description: {0}</Description>
        </DisplayString>
        <DisplayString ElementID="Demo.StoreApp.Rule.CollectClientReceiverMemory">
          <Name>Collect Client Receiver Menory</Name>
          <Description>Simple performance collection rule.</Description>
        </DisplayString>
        <DisplayString ElementID="Demo.StoreApp.Rule.CollectQueueLength">
          <Name>Collect Queue Length</Name>
        </DisplayString>
        <DisplayString ElementID="Demo.StoreApp.Rule.CollectQueueLength.Cookdown">
          <Name>Collect Queue Length (Cookdown)</Name>
        </DisplayString>
        <DisplayString ElementID="Demo.StoreApp.Rule.CollectQueueLength.Cookdown.PowerShell">
          <Name>Collect Queue Length (Cookdown PowerShell)</Name>
          <Description />
        </DisplayString>
        <DisplayString ElementID="Demo.StoreApp.Store">
          <Name>Store</Name>
        </DisplayString>
        <DisplayString ElementID="Demo.StoreApp.Store" SubElementID="StoreCode">
          <Name>Store Code</Name>
        </DisplayString>
        <DisplayString ElementID="Demo.StoreApp.StoreContainsClients">
          <Name>Store Contains Clients</Name>
        </DisplayString>
        <DisplayString ElementID="Demo.StoreApp.StoreContainsStoreServer">
          <Name>Store Contains Store Server</Name>
        </DisplayString>
        <DisplayString ElementID="Demo.StoreApp.Stores">
          <Name>Stores</Name>
        </DisplayString>
        <DisplayString ElementID="Demo.StoreApp.StoresContainsStore">
          <Name>Stores Hosts Store</Name>
        </DisplayString>
        <DisplayString ElementID="Demo.StoreApp.View.Performance.QueueLength">
          <Name>Queue Length</Name>
        </DisplayString>
        <DisplayString ElementID="Demo.StoreApp.View.State.CentralQueues">
          <Name>Queues</Name>
        </DisplayString>
        <DisplayString ElementID="Demo.StoreApp.View.State.CentralServer">
          <Name>Central Server</Name>
        </DisplayString>
        <DisplayString ElementID="Demo.StoreApp.View.State.StoreApp">
          <Name>StoreApp</Name>
        </DisplayString>
        <DisplayString ElementID="Demo.StoreApp.View.State.StoreClients">
          <Name>Store Clients</Name>
        </DisplayString>
        <DisplayString ElementID="Demo.StoreApp.View.State.Stores">
          <Name>Store</Name>
        </DisplayString>
        <DisplayString ElementID="Demo.StoreApp.View.State.StoreServers">
          <Name>Store Servers</Name>
        </DisplayString>
      </DisplayStrings>
    </LanguagePack>
  </LanguagePacks>
</ManagementPack>