好的,所以在做了一些额外的研究之后,我偶然发现了这个网站,它揭示了我遇到的问题。本质上,虽然大多数(如果不是所有)Windows 事件都记录在C:\Windows\System32\Winevt\logs文件夹中,但默认情况下并非所有 Windows 事件都在 WMI 中复制。
在 PowerShell 中,Get-WinEvent在查询其事件数据时似乎使用上述文件夹,而Get-EventLog使用Win32_WinNTLogEvent WMI 类。
在我最初的问题中,我提到我无法使用 Get-WinEvent 查询 Windows 更新错误事件。这是因为我指向的是系统日志文件,它不包含信息。Microsoft-Windows-WindowsUpdateClient/Operational日志文件(文字路径为C:\Windows\System32\Winevt\logs\Microsoft-Windows-UpdateClient%4Operational.evtx)确实包含此信息,因此我的查询可以简单地使用某些东西进行更改类似于以下内容:
Get-WinEvent -logname "Microsoft-Windows-WindowsUpdateClient/Operational" | Where-Object {$_.LevelDisplayName -eq "Error"}
为了使用Win32_NTLogEvent WMI 类查询 Get-WinEvent 返回的相同数据,必须首先修改注册表。同样,我在此答案中发布的链接更详细地描述了该过程,但基本上我执行了以下注册表模式:
Windows Registry Editor Version 5.00
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\EventLog\Microsoft-Windows-WindowsUpdateClient/Operational]
"File"="%SystemRoot%\\System32\\Winevt\\Logs\\Microsoft-Windows-WindowsUpdateClient%4Operational.evtx"
"Primary Module"="Microsoft-Windows-WindowsUpdateClient/Operational"
"Microsoft-Windows-WindowsUpdateClient/Operational"=hex(2):25,00,53,00,79,00,73,00,74,\
00,65,00,6d,00,52,00,6f,00,6f,00,74,00,25,00,5c,00,73,00,79,00,73,00,74,00,\
65,00,6d,00,33,00,32,00,5c,00,77,00,65,00,76,00,74,00,61,00,70,00,69,00,2e,\
00,64,00,6c,00,6c,00,00,00
注意:末尾的“Microsoft-Windows-WindowsUpdateClient/Operational”扩展字符串 (REG_EXPAND_SZ) 指向%SystemRoot%\system32\wevtapi.dll
修改注册表后,我可以查询错误事件如下:
Get-WmiObject -query "SELECT * FROM Win32_NTLogEvent WHERE LogFile='Microsoft-Windows-WindowsUpdateClient/Operational' AND Type='Error'"
考虑到 Windows Update 错误可能默认出现在 Win32_NTLogEvent WMI 类中(啊,微软),这有点痛苦。不过,这基本上解决了我的问题。
还要提一点。上面的网站指出,在编辑注册表后,您可以立即查询新事件。我必须先重新启动我的机器。