﻿<?xml version="1.0" encoding="utf-8"?>
<ManagementPack ContentReadable="true" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <Manifest>
    <Identity>
      <ID>NTServiceBasedDiscoverySample.MP</ID>
      <Version>12.0.0.0</Version>
    </Identity>
    <Name>NTServiceBasedDiscoverySample.MP</Name>
    <References>
      <Reference Alias="SC">
        <ID>Microsoft.SystemCenter.Library</ID>
        <Version>6.0.6278.0</Version>
        <PublicKeyToken>9396306c2be7fcc4</PublicKeyToken>
      </Reference>
      <Reference Alias="System">
        <ID>System.Library</ID>
        <Version>6.0.6278.0</Version>
        <PublicKeyToken>9396306c2be7fcc4</PublicKeyToken>
      </Reference>
      <Reference Alias="Windows">
        <ID>Microsoft.Windows.Library</ID>
        <Version>6.0.6278.0</Version>
        <PublicKeyToken>9396306c2be7fcc4</PublicKeyToken>
      </Reference>
      <Reference Alias="Health">
        <ID>System.Health.Library</ID>
        <Version>6.0.6278.0</Version>
        <PublicKeyToken>9396306c2be7fcc4</PublicKeyToken>
      </Reference>
    </References>
  </Manifest>
  <TypeDefinitions>
    <EntityTypes>
      <ClassTypes>
        <ClassType ID="Sample.ServerRole" Accessibility="Public" Abstract="false" Base="Windows!Microsoft.Windows.ComputerRole" Hosted="true" Singleton="false" />
      </ClassTypes>
    </EntityTypes>
    <ModuleTypes>
      <DataSourceModuleType ID="Sample.Discovery.DataSource" Accessibility="Internal" Batching="false">
        <Configuration>
          <xsd:element name="IntervalSeconds" type="xsd:unsignedInt" xmlns:xsd="http://www.w3.org/2001/XMLSchema" />
        </Configuration>
        <OverrideableParameters>
          <OverrideableParameter ID="IntervalSeconds" Selector="$Config/IntervalSeconds$" ParameterType="int" />
        </OverrideableParameters>
        <ModuleImplementation Isolation="Any">
          <Composite>
            <MemberModules>
              <DataSource ID="Scheduler" TypeID="System!System.Discovery.Scheduler">
                <Scheduler>
                  <SimpleReccuringSchedule>
                    <Interval Unit="Seconds">$Config/IntervalSeconds$</Interval>
                  </SimpleReccuringSchedule>
                  <ExcludeDates />
                </Scheduler>
              </DataSource>
              <ProbeAction ID="Probe" TypeID="Sample.Discovery.Probe">
                <ComputerName>$Target/Property[Type='Windows!Microsoft.Windows.Computer']/NetworkName$</ComputerName>
                <ServiceName>Dhcp</ServiceName>
              </ProbeAction>
              <ConditionDetection ID="Mapper" TypeID="System!System.Discovery.ClassSnapshotDataMapper">
                <ClassId>$MPElement[Name="Sample.ServerRole"]$</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>
                      <!--This is going to be the display name of the object created. As an example I am putting in the computer on which its running-->
                      <Name>$MPElement[Name="System!System.Entity"]/DisplayName$</Name>
                      <Value>$Target/Property[Type="Windows!Microsoft.Windows.Computer"]/PrincipalName$</Value>
                    </Setting>
                  </Settings>
                </InstanceSettings>
              </ConditionDetection>
            </MemberModules>
            <Composition>
              <Node ID="Mapper">
                <Node ID="Probe">
                  <Node ID="Scheduler" />
                </Node>
              </Node>
            </Composition>
          </Composite>
        </ModuleImplementation>
        <OutputType>System!System.BaseData</OutputType>
      </DataSourceModuleType>
      <DataSourceModuleType ID="Sample.ServiceStatus.DataSource" Accessibility="Internal" Batching="false">
        <Configuration>
          <xsd:element minOccurs="1" name="IntervalSeconds" type="xsd:integer" />
          <xsd:element minOccurs="1" name="TimeoutSeconds" type="xsd:integer" />
          <xsd:element minOccurs="1" name="ComputerPrincipalName" type="xsd:string" />
          <xsd:element minOccurs="1" name="ServiceName" type="xsd:string" />
        </Configuration>
        <OverrideableParameters>
          <OverrideableParameter ID="IntervalSeconds" Selector="$Config/IntervalSeconds$" ParameterType="int" />
          <OverrideableParameter ID="TimeoutSeconds" Selector="$Config/TimeoutSeconds$" ParameterType="int" />
        </OverrideableParameters>
        <ModuleImplementation Isolation="Any">
          <Composite>
            <MemberModules>
              <DataSource ID="Scheduler" TypeID="System!System.Discovery.Scheduler">
                <Scheduler>
                  <SimpleReccuringSchedule>
                    <Interval Unit="Seconds">$Config/IntervalSeconds$</Interval>
                  </SimpleReccuringSchedule>
                  <ExcludeDates />
                </Scheduler>
              </DataSource>
              <ProbeAction ID="Probe" TypeID="Sample.ServiceStatus.Probe">
                <TimeoutSeconds>$Config/TimeoutSeconds$</TimeoutSeconds>
                <ComputerPrincipalName>$Config/ComputerPrincipalName$</ComputerPrincipalName>
                <ServiceName>$Config/ServiceName$</ServiceName>
              </ProbeAction>
            </MemberModules>
            <Composition>
              <Node ID="Probe">
                <Node ID="Scheduler" />
              </Node>
            </Composition>
          </Composite>
        </ModuleImplementation>
        <OutputType>System!System.PropertyBagData</OutputType>
      </DataSourceModuleType>
      <ProbeActionModuleType ID="Sample.ServiceStatus.Probe" Accessibility="Public" Batching="false" PassThrough="false">
        <Configuration>
          <xsd:element minOccurs="1" name="TimeoutSeconds" type="xsd:integer" />
          <xsd:element minOccurs="1" name="ComputerPrincipalName" type="xsd:string" />
          <xsd:element minOccurs="1" name="ServiceName" type="xsd:string" />
        </Configuration>
        <ModuleImplementation Isolation="Any">
          <Composite>
            <MemberModules>
              <ProbeAction ID="PassThrough" TypeID="System!System.PassThroughProbe" />
              <ProbeAction ID="Script" TypeID="Windows!Microsoft.Windows.ScriptPropertyBagProbe">
                <ScriptName>GetServiceStatus.vbs</ScriptName>
                <Arguments>$Config/ComputerPrincipalName$ $Config/ServiceName$</Arguments>
                <ScriptBody>
                  <![CDATA[
                  call Main()

                  Sub Main()

                  Dim oAPI
                  Dim oBag
                  Dim serviceName
                  Dim computerName
                  Dim statusColl
                  Dim serviceStatus

                  computerName  = WScript.Arguments(0)
                  serviceName   = WScript.Arguments(1)
                                    
                  Set wmi = GetObject("winmgmts:\\" & computerName  & "\root\cimv2")

                  wql = "SELECT * FROM Win32_Service WHERE Name='" & serviceName & "'"

                  Set statusColl = wmi.ExecQuery(wql)

                  If statusColl.Count = 1 Then
                    Dim service
                    Set service = statusColl.ItemIndex(0)

                    serviceStatus = service.State
                  End If

                  Set oAPI = CreateObject("MOM.ScriptAPI")
                  Set oBag = oAPI.CreatePropertyBag()
                  oBag.AddValue "ServiceStatus", serviceStatus

                  oAPI.Return(oBag)
                  End Sub
                  ]]>
                </ScriptBody>
                <TimeoutSeconds>$Config/TimeoutSeconds$</TimeoutSeconds>
              </ProbeAction>
            </MemberModules>
            <Composition>
              <Node ID="Script">
                <Node ID="PassThrough" />
              </Node>
            </Composition>
          </Composite>
        </ModuleImplementation>
        <OutputType>System!System.PropertyBagData</OutputType>
        <TriggerOnly>true</TriggerOnly>
      </ProbeActionModuleType>
      <ProbeActionModuleType ID="Sample.Discovery.Probe" Accessibility="Public" Batching="false" PassThrough="false">
        <Configuration>
          <xsd:element name="ComputerName" type="xsd:string" xmlns:xsd="http://www.w3.org/2001/XMLSchema" />
          <xsd:element name="ServiceName" type="xsd:string" xmlns:xsd="http://www.w3.org/2001/XMLSchema" />
        </Configuration>
        <ModuleImplementation Isolation="Any">
          <Composite>
            <MemberModules>
              <ProbeAction ID="Probe" TypeID="Windows!Microsoft.Windows.ExistingWin32ServiceInformationProbe">
                <ComputerName>$Config/ComputerName$</ComputerName>
                <ServiceName>$Config/ServiceName$</ServiceName>
              </ProbeAction>
              <ConditionDetection ID="CD" TypeID="System!System.ExpressionFilter">
                <Expression>
                  <SimpleExpression>
                    <ValueExpression>
                      <XPathQuery Type="Integer">Property[@Name='StartMode']</XPathQuery>
                    </ValueExpression>
                    <Operator>NotEqual</Operator>
                    <ValueExpression>
                      <Value Type="Integer">4</Value>
                    </ValueExpression>
                  </SimpleExpression>
                </Expression>
              </ConditionDetection>
            </MemberModules>
            <Composition>
              <Node ID="CD">
                <Node ID="Probe" />
              </Node>
            </Composition>
          </Composite>
        </ModuleImplementation>
        <OutputType>System!System.PropertyBagData</OutputType>
        <InputType>System!System.BaseData</InputType>
      </ProbeActionModuleType>
    </ModuleTypes>
    <MonitorTypes>
      <UnitMonitorType ID="Sample.ServiceStatusMonitorType" Accessibility="Internal">
        <MonitorTypeStates>
          <MonitorTypeState ID="Running" NoDetection="false" />
          <MonitorTypeState ID="NotRunning" NoDetection="false" />
        </MonitorTypeStates>
        <Configuration>
          <xsd:element name="IntervalSeconds" type="xsd:integer" />
          <xsd:element name="TimeoutSeconds" type="xsd:int" />
          <xsd:element name="ComputerPrincipalName" type="xsd:string" />
          <xsd:element name="ServiceName" type="xsd:string" />
        </Configuration>
        <OverrideableParameters>
          <OverrideableParameter ID="IntervalSeconds" Selector="$Config/IntervalSeconds$" ParameterType="int" />
          <OverrideableParameter ID="TimeoutSeconds" Selector="$Config/TimeoutSeconds$" ParameterType="int" />
        </OverrideableParameters>
        <MonitorImplementation>
          <MemberModules>
            <DataSource ID="DS" TypeID="Sample.ServiceStatus.DataSource">
              <IntervalSeconds>$Config/IntervalSeconds$</IntervalSeconds>
              <TimeoutSeconds>$Config/TimeoutSeconds$</TimeoutSeconds>
              <ComputerPrincipalName>$Config/ComputerPrincipalName$</ComputerPrincipalName>
              <ServiceName>$Config/ServiceName$</ServiceName>
            </DataSource>
            <ProbeAction ID="Probe" TypeID="Sample.ServiceStatus.Probe">
              <TimeoutSeconds>$Config/TimeoutSeconds$</TimeoutSeconds>
              <ComputerPrincipalName>$Config/ComputerPrincipalName$</ComputerPrincipalName>
              <ServiceName>$Config/ServiceName$</ServiceName>
            </ProbeAction>
            <ConditionDetection ID="NotRunningCondition" TypeID="System!System.ExpressionFilter">
              <Expression>
                <SimpleExpression>
                  <ValueExpression>
                    <XPathQuery Type="String">Property[@Name='ServiceStatus']</XPathQuery>
                  </ValueExpression>
                  <Operator>NotEqual</Operator>
                  <ValueExpression>
                    <Value Type="String">Running</Value>
                  </ValueExpression>
                </SimpleExpression>
              </Expression>
            </ConditionDetection>
            <ConditionDetection ID="RunningCondition" TypeID="System!System.ExpressionFilter">
              <Expression>
                <SimpleExpression>
                  <ValueExpression>
                    <XPathQuery Type="String">Property[@Name='ServiceStatus']</XPathQuery>
                  </ValueExpression>
                  <Operator>Equal</Operator>
                  <ValueExpression>
                    <Value Type="String">Running</Value>
                  </ValueExpression>
                </SimpleExpression>
              </Expression>
            </ConditionDetection>
          </MemberModules>
          <RegularDetections>
            <RegularDetection MonitorTypeStateID="Running">
              <Node ID="RunningCondition">
                <Node ID="DS" />
              </Node>
            </RegularDetection>
            <RegularDetection MonitorTypeStateID="NotRunning">
              <Node ID="NotRunningCondition">
                <Node ID="DS" />
              </Node>
            </RegularDetection>
          </RegularDetections>
          <OnDemandDetections>
            <OnDemandDetection MonitorTypeStateID="Running">
              <Node ID="RunningCondition">
                <Node ID="Probe" />
              </Node>
            </OnDemandDetection>
            <OnDemandDetection MonitorTypeStateID="NotRunning">
              <Node ID="NotRunningCondition">
                <Node ID="Probe" />
              </Node>
            </OnDemandDetection>
          </OnDemandDetections>
        </MonitorImplementation>
      </UnitMonitorType>
    </MonitorTypes>
  </TypeDefinitions>
  <Monitoring>
    <Discoveries>
      <Discovery ID="Sample.Discovery" Enabled="true" Target="Windows!Microsoft.Windows.Computer" ConfirmDelivery="false" Remotable="true" Priority="Normal">
        <Category>Discovery</Category>
        <DiscoveryTypes>
          <DiscoveryClass TypeID="System!System.Entity">
            <Property TypeID="System!System.Entity" PropertyID="DisplayName" />
          </DiscoveryClass>
          <DiscoveryClass TypeID="Sample.ServerRole" />
        </DiscoveryTypes>
        <DataSource ID="DiscoveryDataSource" TypeID="Sample.Discovery.DataSource">
          <IntervalSeconds>120</IntervalSeconds>
        </DataSource>
      </Discovery>
    </Discoveries>
    <Monitors>
      <UnitMonitor ID="Sample.ServiceStatus.Monitor" Accessibility="Internal" Enabled="true" Target="Sample.ServerRole" ParentMonitorID="Health!System.Health.AvailabilityState" Remotable="true" Priority="Normal" TypeID="Sample.ServiceStatusMonitorType" ConfirmDelivery="false">
        <Category>AvailabilityHealth</Category>
        <AlertSettings AlertMessage="Sample.ServiceStatus.Monitor.AlertMessage">
          <AlertOnState>Error</AlertOnState>
          <AutoResolve>true</AutoResolve>
          <AlertPriority>Normal</AlertPriority>
          <AlertSeverity>MatchMonitorHealth</AlertSeverity>
          <AlertParameters>
            <AlertParameter1>Dhcp</AlertParameter1>
            <AlertParameter2>$Target/Host/Property[Type="Windows!Microsoft.Windows.Computer"]/PrincipalName$</AlertParameter2>
          </AlertParameters>
        </AlertSettings>
        <OperationalStates>
          <OperationalState ID="Running" MonitorTypeStateID="Running" HealthState="Success" />
          <OperationalState ID="NotRunning" MonitorTypeStateID="NotRunning" HealthState="Error" />
        </OperationalStates>
        <Configuration>
          <IntervalSeconds>360</IntervalSeconds>
          <TimeoutSeconds>300</TimeoutSeconds>
          <ComputerPrincipalName>$Target/Host/Property[Type="Windows!Microsoft.Windows.Computer"]/PrincipalName$</ComputerPrincipalName>
          <ServiceName>Dhcp</ServiceName>
        </Configuration>
      </UnitMonitor>
      <UnitMonitor ID="Sample.ServiceStatus.Monitor2" Accessibility="Public" Enabled="true" Target="Sample.ServerRole" ParentMonitorID="Health!System.Health.AvailabilityState" Remotable="true" Priority="Normal" TypeID="Windows!Microsoft.Windows.TimedScript.TwoStateMonitorType" ConfirmDelivery="false">
        <Category>Custom</Category>
        <OperationalStates>
          <OperationalState ID="Error" MonitorTypeStateID="Error" HealthState="Error" />
          <OperationalState ID="Success" MonitorTypeStateID="Success" HealthState="Success" />
        </OperationalStates>
        <Configuration>
          <IntervalSeconds>180</IntervalSeconds>
          <SyncTime />
          <ScriptName>GetServiceStatus2.vbs</ScriptName>
          <Arguments>$Target/Host/Property[Type="Windows!Microsoft.Windows.Computer"]/PrincipalName$ dhcp</Arguments>
          <ScriptBody>
            <![CDATA[
                  call Main()

                  Sub Main()

                  Dim oAPI
                  Dim oBag
                  Dim serviceName
                  Dim computerName
                  Dim statusColl
                  Dim serviceStatus

                  computerName  = WScript.Arguments(0)
                  serviceName   = WScript.Arguments(1)
                                    
                  Set wmi = GetObject("winmgmts:\\" & computerName  & "\root\cimv2")

                  wql = "SELECT * FROM Win32_Service WHERE Name='" & serviceName & "'"

                  Set statusColl = wmi.ExecQuery(wql)

                  If statusColl.Count = 1 Then
                    Dim service
                    Set service = statusColl.ItemIndex(0)

                    serviceStatus = service.State
                  End If

                  Set oAPI = CreateObject("MOM.ScriptAPI")
                  Set oBag = oAPI.CreatePropertyBag()
                  oBag.AddValue "ServiceStatus", serviceStatus

                  oAPI.Return(oBag)
                  End Sub
                  ]]>
          </ScriptBody>
          <TimeoutSeconds>120</TimeoutSeconds>
          <ErrorExpression>
            <SimpleExpression>
              <ValueExpression>
                <XPathQuery Type="String">Property[@Name='ServiceStatus']</XPathQuery>
              </ValueExpression>
              <Operator>NotEqual</Operator>
              <ValueExpression>
                <Value Type="String">Running</Value>
              </ValueExpression>
            </SimpleExpression>
          </ErrorExpression>
          <SuccessExpression>
            <SimpleExpression>
              <ValueExpression>
                <XPathQuery Type="String">Property[@Name='ServiceStatus']</XPathQuery>
              </ValueExpression>
              <Operator>Equal</Operator>
              <ValueExpression>
                <Value Type="String">Running</Value>
              </ValueExpression>
            </SimpleExpression>
          </SuccessExpression>
        </Configuration>
      </UnitMonitor>
    </Monitors>
  </Monitoring>
  <Presentation>
    <Views>
      <View ID="Sample.View" Accessibility="Public" Enabled="true" Target="Sample.ServerRole" TypeID="SC!Microsoft.SystemCenter.StateViewType" Visible="true">
        <Category>Operations</Category>
        <Criteria>
          <InMaintenanceMode>false</InMaintenanceMode>
        </Criteria>
        <Presentation>
          <ColumnInfo Index="0" SortIndex="0" Width="100" Grouped="false" Sorted="true" IsSortable="true" Visible="true" SortOrder="Descending">
            <Name>State</Name>
            <Id>Sample.ServerRole</Id>
          </ColumnInfo>
          <ColumnInfo Index="1" SortIndex="-1" Width="100" Grouped="false" Sorted="false" IsSortable="true" Visible="true" SortOrder="Ascending">
            <Name>Maintenance Mode</Name>
            <Id>InMaintenanceMode</Id>
          </ColumnInfo>
          <ColumnInfo Index="2" SortIndex="-1" Width="100" Grouped="false" Sorted="false" IsSortable="true" Visible="true" SortOrder="Ascending">
            <Name>Name</Name>
            <Id>Name</Id>
          </ColumnInfo>
          <ColumnInfo Index="3" SortIndex="-1" Width="100" Grouped="false" Sorted="false" IsSortable="true" Visible="true" SortOrder="Ascending">
            <Name>Path</Name>
            <Id>Path</Id>
          </ColumnInfo>
          <ColumnInfo Index="4" SortIndex="-1" Width="100" Grouped="false" Sorted="false" IsSortable="true" Visible="false" SortOrder="Ascending">
            <Name>Display Name</Name>
            <Id>DisplayName</Id>
          </ColumnInfo>
        </Presentation>
        <Target />
      </View>
    </Views>
    <Folders>
      <Folder ID="Sample.Folder" Accessibility="Public" ParentFolder="SC!Microsoft.SystemCenter.Monitoring.ViewFolder.Root" />
    </Folders>
    <FolderItems>
      <FolderItem ElementID="Sample.View" Folder="Sample.Folder" />
    </FolderItems>
    <StringResources>
      <StringResource ID="Sample.ServiceStatus.Monitor.AlertMessage"/>
    </StringResources>
  </Presentation>
  <LanguagePacks>
    <LanguagePack ID="ENU" IsDefault="true">
      <DisplayStrings>
        <DisplayString ElementID="NTServiceBasedDiscoverySample.MP">
          <Name>NT Service Based Discovery Sample MP</Name>
        </DisplayString>
        <DisplayString ElementID="Sample.ServerRole">
          <Name>Sample Server Role</Name>
        </DisplayString>
        <DisplayString ElementID="Sample.Discovery">
          <Name>Sample NT Service based discovery</Name>
        </DisplayString>
        <DisplayString ElementID="Sample.Folder">
          <Name>Sample MP</Name>
        </DisplayString>
        <DisplayString ElementID="Sample.View">
          <Name>Sample objects state (will be unmonitored as there are no monitors in the MP)</Name>
          <Description />
        </DisplayString>
        <DisplayString ElementID="Sample.ServiceStatus.Monitor">
          <Name>Service Status (with OnDemand)</Name>
          <Description />
        </DisplayString>
        <DisplayString ElementID="Sample.ServiceStatus.Monitor2">
          <Name>Service Status (no OnDemand)</Name>
        </DisplayString>
      </DisplayStrings>
    </LanguagePack>
  </LanguagePacks>
</ManagementPack>