您好,LC。我们的前提是您在服务器中已经启用了安全审核。如果您还没有启用安全审核的话,那么第一步就是启用安全审核。您想要做的事情起码是对登录事件故障进行审核。这样,每当有人尝试登录计算机却未能成功登录时,安全事件日志中将写入一个事件以及一个特定的事件代码。成员服务器和工作站的事件代码为 529;域控制器的事件代码为 675。对于我们这个例子来说,我们将使用事件代码 529,这是因为您在问题中提到的是“服务器”而不是“域控制器”。
注意。可能还有其他一些让您感兴趣的事件代码;在此就不必说了,脚本专家可不是安全专家。为简便起见,我们将重点放在代码 529 和 675 上,这两个代码都代表“未知的用户名或错误密码”事件。不过,修改我们将用于检查其他事件代码的 WQL 查询十分容易。
崭露头角的“犯罪现场调查员”可能已经发现了重大线索:安全事件日志中报告了失败登录,每一个失败登录都被标上了相同的事件代码:529。这就为我们的问题提供了一种解决方案:若要找到关于失败登录的信息,我们需要做的就是在安全事件日志中查询事件代码为 529 的所有事件。
strComputer = "."Set objWMIService = GetObject("winmgmts:{(Security)}//" & strComputer & "/root/cimv2")
Set colEvents = objWMIService.ExecQuery _ ("Select * from Win32_NTLogEvent Where Logfile = 'Security' and " _ & "EventCode = '529'")
For Each objEvent in colEvents 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 Next
相当简单吧,朋友。唯一不寻常的情况是,我们连接到 WMI 服务时需要注意以下提示。要执行该操作,我们必须写入“(Security)”权限(放在花括号内),如下所示:
Set objWMIService = GetObject("winmgmts:{(Security)}//" & strComputer & "/root/cimv2")
无论何时您想要访问安全事件日志,您都需要将此权限写入您的脚本中。另外,您(或至少是您的用户帐户)必须已经拥有访问安全事件日志的权限;脚本中包括此权限并不会自动地授予您访问权限。另一方面,不论您的用户帐户可能拥有何种权限、特权和许可,如果脚本中不包括权限,您就无法访问安全事件日志。
建立好连接之后,我们只需选择“Logfile”等于 Security 且“EventCode”等于 529 的所有“Win32_NTLogEvent”类实例即可。该操作将返回一个失败登录事件集合,接着,我们应将此集合回显到屏幕上。
此特定的脚本将返回一个包含所有失败登录事件的列表。也许您可能只想检索那些发生在一个特定时间段的事件(例如,只检索昨天或上星期的失败登录)。同样,您也可能想要设置一个监视系统,让该系统在发生此类事件后立即发送通知。此类事情有点儿超出了本专栏讨论的范围,但若要获得更多信息和示例脚本,请参阅“Microsoft Windows 2000 脚本编写指南”中的“日志”一章。