嗨,Scripting Guy!是否有什么辦法可以從安全事件日志里只取出“失敗審核”事件?
-- KA
嗨,KA。很有趣,是吧:每次一有關(guān)于失敗的主題,人們總是會找 Scripting Guy 幫忙。是什么讓你們認為我們對于失敗無所不知呢?
好吧,您是對的:這個問題比較愚蠢。至于您的 問題,從安全事件日志里只取出“安全失敗審核”事件是很容易的事情;事實上,我們正好有一個腳本可以實現(xiàn)這個目的:
strComputer = "."Set objWMIService = GetObject("winmgmts:" _& "{impersonationLevel=impersonate,(Security)}!\\" & _strComputer & "\root\cimv2")Set colLoggedEvents = objWMIService.ExecQuery _("Select * FROM Win32_NTLogEvent WHERE Logfile = ‘Security‘ " & _"AND EventType = 5")For Each objEvent in colLoggedEventsWscript.Echo "==================================================="Wscript.Echo "Category: " & objEvent.CategoryWscript.Echo "Computer Name: " & objEvent.ComputerNameWscript.Echo "Event Code: " & objEvent.EventCodeWscript.Echo "Message: " & objEvent.MessageWscript.Echo "Record Number: " & objEvent.RecordNumberWscript.Echo "Source Name: " & objEvent.SourceNameWscript.Echo "Time Written: " & objEvent.TimeWrittenWscript.Echo "Event Type: " & objEvent.TypeWscript.Echo "User: " & objEvent.UserWscript.EchoNext
一個非常簡單小巧的腳本,但有兩件事情您需要注意。首先,請注意我們在連接 WMI 時使用了 (Security) 參數(shù):
Set objWMIService = GetObject("winmgmts:" _& "{impersonationLevel=impersonate,(Security)}!\\" & _strComputer & "\root\cimv2")
每次處理安全事件日志時都必須包含此參數(shù);沒有這個參數(shù),腳本就不能起作用。哦,是的,我們知道您是本地管理員,也知道您有權(quán)讀取安全事件日志。但是不管怎樣,WMI 并不關(guān)心這個:您還是必須包含 (Security) 參數(shù)。
其次,請注意我們的 WHERE 子句的兩個部分:
("Select * from Win32_NTLogEvent WHERE Logfile = ‘Security‘ " & _"AND EventType = 5")
對于這個腳本,我們只希望檢索滿足以下兩個條件的事件:安全事件日志中記錄的、且 EventType 為 5 的事件,恰如您可能料到的,EventType 為 5 在 WMI 中表示失敗審核。此外,您也可以搜索 EventTypes 1(錯誤)、2(警告)、3 (信息)或 4(安全審核成功)。由于我們需要失敗審核事件,因此我們在安全事件日志中查找 EventType 為 5 的事件。即:
WHERE Logfile = ‘Security‘ AND EventType = 5
夠酷吧,嗯?如果您需要了解有關(guān)處理事件日志(包括一些可能對您比較有用的示例查詢)的更多信息,請訪問“Microsoft Windows 2000 腳本指南” 中的“日志”一章。
并且,您可能還需要注意一件事情。如上所示,這個腳本將會以 WMI 的默認 Universal Time Coordinate 格式顯示 TimeWritten 屬性。換句話說,您將得到類似如下結(jié)果:
20041025124000.000000-420
多么……美妙……。不過別失望。以下這個修改后的腳本包含一個函數(shù) (WMIDateStringTodate),這個函數(shù)可以將 UTC 值轉(zhuǎn)換為比較容易讀取的格式:
strComputer = "."Set objWMIService = GetObject("winmgmts:" _& "{impersonationLevel=impersonate,(Security)}!\\" & _strComputer & "\root\cimv2")Set colLoggedEvents = objWMIService.ExecQuery _("Select * FROM Win32_NTLogEvent WHERE Logfile = ‘Security‘ " & _"AND EventType = 5")For Each objEvent in colLoggedEventsWscript.Echo "==================================================="Wscript.Echo "Category: " & objEvent.CategoryWscript.Echo "Computer Name: " & objEvent.ComputerNameWscript.Echo "Event Code: " & objEvent.EventCodeWscript.Echo "Message: " & objEvent.MessageWscript.Echo "Record Number: " & objEvent.RecordNumberWscript.Echo "Source Name: " & objEvent.SourceNamedtmEventDate = objEvent.TimeWrittenstrTimeWritten = WMIDateStringToDate(dtmEventDate)Wscript.Echo "Time Written: " & strTimeWrittenWscript.Echo "Event Type: " & objEvent.TypeWscript.Echo "User: " & objEvent.UserWscript.EchoNextFunction WMIDateStringToDate(dtmEventDate)WMIDateStringToDate = CDate(Mid(dtmEventDate, 5, 2) & "/" & _Mid(dtmEventDate, 7, 2) & "/" & Left(dtmEventDate, 4) _& " " & Mid (dtmEventDate, 9, 2) & ":" & _Mid(dtmEventDate, 11, 2) & ":" & Mid(dtmEventDate, _13, 2))End Function
我們今天就不再介紹這段腳本的工作原理了,但如果您有任何相關(guān)疑問,請讓我們知道。我們可能會在下一個專欄中詳細介紹。