You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何基于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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.30 00:13:29