SCOMにてプロセスの監視をエージェントレスで実行する

SCOMには「プロセス監視」の管理パックテンプレートがあり、お手軽にプロセスの監視が出来ます。

image

image

image

image

結構細かい指定がコンソールから簡単に行えるので、重宝します。

が、そこはSCOM、やはりエージェントを導入していないとこれは動作しません。

エージェントが導入されていない、エージェントレス監視のサーバーは監視対象外となります。

image

これは、管理パックをエクスポートしてRemotable属性の値を確認することでも確認できます。

image

<UnitMonitor ID=”ProcessMonitoring_9fe2f4125b6e43749a8a67c344817b31.ProcessInstanceCountMonitor” Accessibility=”Public” Enabled=”true” Target=”ProcessMonitoring_9fe2f4125b6e43749a8a67c344817b31MonitoredProcess” ParentMonitorID=”Health!System.Health.AvailabilityState” Remotable=”false” Priority=”Normal” TypeID=”MicrosoftSystemCenterProcessMonitoringLibrary!Microsoft.SystemCenter.Process.ProcessInstanceCountMonitorType” ConfirmDelivery=”false”>

<Category>AvailabilityHealth</Category>

<AlertSettings AlertMessage=”ProcessMonitoring_9fe2f4125b6e43749a8a67c344817b31.ProcessMonitoring.ProcessInstanceCountOutsideRange.AlertMessage”>

<AlertOnState>Error</AlertOnState>

<AutoResolve>true</AutoResolve>

<AlertPriority>Normal</AlertPriority>

<AlertSeverity>Error</AlertSeverity>

<AlertParameters>

<AlertParameter1>$Data[Default=’0′]/Context/DataItem/Item0Context/DataItem/ProcessInformations/ProcessInformation[./ProcessName =’cmd.exe’]/ActiveInstanceCount$</AlertParameter1>

</AlertParameters>

</AlertSettings>

<OperationalStates>

<OperationalState ID=”OK” MonitorTypeStateID=”InsideRangeState” HealthState=”Success” />

<OperationalState ID=”Error” MonitorTypeStateID=”OutsideRangeState” HealthState=”Error” />

</OperationalStates>

<Configuration>

<ProcessName>cmd.exe</ProcessName>

<Frequency>60</Frequency>

<MinInstanceCount>1</MinInstanceCount>

<MaxInstanceCount>5</MaxInstanceCount>

<InstanceCountOutOfRangeTimeThresholdInSeconds>60</InstanceCountOutOfRangeTimeThresholdInSeconds>

</Configuration>

</UnitMonitor>

むりやりこれをRemotable=”true”と書き換えてしまってインポートし直すと、監視できているように見えますが、実際にはきちんと動作していません。

image

image

image

監視対象にはなっています。しかし、cmd.exeの数はエージェントレスで監視しているサーバーのものではない数(監視エージェント上のプロセスの数)が戻ってきてしまい、正常に監視できていません。この方法は使えません。

そもそもSCOMは思想的にも機能的にもエージェントを入れて監視するのが有効なので、無理にエージェントレスで頑張る必要は無いですし、お勧めできません。

ですが、やろうと思えば出来るよ・・・ということの一例としてスクリプトを自分で書いてcmd.exeのプロセスの数をリモートからモニターする管理パックを作成してみます。

clip_image001

ユニットモニターを作成します。

clip_image002

clip_image003

clip_image004

clip_image005

スクリプトを記述します。

 

‘===================================================================================

‘ AUTHOR:         Masahiko Ebisuda

‘ Script Name:         ProcessMonitor.vbs

‘ DATE:         2015/07/13

‘ Version:         1.0

‘ COMMENT:                        Script to monitor process number.

‘===================================================================================

Option Explicit

SetLocale(“en-us”)

Dim ProcessName, objWMIService,colProcesses, objProcess, ComputerName, count

Dim oAPI, oBag, oInst

ProcessName = “cmd.exe”

ComputerName = Wscript.Arguments.Item(0)

Set oAPI = CreateObject(“MOM.ScriptAPI”)

Set objWMIService = GetObject(“winmgmts:{impersonationLevel=impersonate}!\\” & ComputerName & “\root\cimv2”)

Set colProcesses = objWMIService.ExecQuery(“SELECT * FROM Win32_Process where Caption=’” & ProcessName & “‘”,,48)

count = 0

For Each objProcess in colProcesses

count = count + 1

Next

Set oBag = oAPI.CreatePropertyBag()

oBag.AddValue “ProcessCount”, count

oAPI.AddItem(oBag)

oAPI.Return(oBag)

 

パラメーターを定義します。

clip_image006

clip_image007

clip_image008

Property[@Name=’ProcessCount’]という形でPropertyBagの中に入れた値が参照できます。

clip_image009

clip_image010

clip_image011

clip_image012

これでユニットモニターが作成できました。

きちんとヘルプエクスプローラーでも表示され、リモートからも監視が可能となりました。

clip_image013

clip_image014

アラートもきちんと出力されました。

 

しかし、繰り返しになりますが、この方法はお勧めはできません。エージェントを入れるべきです。

どうしても…という時のみ検討してみてください。


Posted

in

by

Comments

Leave a Reply