我在 Windows 2008 服务器上有一组性能计数器警报,我将其配置为在警报触发后将其写入事件查看器中。
它确实在此事件查看器中写入“应用程序和服务日志/Microsoft/Windows/诊断-PLA/操作”
我正在尝试在 vbscript 文件中针对此事件查看器编写 WMI 查询以读取其中的事件。
这是我的询问:
Set objWMIService = GetObject("winmgmts:" _
& "{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2")
Set colItems = objWMIService.ExecQuery("select * from Win32_NtLogEvent where Logfile = 'Microsoft-Windows-Bits-Client%4Operational'")
问题是:当我检查 colItems.count 时,它返回零,但是我知道那里有事件,当我导航到事件查看器时可以看到它们。
如果我查询“应用程序”事件查看器,相同的查询工作正常:
Set colItems = objWMIService.ExecQuery("select * from Win32_NtLogEvent where Logfile = 'Application'")
它正确返回计数。
知道第一个查询中的问题是什么吗?
WMI 不支持 Windows 事件日志的事件跟踪。应用程序事件日志(您的查询正在为其工作)是不使用 Windows 事件技术的经典事件日志。 Win32_NtLogEvent 公开了经典事件日志中记录的事件,但它不公开来自更新的事件日志(在 Vista 中引入)的事件。不过,您可以使用 PowerShell cmdlet Get-WinEvent 读取这些日志。
jon Z 在他的回答中所写的是正确的。但是....
有一个解决方法......
在注册表中创建以下键:
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\services\eventlog\Microsoft-Windows-Diagnostics-Performance/Operational
您不必在其下创建任何值,也无需重新启动。
之后,以下 WMI 查询将起作用:
Set colItems = objWMIService.ExecQuery("select * from Win32_NtLogEvent where Logfile = 'Microsoft-Windows-Diagnostics-Performance/Operational'")