在Windows事件日志上为电子邮件通知设置计数器

时间:2014-01-07 20:23:07

标签: windows events powershell powershell-v2.0

我有以下脚本:

$pattern = 'Unable to authenticate user!'
$events = Get-WinEvent -ea SilentlyContinue `
-ProviderName "Windows DB Controller - Task Manager Service"|
Where-Object { $_.TimeCreated -gt [datetime]::today -and $_.Message -match $pattern }
$events   >> D:\Error.txt 

if ($events) {
Send-MailMessage -SmtpServer smtp.domain.com -From No-reply@domain.com -To sunny@domain.com -Subject 'Error found in log' -Body $events
}

我已安排它每10分钟运行一次,故意,我想用上面的脚本实现以下几点:

Search the specified error message in the event viewer log only for current-date and as soon as the error message encountered send a email notification to me but didn't want to receive email notification for the error message which appreared today and for which I had already been notified (I mean , wanted to receive error-notification only once for a specific time of current day).

但我面临的问题是:获取已通知的相同错误消息的多个通知。

我希望我足够明确地提出我的确切问题。

你能帮我解决一下,如何解决这个问题?

3 个答案:

答案 0 :(得分:1)

如果您每10分钟运行一次脚本,我会更改Where-Object的条件,而不是获取所有“今天”的事件;我会改变它只获得过去10分钟发生的事件。即代码变为:

Where-Object { $_.TimeCreated -gt [datetime]::now.AddMinutes(-10) -and $_.Message -match $pattern }

答案 1 :(得分:1)

看一下这个帖子:

Powershell - Tail Windows Event Log? Is it possible?

这是关于事件日志的尾随,但同样的方法应该适用于你要做的事情。只需在运行之间将最后一个索引号保存到文件中。

答案 2 :(得分:1)

以下方法如何:

Register-WmiEvent -Query "select * from __InstanceCreationEvent where TargetInstance ISA 'Win32_NTLogEvent' and TargetInstance.SourceName = 'Windows DB Controller - Task Manager Service' and TargetInstance.Message LIKE '%Unable to authenticate user!%'" -SourceIdentifier "MyEventListener" -Action {
    #Your actions
    write-host "$($eventargs.NewEvent.TargetInstance.RecordNumber) at $($eventargs.NewEvent.TargetInstance.TimeGenerated)"
}

它使用WMI订阅使用您的标准生成事件日志条目时发生的事件。动作本身只会返回新对象(因此不再重复)。我已经提供了一个示例操作来帮助您了解如何访问该对象。这种方法可以为您提供实时监控。

在操作中,$eventargs.NewEvent.TargetInstance会为您提供win32_ntlogevent实例的对象。要查看此类的属性,请查看TechNet或运行以下命令:

([wmiclass]'win32_ntlogevent').Properties | ft Name

要使脚本永久运行,只需使用powershell -file script.ps1 -noexit调用脚本,或在脚本末尾包含while($true)循环。 (我不确定while循环如何长期影响资源使用,你必须测试)。