我正在尝试跟踪指定安全事件的发生。为了实现这一点,我希望每当这些事件记录在 Windows 安全日志中时都显示一条消息。由于显示消息是任务计划程序中已弃用的功能,因此我使用 Powershell 命令来实现这一点,如下所示:
扳机
On event - Log: Security, Source: Microsoft-Windows-Eventlog, EventID: 1102
行动
-executionpolicy bypass -windowstyle hidden -file C:\1102.ps1
1102.ps1
Add-Type -AssemblyName System.Windows.Forms
$lastEvt = Get-WinEvent -LogName 'Security' -MaxEvents 20 | ? { $_.Id -eq 1102 } | select -First 1
[System.Windows.Forms.MessageBox]::Show(($lastEvt.Message), 'Event ID: 1102')
事件 ID1102每当清除审计日志时都会发生这种情况。要触发此操作,我只需进入事件查看器,右键单击安全日志,然后单击“清除日志...”。不久之后,一条消息就会按预期显示。
但是,当我尝试触发事件 ID4719通过更改系统审核策略,尽管事件已记录在安全日志中,但没有显示任何消息。两个触发器在任务计划程序中的设置类似,所以我不明白为什么这对一个有效而对另一个无效。
答案1
不要为此使用 TaskSceduler。使用永久的 WmiEvent 消费者/观察者。使用 RegEx 或追踪多个事件。
例子:
Add-Type -AssemblyName System.Windows.Forms
$lastEvt = Get-WinEvent -LogName 'Security' -MaxEvents 20 | ? { $_.Id -eq '1102|4719' } | select -First 1
[System.Windows.Forms.MessageBox]::Show(($lastEvt.Message), "Event ID: $($_.Id)")
这对于多种语言来说都是可能的,所以不是 PS 特有的,但当然 PS 也可以用于它。
例子:
Powershell 集中日志监控器监控服务器集合中的指定日志事件,并在遇到监控事件时发送电子邮件警报。 https://gallery.technet.microsoft.com/scriptcenter/ed188912-1a20-4be9-ae4f-8ac46cf2aae4
https://learn-powershell.net/2013/08/02/powershell-and-events-wmi-temporary-event-subscriptions
http://irl33t.com/blog/2011/06/powershell-script-watch-eventlogs-ps1
https://www.codeproject.com/Articles/4857/%2fArticles%2f4857%2fA-realtime-event-log-monitoring-tool
答案2
终于搞清楚了……原来 4719 的来源是Microsoft-Windows-安全-审计并不是微软Windows事件日志。