今天要和大家分享的是SCOM中的一个关键对象,Monitor。首先我们来看看如何使用Get-Monitor命令来得到当前SCOM中的所有Monitor。

命令如下:

Get-Monitor | Select-Object DisplayName,Algorithm | Sort Displayname

image

当然这样列一下所有的Monitor其实是没有什么意义的,在一个大型的环境中,Monitor的数量上千其实是一件很正常的事,那么此时就需要用到Get-Monitor的几个参数了。用的最多的可能是-ManagementPack和-Criteria这两个参数。如果想要查看一个ManagementPack中的Monitor数量,那么使用前者是最方便的。但是实际上并不是什么时候都是那么走运的,因此使用-Criteria参数也是很常见的。但是如果看过Get-Monitor命令帮助的朋友便会发现这个参数的使用提示,包括参数的语法规则是包含在SCOM SDK中的,这时可能很多朋友会打退堂鼓,作为SE去看SDK是不是很不合适?关于这个问题,大家各有各的看法,不过接下来,我会尝试着把这个参数的使用方法解释清楚。

其实这个参数的作用主要就是把我们的筛选条件转换成SQL查询语句,如果大家想跳过PowerShell的话,那可以直接在数据库中查询[MonitorView]这张视图。不过这边呢,还是要介绍下Criteria是如何书写的。比如要查显示名中包含SQL的Monitor,那么可以使用以下查询条件:

Get-Monitor -Criteria "Name like '%SQL%'" | FT DisplayName

image

但此时我们会发现部分Monitor中包含DEPRECATED,那我们怎么样修改参数值呢?这里其实只要使用AND操作符就能解决问题:

Get-Monitor -Criteria "Name LIKE '%SQL%' And DisplayName NOT LIKE '%DEPRECATED'" | FT Name,DisplayName

当然查询条件还支持更高级的正则表达式以及SQL中关键词IN来进行筛选,大家可以根据具体情况来进行设置。不过需要注意一点,IN只适用于Monitor对象的GUID属性。具体命令如下:

Get-Monitor -Criteria "Name Matches 'SQL.*2005'" | FT Name,DisplayName

Get-Monitor -Criteria "Id In ('FAA97AF2-FEC2-D949-AC63-9C09BA6F88DC','92C699CC-6142-DBB3-C832-2450FC24F240')" | FT Name, DisplayName

image

细心的朋友可能已经发现了,在最开始为大家整理出来的命令列表中不存在类似Set-Monitor之类的命令,那么假设我们要对Monitor进行修改该如何操作呢?为了说明这个问题,这里我先利用图形界面新建了一个UnitMonitor,然后在创建向导的最后,我没有勾选产生警报的复选框,接下来我的目的就是利用PowerShell来启用它。

image

首先要做的还是要得到这个UnitMonitor对象,因此使用以下命令:

Get-Monitor -Criteria "DisplayName='TestMonitor'" | FT Name,DisplayName -A

image

这里需要注意通过图形界面创建出来的Monitor的Name属性是自动生成,这也决定了我们在进行筛选时必须使用DisplayName属性。接下来看看如何启用这个Monitor的警报功能。当然希望只要修改这个Monitor的一个属性即可,因此先来看下这个Monitor有哪些属性:

image

运气不错,看到了AlertSettings属性,当前是一个空值,那是不是只要设置一个$true或者$false就可以了呢?可以通过Get-Member来确认下这个猜想:

image

看来事情不像我们想的那么简单,大家可能已经注意到这个属性的类型是Microsoft.EnterpriseManagement.Configuration.ManagementPackMonitorAlertSettings,这意味着不能简单的设置$true或者$false了,接下来需要做的是使用New-Object来创建这个类的一个实例,这里建议大家在SDK中搜索下,看看有哪些有用的信息。我在查询SDK之后,确定下来具体代码如下:

$monitor = Get-Monitor -Criteria "DisplayName='TestMonitor'"
$mp = Get-ManagementPack | ?{$_.Name -eq "Contoso"}
$alertSetting = New-Object Microsoft.EnterpriseManagement.Configuration.ManagementPackMonitorAlertSettings
$alertMessage = New-Object Microsoft.EnterpriseManagement.Configuration.ManagementPackStringResource($mp,"AlertMessage")
$alertSetting.AlertMessage = $alertMessage
$alertSetting.AlertParameter1 = "Event Description: $Data/Context/EventDescription$"
$alertSetting.AlertOnState = [Microsoft.EnterpriseManagement.Configuration.HealthState]::Warning
$alertSetting.AlertPriority = [Microsoft.EnterpriseManagement.Configuration.ManagementPackWorkflowPriority]::High
$alertSetting.AlertSeverity = [Microsoft.EnterpriseManagement.Configuration.ManagementPackAlertSeverity]::Error
$monitor.AlertSettings = $alertSetting
$monitor.Status = "PendingUpdate"
$monitor.GetManagementPack().AcceptChanges()

代码中首先得到Monitor对象,接着再得到ManagementPack对象,然后初始化了ManagementPackMonitorAlertSettings的一个实例,并且由于AlertMessage的类型也必须是ManagementPackStringResource,因此接着初始化该类的一个实例,这里大家需要为构造函数,传递代表ManagementPack的变量以及一个标识字符串。接下来设置AlertSetting的各个属性,比如什么时候发出Alert,严重程度是什么,关键度是什么,然后将Monitor的状态设置为待更新,最后让ManagementPack接受更改。

image

这里不得不承认修改这个设置是一件非常复杂的事,可能已经脱离系统工程师的范畴了,当然我们可以期待未来SCOM的开发团队来简化这些操作,但是随之而来的一种情况可能就是大家看到就不再是80多个命令,而是变成几百个命令。这边就不在深入探讨怎么样在PowerShell中修改Monitor的属性了,有兴趣的朋友不妨参考下MSDN和SCOM SDK来实现你的需求。

已发表 2011年7月11日 21:44 作者 ghjconan

归档在:SCOM, PowerShell, OpsMgr