2014-01-07 25 views
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 [email protected] -To [email protected] -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).

但我在這裏面臨的問題是:獲取多個通知相同的錯誤消息已被通知。

我希望我清楚地知道我確切的問題。

請問你能幫我解決這個問題嗎?

回答

1

如果您每隔10分鐘運行一次腳本,我會更改Where-Object的條件,以避免獲取所有「今天」的事件;我會改變它只得到最近10分鐘發生的事件。即代碼變成:

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

@HAL .. + 1。這似乎工作。我會在我的系統上測試它,並會讓你知道結果。 – Sunny

1

在這個線程看一看:

Powershell - Tail Windows Event Log? Is it possible?

這是對尾礦事件日誌,但同樣的方法應該爲你tyring做什麼工作。只需將最後一個索引號保存到運行之間的文件中。

+0

@ mjolinor ..但是這個代碼片斷是泛化的,這就是爲什麼非常慢,而且沒有對錯誤消息,提供者名稱和時間設置約束。如何滿足我的要求? – Sunny

+0

它應該比使用-After快得多,它將使它讀取整個日誌,並且它應該只被記錄到你還沒有讀取的日誌條目中。 – mjolinor

+0

我很抱歉,但我仍然沒有得到,因爲在'-LogName System'下,我不關心閱讀最新的日誌條目。我只對特定日期內來自固定提供者的特定錯誤消息感興趣,而沒有重複出現的消息。 – Sunny

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-loop如何長期影響資源使用,你必須測試)。

+0

@Frode ... + 1。我會在我的系統上測試它,並會讓你知道結果。 – Sunny