如何基于EventData消息内容创建Windows事件ID为0的邮件告警
基于Windows事件EventData内容创建邮件告警的方法
问题描述
遇到事件ID为0的Windows事件时,无法通过事件ID创建邮件告警,需基于EventData/Data属性中的消息内容触发告警,可通过PowerShell或任务计划程序实现。
目标事件示例
<Event xmlns="http://schemas.microsoft.com/win/2004/08/events/event"> <System> <Provider Name="Test Portal"/> <EventID Qualifiers="0">0</EventID> <Level>2</Level> <Task>0</Task> <Keywords>0x80000000000000</Keywords> <TimeCreated SystemTime="2023-02-03"/> <EventRecordID>336</EventRecordID> <Channel>Application</Channel> <Computer></Computer> <Security/> </System> <EventData> <Data>Message: Your Service is not available.</Data> </EventData> </Event>
解决方案
一、PowerShell脚本监控方案
1. 编写监控与告警脚本
创建Monitor-ServiceAlert.ps1脚本,实现事件查询与邮件发送逻辑:
# 配置基础参数 $logName = "Application" $provider = "Test Portal" $alertKeyword = "Your Service is not available" $smtpServer = "smtp.yourdomain.com" $smtpPort = 587 $sender = "alerts@yourdomain.com" $recipient = "admin@yourdomain.com" # 可选:提前保存SMTP凭据,避免每次输入 # $credential = Import-Clixml -Path "C:\Scripts\SmtpCred.xml" $credential = Get-Credential -Message "输入SMTP账户信息" # 查询最近30分钟内符合条件的事件 $targetEvents = Get-WinEvent -FilterHashtable @{ LogName = $logName ProviderName = $provider ID = 0 StartTime = (Get-Date).AddMinutes(-30) } | ForEach-Object { $eventXml = [xml]$_.ToXml() if ($eventXml.Event.EventData.Data -match $alertKeyword) { $_ } } # 触发邮件告警 if ($targetEvents) { $alertBody = $targetEvents | ForEach-Object { "事件ID: $($_.Id)`n记录ID: $($_.RecordId)`n发生时间: $($_.TimeCreated)`n消息内容: $([xml]$_.ToXml()).Event.EventData.Data`n---" } -join "`n`n" Send-MailMessage -SmtpServer $smtpServer -Port $smtpPort ` -From $sender -To $recipient ` -Subject "【告警】服务不可用" ` -Body "检测到服务异常事件:`n`n$alertBody" ` -UseSsl -Credential $credential }
2. 定时执行配置
通过Windows任务计划程序设置:
- 创建新任务,触发器选择「按时间间隔重复」(如每5分钟)
- 操作选择「启动程序」,程序/脚本填
powershell.exe,添加参数:-ExecutionPolicy Bypass -File "C:\Scripts\Monitor-ServiceAlert.ps1"
二、任务计划程序直接触发方案
1. 创建自定义事件触发器
打开任务计划程序 → 新建任务:
- 新建触发器,选择「自定义」→ 点击「编辑事件筛选器」
- 切换到「XML」标签,勾选「手动编辑查询」,输入以下筛选规则:
<QueryList> <Query Id="0" Path="Application"> <Select Path="Application">*[System[Provider[@Name='Test Portal'] and EventID=0]] and *[EventData[Data='Message: Your Service is not available.']]</Select> </Query> </QueryList>
2. 添加告警操作
- 若系统支持「发送电子邮件」操作,直接填写SMTP信息、收件人和告警内容
- 若内置邮件操作被移除,选择「启动程序」,执行上述PowerShell脚本即可
内容的提问来源于stack exchange,提问作者want_to_be_calm
相关产品推荐
相关产品推荐

