SCOM中如何为CheckNTServiceStateMonitorType类型UnitMonitor动态设置AlertSeverity?
动态设置SCOM UnitMonitor的AlertSeverity基于目标类属性
好问题!在SCOM里直接在<AlertSettings>节点中使用$Target/Property[...]$表达式动态绑定AlertSeverity确实走不通——这个配置是监视器初始化时就固化的,不支持运行时动态解析目标属性。不过有两种靠谱的方案能实现你的需求:
方案一:利用组+监视器替代(适合简单场景)
这种方法不需要修改监视器类型,通过分组和替代来实现按属性值分配不同警报严重度:
- 第一步:创建动态组,根据你的
MyMonitoredClass类的AlertSeverity属性值分组。比如分别创建“高严重度服务组”“中严重度服务组”“低严重度服务组”,组的成员规则设置为:<Expression> <SimpleExpression> <ValueExpression> <Property>$Target/Property[MyMonitoredClass]/AlertSeverity$</Property> </ValueExpression> <Operator>Equal</Operator> <ValueExpression> <Value>High</Value> </ValueExpression> </SimpleExpression> </Expression> - 第二步:针对每个组,对你的
CheckNTServiceStateMonitorType监视器创建替代,在替代中设置对应的AlertSeverity(比如给高严重度组设为Critical,中组设为Warning,低组设为Information)。
这种方法的优势是配置简单,不需要编写自定义XML,适合属性值选项较少的场景。
方案二:自定义监视器类型(适合复杂/灵活场景)
如果你的属性值有更多变化,或者需要更精细的控制,可以通过包装内置的CheckNTServiceStateMonitorType来实现动态严重度:
- 创建一个自定义监视器类型,在其中引用
CheckNTServiceStateMonitorType作为数据源,然后在警报写入逻辑中动态读取目标属性来设置严重度。 - 关键是在自定义类型的
<WriteActions>里,使用表达式映射目标属性到警报Severity值(SCOM中Severity的枚举值:0=Information,1=Warning,2=Critical)。示例XML片段如下:<MonitorType ID="MyCustomServiceMonitorType" Accessibility="Internal"> <MonitorImplementation> <MemberModules> <!-- 引用内置的服务状态监视器作为数据源 --> <DataSource ID="ServiceState" TypeID="CheckNTServiceStateMonitorType"> <!-- 这里填写原监视器的配置参数 --> <ComputerName>$Target/Host/Property[Windows!Microsoft.Windows.Computer]/NetworkName$</ComputerName> <ServiceName>$Target/Property[MyMonitoredClass]/ServiceName$</ServiceName> <!-- 其他参数... --> </DataSource> <!-- 自定义警报写入动作,动态设置Severity --> <WriteAction ID="Alert" TypeID="Health!System.Health.GenerateAlert"> <Priority>1</Priority> <Severity> <ValueExpression> <Switch> <Expression> <Property>$Target/Property[MyMonitoredClass]/AlertSeverity$</Property> </Expression> <Case Value="High">2</Case> <Case Value="Medium">1</Case> <Case Value="Low">0</Case> <DefaultValue>1</DefaultValue> </Switch> </ValueExpression> </Severity> <AlertMessageId>$MPElement[Name="MyAlertMessage"]$</AlertMessageId> <!-- 其他警报配置... --> </WriteAction> </MemberModules> <RegularDetections> <RegularDetection MonitorTypeStateID="NotRunning"> <Node ID="Alert"/> </RegularDetection> </RegularDetections> </MonitorImplementation> </MonitorType> - 然后基于这个自定义类型创建UnitMonitor,就能实现根据目标类属性动态调整AlertSeverity了。
注意事项
- 方案一的替代会覆盖原监视器的AlertSeverity配置,要确保组的成员规则准确,避免遗漏或错误匹配。
- 方案二需要熟悉SCOM的监视器类型XML结构,测试时要验证属性映射和Severity的对应关系是否正确。
内容的提问来源于stack exchange,提问作者mh133
相关产品推荐
相关产品推荐

