none
Подписка на Maintenance Mode RRS feed

  • Вопрос

  • Добрый день,

    Имеется задача - присылать уведомления о состоянии Maintenance Mode, когда компьютер был переведен и когда компьютер был снят с Maintenance Mode. Это возможно как нибудь реализовать?

    11 августа 2011 г. 5:27
    Отвечающий

Ответы

  • 17 августа 2011 г. 10:50
    Отвечающий
  • <ManagementPack ContentReadable="true" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
       <Manifest>
         <Identity>
           <ID>Maintenance.Mode.Notification</ID>
           <Version>1.0.0.0</Version>
         </Identity>
         <Name>Maintenance.Mode.Notification</Name>
         <References>
           <Reference Alias="SC">
             <ID>Microsoft.SystemCenter.Library</ID>
             <Version>6.1.7221.0</Version>
             <PublicKeyToken>31bf3856ad364e35</PublicKeyToken>
           </Reference>
           <Reference Alias="Windows">
             <ID>Microsoft.Windows.Library</ID>
             <Version>6.1.7221.0</Version>
             <PublicKeyToken>31bf3856ad364e35</PublicKeyToken>
           </Reference>
           <Reference Alias="Health">
             <ID>System.Health.Library</ID>
             <Version>6.1.7221.0</Version>
             <PublicKeyToken>31bf3856ad364e35</PublicKeyToken>
           </Reference>
           <Reference Alias="System">
             <ID>System.Library</ID>
             <Version>6.1.7221.0</Version>
             <PublicKeyToken>31bf3856ad364e35</PublicKeyToken>
           </Reference>
         </References>
       </Manifest>
       <TypeDefinitions>
         <EntityTypes>
           <ClassTypes>
             <ClassType ID="Maintenance.Mode.Notification.Computer" Accessibility="Internal" Abstract="false" Base="System!System.Computer" Hosted="true" Singleton="false">
               <Property ID="PrincipalName" Type="string" Key="true" CaseSensitive="false" Length="256" MinLength="0" />
             </ClassType>
           </ClassTypes>
           <RelationshipTypes>
             <RelationshipType ID="Maintenance.Mode.Notification.Host" Accessibility="Internal" Abstract="false" Base="System!System.Hosting">
               <Source>SC!Microsoft.SystemCenter.RootManagementServer</Source>
               <Target>Maintenance.Mode.Notification.Computer</Target>
             </RelationshipType>
           </RelationshipTypes>
         </EntityTypes>
         <ModuleTypes>
           <DataSourceModuleType ID="Maintenance.Mode.Notification.DataSource.Computers.CheckMM" Accessibility="Internal" RunAs="System!System.PrivilegedMonitoringAccount" 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="RMS" type="xsd:string" />
               <xsd:element minOccurs="1" name="DisplayName" type="xsd:string" />
             </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="Scheduler" TypeID="System!System.SimpleScheduler">
                     <IntervalSeconds>$Config/IntervalSeconds$</IntervalSeconds>
                     <SyncTime>$Config/SyncTime$</SyncTime>
                   </DataSource>
                   <ProbeAction ID="PSScript" TypeID="Windows!Microsoft.Windows.PowerShellPropertyBagProbe">
                     <ScriptName>CheckMM.ps1</ScriptName>
                     <ScriptBody><![CDATA[
     param ($rms)
     add-pssnapin "Microsoft.EnterpriseManagement.OperationsManager.Client"
     new-managementGroupConnection -ConnectionString:$rms
     set-location "OperationsManagerMonitoring::"
     $agents=Get-MonitoringObject -MonitoringClass (Get-MonitoringClass -name Microsoft.Windows.Computer)
     $api=new-object -comObject 'MOM.ScriptAPI'
     foreach ($agent in $agents) {
     $bag=$api.CreatePropertyBag()
     $dn=$agent.DisplayName
     $mm=$agent.InMaintenanceMode
     if ($mm){
     $details=Get-MaintenanceWindow -MonitoringObject $agent
     $starttime=$details.StartTime.ToLocalTime().ToString()
     $endtime=$details.ScheduledEndTime.ToLocalTime().ToString()
     $user=$details.User
     $reason=$details.Reason.ToString()
     $comments=$details.Comments
     }
     $bag.addValue('DisplayName', $dn)
     $bag.addValue('InMaintenanceMode', $mm)
     $bag.addValue('StartTime', $starttime)
     $bag.addValue('EndTime', $endtime)
     $bag.addValue('User', $user)
     $bag.addValue('Reason', $reason)
     $bag.addValue('Comments', $comments)
     $bag
     } 
     ]]></ScriptBody>
                     <Parameters>
                       <Parameter>
                         <Name>RMS</Name>
                         <Value>$Config/RMS$</Value>
                       </Parameter>
                     </Parameters>
                     <TimeoutSeconds>180</TimeoutSeconds>
                   </ProbeAction>
                   <ConditionDetection ID="FilterInstance" TypeID="System!System.ExpressionFilter">
                     <Expression>
                       <SimpleExpression>
                         <ValueExpression>
                           <XPathQuery Type="String">Property[@Name='DisplayName']</XPathQuery>
                         </ValueExpression>
                         <Operator>Equal</Operator>
                         <ValueExpression>
                           <Value Type="String">$Config/DisplayName$</Value>
                         </ValueExpression>
                       </SimpleExpression>
                     </Expression>
                   </ConditionDetection>
                 </MemberModules>
                 <Composition>
                   <Node ID="FilterInstance">
                     <Node ID="PSScript">
                       <Node ID="Scheduler" />
                     </Node>
                   </Node>
                 </Composition>
               </Composite>
             </ModuleImplementation>
             <OutputType>System!System.PropertyBagData</OutputType>
           </DataSourceModuleType>
           <DataSourceModuleType ID="Maintenance.Mode.Notification.DataSource.Computers.Discovery" Accessibility="Internal" RunAs="System!System.PrivilegedMonitoringAccount" Batching="false">
             <Configuration>
               <xsd:element minOccurs="1" name="Interval" type="xsd:integer" />
               <xsd:element minOccurs="1" name="SyncTime" type="xsd:string" />
               <xsd:element minOccurs="1" name="RMS" type="xsd:string" />
             </Configuration>
             <OverrideableParameters>
               <OverrideableParameter ID="Interval" Selector="$Config/Interval$" ParameterType="int" />
               <OverrideableParameter ID="SyncTime" Selector="$Config/SyncTime$" ParameterType="string" />
             </OverrideableParameters>
             <ModuleImplementation Isolation="Any">
               <Composite>
                 <MemberModules>
                   <DataSource ID="Scheduler" TypeID="System!System.Discovery.Scheduler">
                     <Scheduler>
                       <SimpleReccuringSchedule>
                         <Interval>$Config/Interval$</Interval>
                         <SyncTime>$Config/SyncTime$</SyncTime>
                       </SimpleReccuringSchedule>
                       <ExcludeDates />
                     </Scheduler>
                   </DataSource>
                   <ProbeAction ID="PSScript" TypeID="Windows!Microsoft.Windows.PowerShellDiscoveryProbe">
                     <ScriptName>MMDiscovery.ps1</ScriptName>
                     <ScriptBody><![CDATA[
     param($sourceId, $managedEntityId, $rms)
     add-pssnapin "Microsoft.EnterpriseManagement.OperationsManager.Client"
     new-managementGroupConnection -ConnectionString:$rms
     set-location "OperationsManagerMonitoring::"
     $agents=Get-MonitoringObject -MonitoringClass (Get-MonitoringClass -name Microsoft.Windows.Computer)
     $api=new-object -comObject 'MOM.ScriptAPI'
     $discoveryData = $api.CreateDiscoveryData(0, $sourceId, $managedEntityId)
     foreach ($agent in $agents) {
     $instance=$discoveryData.CreateClassInstance("$MPElement[Name='Maintenance.Mode.Notification.Computer']$")
     $DisplayName=$agent.DisplayName
     $instance.AddProperty("$MPElement[Name='Maintenance.Mode.Notification.Computer']/PrincipalName$", $DisplayName)
     $instance.AddProperty("$MPElement[Name='System!System.Entity']/DisplayName$", $DisplayName)
     $instance.AddProperty("$MPElement[Name='Windows!Microsoft.Windows.Computer']/PrincipalName$", $RMS)
     $discoveryData.AddInstance($instance)
     }
     $discoveryData
       ]]></ScriptBody>
                     <Parameters>
                       <Parameter>
                         <Name>sourceId</Name>
                         <Value>$MPElement$</Value>
                       </Parameter>
                       <Parameter>
                         <Name>managedEntityId</Name>
                         <Value>$Target/Id$</Value>
                       </Parameter>
                       <Parameter>
                         <Name>RMS</Name>
                         <Value>$Config/RMS$</Value>
                       </Parameter>
                     </Parameters>
                     <TimeoutSeconds>180</TimeoutSeconds>
                   </ProbeAction>
                 </MemberModules>
                 <Composition>
                   <Node ID="PSScript">
                     <Node ID="Scheduler" />
                   </Node>
                 </Composition>
               </Composite>
             </ModuleImplementation>
             <OutputType>System!System.Discovery.Data</OutputType>
           </DataSourceModuleType>
         </ModuleTypes>
         <MonitorTypes>
           <UnitMonitorType ID="Maintenance.Mode.Notification.CheckMM" Accessibility="Public">
             <MonitorTypeStates>
               <MonitorTypeState ID="Success" NoDetection="false" />
               <MonitorTypeState ID="InMaintenanceMode" 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="RMS" type="xsd:string" />
               <xsd:element minOccurs="1" name="DisplayName" type="xsd:string" />
             </Configuration>
             <OverrideableParameters>
               <OverrideableParameter ID="IntervalSeconds" Selector="$Config/IntervalSeconds$" ParameterType="int" />
               <OverrideableParameter ID="SyncTime" Selector="$Config/SyncTime$" ParameterType="string" />
             </OverrideableParameters>
             <MonitorImplementation>
               <MemberModules>
                 <DataSource ID="DS" TypeID="Maintenance.Mode.Notification.DataSource.Computers.CheckMM">
                   <IntervalSeconds>$Config/IntervalSeconds$</IntervalSeconds>
                   <SyncTime>$Config/SyncTime$</SyncTime>
                   <RMS>$Config/RMS$</RMS>
                   <DisplayName>$Config/DisplayName$</DisplayName>
                 </DataSource>
                 <ConditionDetection ID="FilterSuccess" TypeID="System!System.ExpressionFilter">
                   <Expression>
                     <SimpleExpression>
                       <ValueExpression>
                         <XPathQuery Type="String">Property[@Name='InMaintenanceMode']</XPathQuery>
                       </ValueExpression>
                       <Operator>Equal</Operator>
                       <ValueExpression>
                         <Value Type="Boolean">false</Value>
                       </ValueExpression>
                     </SimpleExpression>
                   </Expression>
                 </ConditionDetection>
                 <ConditionDetection ID="FilterMM" TypeID="System!System.ExpressionFilter">
                   <Expression>
                     <SimpleExpression>
                       <ValueExpression>
                         <XPathQuery Type="String">Property[@Name='InMaintenanceMode']</XPathQuery>
                       </ValueExpression>
                       <Operator>Equal</Operator>
                       <ValueExpression>
                         <Value Type="Boolean">true</Value>
                       </ValueExpression>
                     </SimpleExpression>
                   </Expression>
                 </ConditionDetection>
               </MemberModules>
               <RegularDetections>
                 <RegularDetection MonitorTypeStateID="Success">
                   <Node ID="FilterSuccess">
                     <Node ID="DS" />
                   </Node>
                 </RegularDetection>
                 <RegularDetection MonitorTypeStateID="InMaintenanceMode">
                   <Node ID="FilterMM">
                     <Node ID="DS" />
                   </Node>
                 </RegularDetection>
               </RegularDetections>
             </MonitorImplementation>
           </UnitMonitorType>
         </MonitorTypes>
       </TypeDefinitions>
       <Monitoring>
         <Discoveries>
           <Discovery ID="Maintenance.Mode.Notification.Discovery" Enabled="true" Target="SC!Microsoft.SystemCenter.RootManagementServer" ConfirmDelivery="true" Remotable="true" Priority="Normal">
             <Category>Discovery</Category>
             <DiscoveryTypes>
               <DiscoveryClass TypeID="Maintenance.Mode.Notification.Computer">
                 <Property TypeID="Maintenance.Mode.Notification.Computer" PropertyID="PrincipalName" />
                 <Property TypeID="System!System.Entity" PropertyID="DisplayName" />
               </DiscoveryClass>
             </DiscoveryTypes>
             <DataSource ID="DS" TypeID="Maintenance.Mode.Notification.DataSource.Computers.Discovery">
               <Interval>300</Interval>
               <SyncTime />
               <RMS>$Target/Host/Property[Type="Windows!Microsoft.Windows.Computer"]/PrincipalName$</RMS>
             </DataSource>
           </Discovery>
         </Discoveries>
         <Monitors>
           <UnitMonitor ID="Maintenance.Mode.Notification.Monitor" Accessibility="Public" Enabled="true" Target="Maintenance.Mode.Notification.Computer" ParentMonitorID="Health!System.Health.AvailabilityState" Remotable="false" Priority="Normal" TypeID="Maintenance.Mode.Notification.CheckMM" ConfirmDelivery="true">
             <Category>Custom</Category>
             <AlertSettings AlertMessage="Maintenance.Mode.Notification.Monitor_AlertMessageResourceID">
               <AlertOnState>Warning</AlertOnState>
               <AutoResolve>true</AutoResolve>
               <AlertPriority>Normal</AlertPriority>
               <AlertSeverity>Information</AlertSeverity>
               <AlertParameters>
                 <AlertParameter1>$Target/Property[Type="Maintenance.Mode.Notification.Computer"]/PrincipalName$</AlertParameter1>
                 <AlertParameter2>$Data/Context/Property[@Name='StartTime']$</AlertParameter2>
                 <AlertParameter3>$Data/Context/Property[@Name='EndTime']$</AlertParameter3>
                 <AlertParameter4>$Data/Context/Property[@Name='User']$</AlertParameter4>
                 <AlertParameter5>$Data/Context/Property[@Name='Reason']$</AlertParameter5>
                 <AlertParameter6>$Data/Context/Property[@Name='Comments']$</AlertParameter6>
               </AlertParameters>
             </AlertSettings>
             <OperationalStates>
               <OperationalState ID="UIGeneratedOpStateIdcadb65c8003b4614bc02e3d74ad6a4b2" MonitorTypeStateID="Success" HealthState="Success" />
               <OperationalState ID="UIGeneratedOpStateIdf173073fdd0344d998b61fa0f26abbcb" MonitorTypeStateID="InMaintenanceMode" HealthState="Warning" />
             </OperationalStates>
             <Configuration>
               <IntervalSeconds>300</IntervalSeconds>
               <SyncTime />
               <RMS>$Target/Host/Host/Property[Type="Windows!Microsoft.Windows.Computer"]/PrincipalName$</RMS>
               <DisplayName>$Target/Property[Type="Maintenance.Mode.Notification.Computer"]/PrincipalName$</DisplayName>
             </Configuration>
           </UnitMonitor>
         </Monitors>
       </Monitoring>
       <Presentation>
         <StringResources>
           <StringResource ID="Maintenance.Mode.Notification.Monitor_AlertMessageResourceID" />
         </StringResources>
       </Presentation>
       <LanguagePacks>
         <LanguagePack ID="ENU" IsDefault="true">
           <DisplayStrings>
             <DisplayString ElementID="Maintenance.Mode.Notification">
               <Name>Maintenance Mode Notification</Name>
             </DisplayString>
             <DisplayString ElementID="Maintenance.Mode.Notification.CheckMM">
               <Name>Check Maintenance Mode</Name>
               <Description />
             </DisplayString>
             <DisplayString ElementID="Maintenance.Mode.Notification.Computer">
               <Name>Maintenance Mode Windows Computer Name</Name>
             </DisplayString>
             <DisplayString ElementID="Maintenance.Mode.Notification.Computer" SubElementID="PrincipalName">
               <Name>Principal Name</Name>
             </DisplayString>
             <DisplayString ElementID="Maintenance.Mode.Notification.DataSource.Computers.CheckMM">
               <Name>Check Maintenance Mode Computers </Name>
             </DisplayString>
             <DisplayString ElementID="Maintenance.Mode.Notification.DataSource.Computers.Discovery">
               <Name>Discovery Windows Computer Names</Name>
             </DisplayString>
             <DisplayString ElementID="Maintenance.Mode.Notification.Discovery">
               <Name>Discovery Maintenance Mode Windows Computer Names</Name>
             </DisplayString>
             <DisplayString ElementID="Maintenance.Mode.Notification.Host">
               <Name>Maintenance Mode Hosting Relationship</Name>
             </DisplayString>
             <DisplayString ElementID="Maintenance.Mode.Notification.Monitor">
               <Name>Computer is in Maintenance Mode</Name>
               <Description />
             </DisplayString>
             <DisplayString ElementID="Maintenance.Mode.Notification.Monitor" SubElementID="UIGeneratedOpStateIdcadb65c8003b4614bc02e3d74ad6a4b2">
               <Name>Success</Name>
             </DisplayString>
             <DisplayString ElementID="Maintenance.Mode.Notification.Monitor" SubElementID="UIGeneratedOpStateIdf173073fdd0344d998b61fa0f26abbcb">
               <Name>InMaintenanceMode</Name>
             </DisplayString>
             <DisplayString ElementID="Maintenance.Mode.Notification.Monitor_AlertMessageResourceID">
               <Name>Computer is in Maintenance Mode</Name>
               <Description>Computer {0} is in Maintenance Mode.
     Start Time: {1}.
     End Time: {2}.
     User: {3}.
     Reason: {4}.
     Comments: {5}.</Description>
             </DisplayString>
           </DisplayStrings>
         </LanguagePack>
       </LanguagePacks>
     </ManagementPack>

    21 октября 2011 г. 18:30
    Отвечающий

Все ответы

  • Использовать MP http://www.systemcentercentral.com/tabid/145/indexId/70867/Default.aspx

     

    Другие варианты http://www.vnext.be/2010/07/13/scom-maintenance-mode-history-report/

    11 августа 2011 г. 15:59
  • Паш, я читал данные статьи :) Мы можем попробывать использовать данный менеджмент пак, но насколько я понял по описанию, это просто расширенный отчет о ММ.
    11 августа 2011 г. 17:31
    Отвечающий
  • уведомления нужны сразу же когда компьютер переходит в MM?

    или раз в день/неделю в виде отчёта?

    11 августа 2011 г. 19:55
  • Нужен алерт, который бы отправлял уведомление по SMTP channel, когда компьютер переходит в состояние MM и когда выходит из него. Примерно представляю себе как это сделать - написать MP, который нацелен на RMS, выполнять на нем PS скрипт, который будет опрашивать состояние всех Windows Computers, если есть, то создавать, желательно, Information Alert, что такой-то компьютер в MM, как компьютер выходит генерить алерт, что компьютер находится в Normal State. Создать на него подписку и всё, в принципе больше ничего не требуется.

    • Предложено в качестве ответа Dmitry DavydovModerator 16 августа 2011 г. 14:10
    • Отменено предложение в качестве ответа Vladimir ZelenovEditor 17 августа 2011 г. 7:30
    12 августа 2011 г. 5:27
    Отвечающий
  • так вы сами уже ответили на свой вопрос :) осталось токо написать/найти PS скрипт
    12 августа 2011 г. 6:05
  • А как лучше сделать? Я толком не писал менеджмент паки, разве что только иногда переделывал какие либо под собственные нужды. Скорее всего это будет Availability монитор, который будет в иерархии допустим "Windows Servers in Maintenance Mode". На сколько я понимаю, если в качестве таргета у нас будет RMS сервер, то монитор будет запускаться на нем, соответственно в Health Explorer будем видеть именно на нем алерты. Скорее всего нужно будет создать дискавери скрипт, который перечислит все Windows Computers и создаст новые объекты. Далее нужно будет создать скрипт, который будет перечислять компьютеры через Get-Agent. Через Bag мы возвращаем имя компьютера (Get-agent).displayname и (Get-Agent).HealthState. Создаем 2-state монитор, на который назначаем Unhealthy expression ( HealthState Equals Uninitialized ), cоответствен Healthy expression Does Not Equals. Как можно реализовать данное решение или как-то вообще можно по другому это сделать?


    12 августа 2011 г. 9:09
    Отвечающий
  • По своей теме может кто сможет помочь конкретным ответом, т.к. я на начальной стадии изучения создания собственных MP. Не очень понятно, как создать процесс Discovery. Потом на каждый найденный объект применять свой скрипт. Как будет выглядеть скрипт - понятно, но вот то, что связанно с API SCOM (PropertyBag) не очень понятно. Вижу только задачу - скрипт должен запускаться на RMS с параметрами CheckStatus.ps1 $ComputerName$. На сколько я понимаю, Discovery тут совсем не нужен, т.к. имена Windows систем нам и так должны быть известны, необходимо просто связать между собой 2 менеджмент пака. Скрипт примерно такой:

    Get-Agent | ? {$_.DisplayName -eq $ComputerName$}

    Дальше нужно вернуть состояние HealthState. Если Uninitialize, то Warning, если Success, то монитор Success. Мне алгоритм понятен, но вот как всё это собрать не очень понятно... Как связать между собой MP, как вернуть в командную строку параметры запуска скрипта (я совсем не могу понять, что это $Windows.Computer.еще что-то$), что именно там писать... У меня вопросов больше, чем ответов.

    17 августа 2011 г. 7:30
    Отвечающий
  • 17 августа 2011 г. 10:50
    Отвечающий
  • Спасибо за ссылку, попробую разобраться.

    18 августа 2011 г. 10:22
    Отвечающий
  • <ManagementPack ContentReadable="true" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
       <Manifest>
         <Identity>
           <ID>Maintenance.Mode.Notification</ID>
           <Version>1.0.0.0</Version>
         </Identity>
         <Name>Maintenance.Mode.Notification</Name>
         <References>
           <Reference Alias="SC">
             <ID>Microsoft.SystemCenter.Library</ID>
             <Version>6.1.7221.0</Version>
             <PublicKeyToken>31bf3856ad364e35</PublicKeyToken>
           </Reference>
           <Reference Alias="Windows">
             <ID>Microsoft.Windows.Library</ID>
             <Version>6.1.7221.0</Version>
             <PublicKeyToken>31bf3856ad364e35</PublicKeyToken>
           </Reference>
           <Reference Alias="Health">
             <ID>System.Health.Library</ID>
             <Version>6.1.7221.0</Version>
             <PublicKeyToken>31bf3856ad364e35</PublicKeyToken>
           </Reference>
           <Reference Alias="System">
             <ID>System.Library</ID>
             <Version>6.1.7221.0</Version>
             <PublicKeyToken>31bf3856ad364e35</PublicKeyToken>
           </Reference>
         </References>
       </Manifest>
       <TypeDefinitions>
         <EntityTypes>
           <ClassTypes>
             <ClassType ID="Maintenance.Mode.Notification.Computer" Accessibility="Internal" Abstract="false" Base="System!System.Computer" Hosted="true" Singleton="false">
               <Property ID="PrincipalName" Type="string" Key="true" CaseSensitive="false" Length="256" MinLength="0" />
             </ClassType>
           </ClassTypes>
           <RelationshipTypes>
             <RelationshipType ID="Maintenance.Mode.Notification.Host" Accessibility="Internal" Abstract="false" Base="System!System.Hosting">
               <Source>SC!Microsoft.SystemCenter.RootManagementServer</Source>
               <Target>Maintenance.Mode.Notification.Computer</Target>
             </RelationshipType>
           </RelationshipTypes>
         </EntityTypes>
         <ModuleTypes>
           <DataSourceModuleType ID="Maintenance.Mode.Notification.DataSource.Computers.CheckMM" Accessibility="Internal" RunAs="System!System.PrivilegedMonitoringAccount" 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="RMS" type="xsd:string" />
               <xsd:element minOccurs="1" name="DisplayName" type="xsd:string" />
             </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="Scheduler" TypeID="System!System.SimpleScheduler">
                     <IntervalSeconds>$Config/IntervalSeconds$</IntervalSeconds>
                     <SyncTime>$Config/SyncTime$</SyncTime>
                   </DataSource>
                   <ProbeAction ID="PSScript" TypeID="Windows!Microsoft.Windows.PowerShellPropertyBagProbe">
                     <ScriptName>CheckMM.ps1</ScriptName>
                     <ScriptBody><![CDATA[
     param ($rms)
     add-pssnapin "Microsoft.EnterpriseManagement.OperationsManager.Client"
     new-managementGroupConnection -ConnectionString:$rms
     set-location "OperationsManagerMonitoring::"
     $agents=Get-MonitoringObject -MonitoringClass (Get-MonitoringClass -name Microsoft.Windows.Computer)
     $api=new-object -comObject 'MOM.ScriptAPI'
     foreach ($agent in $agents) {
     $bag=$api.CreatePropertyBag()
     $dn=$agent.DisplayName
     $mm=$agent.InMaintenanceMode
     if ($mm){
     $details=Get-MaintenanceWindow -MonitoringObject $agent
     $starttime=$details.StartTime.ToLocalTime().ToString()
     $endtime=$details.ScheduledEndTime.ToLocalTime().ToString()
     $user=$details.User
     $reason=$details.Reason.ToString()
     $comments=$details.Comments
     }
     $bag.addValue('DisplayName', $dn)
     $bag.addValue('InMaintenanceMode', $mm)
     $bag.addValue('StartTime', $starttime)
     $bag.addValue('EndTime', $endtime)
     $bag.addValue('User', $user)
     $bag.addValue('Reason', $reason)
     $bag.addValue('Comments', $comments)
     $bag
     } 
     ]]></ScriptBody>
                     <Parameters>
                       <Parameter>
                         <Name>RMS</Name>
                         <Value>$Config/RMS$</Value>
                       </Parameter>
                     </Parameters>
                     <TimeoutSeconds>180</TimeoutSeconds>
                   </ProbeAction>
                   <ConditionDetection ID="FilterInstance" TypeID="System!System.ExpressionFilter">
                     <Expression>
                       <SimpleExpression>
                         <ValueExpression>
                           <XPathQuery Type="String">Property[@Name='DisplayName']</XPathQuery>
                         </ValueExpression>
                         <Operator>Equal</Operator>
                         <ValueExpression>
                           <Value Type="String">$Config/DisplayName$</Value>
                         </ValueExpression>
                       </SimpleExpression>
                     </Expression>
                   </ConditionDetection>
                 </MemberModules>
                 <Composition>
                   <Node ID="FilterInstance">
                     <Node ID="PSScript">
                       <Node ID="Scheduler" />
                     </Node>
                   </Node>
                 </Composition>
               </Composite>
             </ModuleImplementation>
             <OutputType>System!System.PropertyBagData</OutputType>
           </DataSourceModuleType>
           <DataSourceModuleType ID="Maintenance.Mode.Notification.DataSource.Computers.Discovery" Accessibility="Internal" RunAs="System!System.PrivilegedMonitoringAccount" Batching="false">
             <Configuration>
               <xsd:element minOccurs="1" name="Interval" type="xsd:integer" />
               <xsd:element minOccurs="1" name="SyncTime" type="xsd:string" />
               <xsd:element minOccurs="1" name="RMS" type="xsd:string" />
             </Configuration>
             <OverrideableParameters>
               <OverrideableParameter ID="Interval" Selector="$Config/Interval$" ParameterType="int" />
               <OverrideableParameter ID="SyncTime" Selector="$Config/SyncTime$" ParameterType="string" />
             </OverrideableParameters>
             <ModuleImplementation Isolation="Any">
               <Composite>
                 <MemberModules>
                   <DataSource ID="Scheduler" TypeID="System!System.Discovery.Scheduler">
                     <Scheduler>
                       <SimpleReccuringSchedule>
                         <Interval>$Config/Interval$</Interval>
                         <SyncTime>$Config/SyncTime$</SyncTime>
                       </SimpleReccuringSchedule>
                       <ExcludeDates />
                     </Scheduler>
                   </DataSource>
                   <ProbeAction ID="PSScript" TypeID="Windows!Microsoft.Windows.PowerShellDiscoveryProbe">
                     <ScriptName>MMDiscovery.ps1</ScriptName>
                     <ScriptBody><![CDATA[
     param($sourceId, $managedEntityId, $rms)
     add-pssnapin "Microsoft.EnterpriseManagement.OperationsManager.Client"
     new-managementGroupConnection -ConnectionString:$rms
     set-location "OperationsManagerMonitoring::"
     $agents=Get-MonitoringObject -MonitoringClass (Get-MonitoringClass -name Microsoft.Windows.Computer)
     $api=new-object -comObject 'MOM.ScriptAPI'
     $discoveryData = $api.CreateDiscoveryData(0, $sourceId, $managedEntityId)
     foreach ($agent in $agents) {
     $instance=$discoveryData.CreateClassInstance("$MPElement[Name='Maintenance.Mode.Notification.Computer']$")
     $DisplayName=$agent.DisplayName
     $instance.AddProperty("$MPElement[Name='Maintenance.Mode.Notification.Computer']/PrincipalName$", $DisplayName)
     $instance.AddProperty("$MPElement[Name='System!System.Entity']/DisplayName$", $DisplayName)
     $instance.AddProperty("$MPElement[Name='Windows!Microsoft.Windows.Computer']/PrincipalName$", $RMS)
     $discoveryData.AddInstance($instance)
     }
     $discoveryData
       ]]></ScriptBody>
                     <Parameters>
                       <Parameter>
                         <Name>sourceId</Name>
                         <Value>$MPElement$</Value>
                       </Parameter>
                       <Parameter>
                         <Name>managedEntityId</Name>
                         <Value>$Target/Id$</Value>
                       </Parameter>
                       <Parameter>
                         <Name>RMS</Name>
                         <Value>$Config/RMS$</Value>
                       </Parameter>
                     </Parameters>
                     <TimeoutSeconds>180</TimeoutSeconds>
                   </ProbeAction>
                 </MemberModules>
                 <Composition>
                   <Node ID="PSScript">
                     <Node ID="Scheduler" />
                   </Node>
                 </Composition>
               </Composite>
             </ModuleImplementation>
             <OutputType>System!System.Discovery.Data</OutputType>
           </DataSourceModuleType>
         </ModuleTypes>
         <MonitorTypes>
           <UnitMonitorType ID="Maintenance.Mode.Notification.CheckMM" Accessibility="Public">
             <MonitorTypeStates>
               <MonitorTypeState ID="Success" NoDetection="false" />
               <MonitorTypeState ID="InMaintenanceMode" 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="RMS" type="xsd:string" />
               <xsd:element minOccurs="1" name="DisplayName" type="xsd:string" />
             </Configuration>
             <OverrideableParameters>
               <OverrideableParameter ID="IntervalSeconds" Selector="$Config/IntervalSeconds$" ParameterType="int" />
               <OverrideableParameter ID="SyncTime" Selector="$Config/SyncTime$" ParameterType="string" />
             </OverrideableParameters>
             <MonitorImplementation>
               <MemberModules>
                 <DataSource ID="DS" TypeID="Maintenance.Mode.Notification.DataSource.Computers.CheckMM">
                   <IntervalSeconds>$Config/IntervalSeconds$</IntervalSeconds>
                   <SyncTime>$Config/SyncTime$</SyncTime>
                   <RMS>$Config/RMS$</RMS>
                   <DisplayName>$Config/DisplayName$</DisplayName>
                 </DataSource>
                 <ConditionDetection ID="FilterSuccess" TypeID="System!System.ExpressionFilter">
                   <Expression>
                     <SimpleExpression>
                       <ValueExpression>
                         <XPathQuery Type="String">Property[@Name='InMaintenanceMode']</XPathQuery>
                       </ValueExpression>
                       <Operator>Equal</Operator>
                       <ValueExpression>
                         <Value Type="Boolean">false</Value>
                       </ValueExpression>
                     </SimpleExpression>
                   </Expression>
                 </ConditionDetection>
                 <ConditionDetection ID="FilterMM" TypeID="System!System.ExpressionFilter">
                   <Expression>
                     <SimpleExpression>
                       <ValueExpression>
                         <XPathQuery Type="String">Property[@Name='InMaintenanceMode']</XPathQuery>
                       </ValueExpression>
                       <Operator>Equal</Operator>
                       <ValueExpression>
                         <Value Type="Boolean">true</Value>
                       </ValueExpression>
                     </SimpleExpression>
                   </Expression>
                 </ConditionDetection>
               </MemberModules>
               <RegularDetections>
                 <RegularDetection MonitorTypeStateID="Success">
                   <Node ID="FilterSuccess">
                     <Node ID="DS" />
                   </Node>
                 </RegularDetection>
                 <RegularDetection MonitorTypeStateID="InMaintenanceMode">
                   <Node ID="FilterMM">
                     <Node ID="DS" />
                   </Node>
                 </RegularDetection>
               </RegularDetections>
             </MonitorImplementation>
           </UnitMonitorType>
         </MonitorTypes>
       </TypeDefinitions>
       <Monitoring>
         <Discoveries>
           <Discovery ID="Maintenance.Mode.Notification.Discovery" Enabled="true" Target="SC!Microsoft.SystemCenter.RootManagementServer" ConfirmDelivery="true" Remotable="true" Priority="Normal">
             <Category>Discovery</Category>
             <DiscoveryTypes>
               <DiscoveryClass TypeID="Maintenance.Mode.Notification.Computer">
                 <Property TypeID="Maintenance.Mode.Notification.Computer" PropertyID="PrincipalName" />
                 <Property TypeID="System!System.Entity" PropertyID="DisplayName" />
               </DiscoveryClass>
             </DiscoveryTypes>
             <DataSource ID="DS" TypeID="Maintenance.Mode.Notification.DataSource.Computers.Discovery">
               <Interval>300</Interval>
               <SyncTime />
               <RMS>$Target/Host/Property[Type="Windows!Microsoft.Windows.Computer"]/PrincipalName$</RMS>
             </DataSource>
           </Discovery>
         </Discoveries>
         <Monitors>
           <UnitMonitor ID="Maintenance.Mode.Notification.Monitor" Accessibility="Public" Enabled="true" Target="Maintenance.Mode.Notification.Computer" ParentMonitorID="Health!System.Health.AvailabilityState" Remotable="false" Priority="Normal" TypeID="Maintenance.Mode.Notification.CheckMM" ConfirmDelivery="true">
             <Category>Custom</Category>
             <AlertSettings AlertMessage="Maintenance.Mode.Notification.Monitor_AlertMessageResourceID">
               <AlertOnState>Warning</AlertOnState>
               <AutoResolve>true</AutoResolve>
               <AlertPriority>Normal</AlertPriority>
               <AlertSeverity>Information</AlertSeverity>
               <AlertParameters>
                 <AlertParameter1>$Target/Property[Type="Maintenance.Mode.Notification.Computer"]/PrincipalName$</AlertParameter1>
                 <AlertParameter2>$Data/Context/Property[@Name='StartTime']$</AlertParameter2>
                 <AlertParameter3>$Data/Context/Property[@Name='EndTime']$</AlertParameter3>
                 <AlertParameter4>$Data/Context/Property[@Name='User']$</AlertParameter4>
                 <AlertParameter5>$Data/Context/Property[@Name='Reason']$</AlertParameter5>
                 <AlertParameter6>$Data/Context/Property[@Name='Comments']$</AlertParameter6>
               </AlertParameters>
             </AlertSettings>
             <OperationalStates>
               <OperationalState ID="UIGeneratedOpStateIdcadb65c8003b4614bc02e3d74ad6a4b2" MonitorTypeStateID="Success" HealthState="Success" />
               <OperationalState ID="UIGeneratedOpStateIdf173073fdd0344d998b61fa0f26abbcb" MonitorTypeStateID="InMaintenanceMode" HealthState="Warning" />
             </OperationalStates>
             <Configuration>
               <IntervalSeconds>300</IntervalSeconds>
               <SyncTime />
               <RMS>$Target/Host/Host/Property[Type="Windows!Microsoft.Windows.Computer"]/PrincipalName$</RMS>
               <DisplayName>$Target/Property[Type="Maintenance.Mode.Notification.Computer"]/PrincipalName$</DisplayName>
             </Configuration>
           </UnitMonitor>
         </Monitors>
       </Monitoring>
       <Presentation>
         <StringResources>
           <StringResource ID="Maintenance.Mode.Notification.Monitor_AlertMessageResourceID" />
         </StringResources>
       </Presentation>
       <LanguagePacks>
         <LanguagePack ID="ENU" IsDefault="true">
           <DisplayStrings>
             <DisplayString ElementID="Maintenance.Mode.Notification">
               <Name>Maintenance Mode Notification</Name>
             </DisplayString>
             <DisplayString ElementID="Maintenance.Mode.Notification.CheckMM">
               <Name>Check Maintenance Mode</Name>
               <Description />
             </DisplayString>
             <DisplayString ElementID="Maintenance.Mode.Notification.Computer">
               <Name>Maintenance Mode Windows Computer Name</Name>
             </DisplayString>
             <DisplayString ElementID="Maintenance.Mode.Notification.Computer" SubElementID="PrincipalName">
               <Name>Principal Name</Name>
             </DisplayString>
             <DisplayString ElementID="Maintenance.Mode.Notification.DataSource.Computers.CheckMM">
               <Name>Check Maintenance Mode Computers </Name>
             </DisplayString>
             <DisplayString ElementID="Maintenance.Mode.Notification.DataSource.Computers.Discovery">
               <Name>Discovery Windows Computer Names</Name>
             </DisplayString>
             <DisplayString ElementID="Maintenance.Mode.Notification.Discovery">
               <Name>Discovery Maintenance Mode Windows Computer Names</Name>
             </DisplayString>
             <DisplayString ElementID="Maintenance.Mode.Notification.Host">
               <Name>Maintenance Mode Hosting Relationship</Name>
             </DisplayString>
             <DisplayString ElementID="Maintenance.Mode.Notification.Monitor">
               <Name>Computer is in Maintenance Mode</Name>
               <Description />
             </DisplayString>
             <DisplayString ElementID="Maintenance.Mode.Notification.Monitor" SubElementID="UIGeneratedOpStateIdcadb65c8003b4614bc02e3d74ad6a4b2">
               <Name>Success</Name>
             </DisplayString>
             <DisplayString ElementID="Maintenance.Mode.Notification.Monitor" SubElementID="UIGeneratedOpStateIdf173073fdd0344d998b61fa0f26abbcb">
               <Name>InMaintenanceMode</Name>
             </DisplayString>
             <DisplayString ElementID="Maintenance.Mode.Notification.Monitor_AlertMessageResourceID">
               <Name>Computer is in Maintenance Mode</Name>
               <Description>Computer {0} is in Maintenance Mode.
     Start Time: {1}.
     End Time: {2}.
     User: {3}.
     Reason: {4}.
     Comments: {5}.</Description>
             </DisplayString>
           </DisplayStrings>
         </LanguagePack>
       </LanguagePacks>
     </ManagementPack>

    21 октября 2011 г. 18:30
    Отвечающий