三国志11上庸开局:可以从安全事件日志里只取出“失败”事件吗?

来源:百度文库 编辑:偶看新闻 时间:2024/07/05 21:08:43

可以从安全事件日志里只取出“失败”事件吗?

问:

嗨,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 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) 参数:

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 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

我们今天就不再介绍这段脚本的工作原理了,但如果您有任何相关疑问,请让我们知道。我们可能会在下一个专栏中详细介绍。