我有以下脚本:
$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).
但我面临的问题是:获取已通知的相同错误消息的多个通知。
我希望我足够明确地提出我的确切问题。
你能帮我解决一下,如何解决这个问题?
答案 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循环如何长期影响资源使用,你必须测试)。