可通过PowerShell监听Windows安全日志,用Register-WinEvent订阅4624/4625等关键事件,触发弹窗、邮件、Teams/钉钉Webhook通知,并需管理员权限后台运行、错误捕获及定期清理订阅。
可以通过 powershell 监听 windows 事件日志(如安全、系统、应用程序日志),在匹配特定事件 id 或条件时,立即触发通知(如弹窗、邮件、声音、teams/钉钉 webhook)。核心是 get-winevent 结合 -filterhashtable 实现高效筛选,并用 register-winevent 或轮询机制实现实时响应。
监听指定事件 ID(例如登录成功/失败)
Windows 安全日志中,常见关键事件包括:
- 4624:账户成功登录(需关注 Logon Type 字段区分本地/远程)
- 4625:账户登录失败
- 4720:用户账户创建
- 4722:用户账户启用
- 4688:进程创建(可用于监控高危命令执行)
使用 Register-WinEvent 注册事件订阅,避免高频轮询:
Register-WinEvent -LogName Security -FilterXPath '*[System[(EventID=4625 or EventID=4624)]]' -Action {
$event = $EventArgs.Event
$user = ($event.Properties[5].Value -split '\')[-1] # 提取登录用户名
$ip = $event.Properties[18].Value # 工作站 IP(若存在)
[System.Windows.Forms.MessageBox]::Show("⚠️ 登录事件:$($event.Id) | 用户:$user | 来源:$ip", "安全告警", 0, 48)
}发送邮件通知(无需 Outlook)
使用 Send-MailMessage(PowerShell 5.1)或 Send-MgUserMail(Microsoft Graph,推荐用于企业环境):
- 配置 SMTP 服务器(如公司邮箱或 Gmail 应用专用密码)
- 提取事件关键字段:时间、计算机名、事件 ID、用户、来源 IP、消息摘要
- 建议添加简短 HTML 正文 + 高亮关键信息,提升可读性
示例片段(SMTP 方式):
$body = @" <h3>? 安全事件告警</h3> <p><strong>时间:</strong>$($event.TimeCreated)<br> <strong>主机:</strong>$env:COMPUTERNAME<br> <strong>事件ID:</strong>$($event.Id)<br> <strong>用户:</strong>$user<br> <strong>来源IP:</strong>$ip</p> "@ Send-MailMessage -SmtpServer "smtp.company.com" -From "alert@company.com" -To "admin@company.com" -Subject "安全日志告警:EventID $($event.Id)" -Body $body -BodyAsHtml -Priority High
集成 Teams 或钉钉 Webhook(推荐生产环境)
比邮件更实时,支持富文本、卡片、@提醒:
- Teams:获取频道 Webhook URL → 构造 JSON 卡片(含标题、事实列表、颜色标识)
- 钉钉:使用自定义机器人,开启“加签”后构造含 timestamp + sign 的请求头
- 建议封装为函数,统一处理不同事件类型和严重等级(如 4625 标红,4720 标黄)
Teams 示例(简化):
$webhook = "https://outlook.office.com/webhook/xxx"
$body = @{
"@type" = "MessageCard"
"@context" = "https://schema.org/extensions"
"themeColor" = if ($event.Id -eq 4625) { "d32a1d" } else { "0078d7" }
"summary" = "安全事件:EventID $($event.Id)"
"sections" = @(@{
"activityTitle" = "? Windows 安全日志告警"
"facts" = @(
@{ "name" = "时间"; "value" = $event.TimeCreated.ToString("yyyy-MM-dd HH:mm:ss") },
@{ "name" = "主机"; "value" = $env:COMPUTERNAME },
@{ "name" = "用户"; "value" = $user },
@{ "name" = "来源"; "value" = $ip }
)
})
} | ConvertTo-Json -Depth 4
Invoke-RestMethod -Uri $webhook -Method Post -Body $body -ContentType 'application/json'部署与稳定性要点
脚本需长期运行,应考虑以下实践:
- 以 管理员权限 启动 PowerShell(尤其监听安全日志需 SeSecurityPrivilege)
- 用
Start-Process powershell.exe -ArgumentList "-File .watcher.ps1" -WindowStyle Hidden后台静默运行 - 添加错误捕获与日志记录(写入
$env:TEMPevent-watcher.log) - 避免内存泄漏:定期清理旧事件订阅(
Get-EventSubscriber | Unregister-Event) - 首次运行可预加载最近 1 小时事件,防止遗漏启动瞬间的告警
不复杂但容易忽略。

















