可以从安全事件日志里只取出“失败”事件吗?问:嗨,Scripting Guy!是否有什么办法可以从安全事件日志里只取出“失败审核”事件? -- KA 答:嗨,KA。很有趣,是吧:每次一有关于失败的主题,人们总是会找 Scripting Guy 帮忙。是什么让你们认为我们对于失败无所不知呢? 好吧,您是对的:这个问题比较愚蠢。至于您的 问题,从安全事件日志里只取出“安全失败审核”事件是很容易的事情;事实上,我们正好有一个脚本可以实现这个目的: 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 colLoggedEvents Wscript.Echo "===================================================" Wscript.Echo "Category: " & objEvent.Category Wscript.Echo "Computer Name: " & objEvent.ComputerName Wscript.Echo "Event Code: " & objEvent.EventCode Wscript.Echo "Message: " & objEvent.Message Wscript.Echo "Record Number: " & objEvent.RecordNumber Wscript.Echo "Source Name: " & objEvent.SourceName Wscript.Echo "Time Written: " & objEvent.TimeWritten Wscript.Echo "Event Type: " & objEvent.Type Wscript.Echo "User: " & objEvent.User Wscript.Echo Next 一个非常简单小巧的脚本,但有两件事情您需要注意。首先,请注意我们在连接 WMI 时使用了 (Security) 参数: Set objWMIService = GetObject("winmgmts:" _ & "{impersonationLevel=impersonate,(Security)}!\\" & _ strComputer & "\root\cimv2") 每次处理安全事件日志时都必须包含此参数;没有这个参数,脚本就不能起作用。哦,是的,我们知道您是本地管理员,也知道您有权读取安全事件日志。但是不管怎样,WMI 并不关心这个:您还是必须包含 (Security) 参数。 其次,请注意我们的 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 够酷吧,嗯?如果您需要了解有关处理事件日志(包括一些可能对您比较有用的示例查询)的更多信息,请访问“Microsoft Windows 2000 脚本指南” 中的“日志”一章。 并且,您可能还需要注意一件事情。如上所示,这个脚本将会以 WMI 的默认 Universal Time Coordinate 格式显示 TimeWritten 属性。换句话说,您将得到类似如下结果: 20041025124000.000000-420 多么……美妙……。不过别失望。以下这个修改后的脚本包含一个函数 (WMIDateStringTodate),这个函数可以将 UTC 值转换为比较容易读取的格式: 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 colLoggedEvents Wscript.Echo "===================================================" Wscript.Echo "Category: " & objEvent.Category Wscript.Echo "Computer Name: " & objEvent.ComputerName Wscript.Echo "Event Code: " & objEvent.EventCode Wscript.Echo "Message: " & objEvent.Message Wscript.Echo "Record Number: " & objEvent.RecordNumber Wscript.Echo "Source Name: " & objEvent.SourceName dtmEventDate = objEvent.TimeWritten strTimeWritten = WMIDateStringToDate(dtmEventDate) Wscript.Echo "Time Written: " & strTimeWritten Wscript.Echo "Event Type: " & objEvent.Type Wscript.Echo "User: " & objEvent.User Wscript.Echo Next Function 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 我们今天就不再介绍这段脚本的工作原理了,但如果您有任何相关疑问,请让我们知道。我们可能会在下一个专栏中详细介绍。 |
|