您好,OG。您知道,为避免徒劳无功,我们决定检查一下我们这里的某一台计算机上的事件日志,看看是否值得研究一番。这台计算机上的安全事件日志中有 42,815 个事件,其中,只有 286 个是失败事件。如果我们假定失败事件是我们真正关心的事件,那么在这里我们有两个选择:我们可以不辞辛劳地挨个检查这 42,815 个事件,尝试找出相对很少的失败事件,也可以编写一个仅返回失败事件的脚本。即便对于脚本专家,这也不是什么棘手的决定。
下面这个脚本可以从所有事件日志仅返回审核失败、警告和错误:
strComputer = "."
Set objWMIService = GetObject("winmgmts:" _
& "{(Security)}//" & strComputer & "/root/cimv2")
Set colLoggedEvents = objWMIService.ExecQuery _
("Select * From Win32_NTLogEvent Where EventType <> 4 AND EventType <> 8")
For Each objEvent in colLoggedEvents
Wscript.Echo "Category: " & objEvent.Category
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.EventType
Next
向您展示脚本后,我们应该指出该脚本仅在 Windows XP 和 Windows Server 2003 上运行。但是不要慌:我们将马上为您介绍可以在 Windows 2000 上运行的修订版本。
嗨,不用感谢我们,这是我们的份内事。
首先,我们需要将 WMI 服务绑定到正被讨论的计算机(在此示例脚本中,指的是本地计算机)上。您可能注意到了,在进行此连接时,我们在别名字符串中包含了 (Security) 权限:
Set objWMIService = GetObject("winmgmts:" _
& "{(Security)}//" & strComputer & "/root/cimv2")
这重要吗?嗯,我们要检索的内容之一就是审核失败。审核失败记录在安全事件日志中,如果不包含 (Security) 权限,则将不能从安全事件日志检索事件。是的,我们知道您是计算机的管理员。没关系:为了从安全事件日志检索记录,还是需要使用 (Security) 权限。
换句话说,是的,这很重要。
接下来,我们发出以下 WQL 查询,它可以将检索到的记录限制为审核失败、警告和错误:
Set colLoggedEvents = objWMIService.ExecQuery _
("Select * From Win32_NTLogEvent Where EventType <> 4 AND EventType <> 8")
您可能会问,该查询进行地并不明显,如何做到的?这个 – 哦,对了:的确不是非常明显,难道不是吗?嗯,我们发现,EventType 属性表示正在写入事件日志的记录的类型,而且,EventType 将始终是以下值之一:
|
值 |
含义 |
|
1 |
错误 |
|
2 |
警告 |
|
4 |
信息 |
|
8 |
安全审核成功 |
|
16 |
安全审核失败 |
在查询中,我们寻找 EventType 不等于 4(信息事件)以及 EventType 不等于 8(安全审核成功)的所有事件。这样就滤除了信息事件和安全审核成功事件;例如,信息等于 4 的话,该事件将从返回的数据中排除。这样,就只剩下三个事件类型要检索:审核失败、警告和错误。刚好,这些正是您感兴趣的三个事件类型。
脚本的其余部分只是一个可以回显每个事件的相关信息的 For Each 循环。正如我们经常所说的:问题得到了解决。
好了,除非您运行的是 Windows 2000,否则问题就解决了。这是因为在 Windows 2000 上找不到 EventType 属性;而 Win32_NTLogEvent 类使用 Type 属性。在 Windows 2000 上,Type 将是以下字符串值之一:
|
值 |
含义 |
|
error |
错误 |
|
warning |
警告 |
|
information |
信息 |
|
audit success |
安全审核成功 |
|
audit failure |
安全审核失败 |
为使我们的脚本可以在 Windows 2000 上运行,我们需要对 Type 属性进行过滤,去掉类型为 information 和类型为 audit success 的记录。修改后的 WQL 查询如下所示:
Set colLoggedEvents = objWMIService.ExecQuery _
("Select * From Win32_NTLogEvent Where Type <> 'information' AND Type <> 'audit success'")
修改后的脚本如下所示:
strComputer = "."
Set objWMIService = GetObject("winmgmts:" _
& "{(Security)}//" & strComputer & "/root/cimv2")
Set colLoggedEvents = objWMIService.ExecQuery _
("Select * From Win32_NTLogEvent Where Type <> 'information' AND Type <> 'audit success'")
For Each objEvent in colLoggedEvents
Wscript.Echo "Category: " & objEvent.Category
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
Next
这样就可以了。
顺便说一下,有 42,815 个事件并不意味着我们没有定期备份和清除事件日志。而我们只是让这些记录累积起来,以便我们……在今天的专栏有更好的示例可以使用。现在,专栏结束了,我们也该备份和清除事件日志了,就像您应该做的一样。
不,提醒您,不是今天。但是很快,非常快……