尝试使用Get-WinEvent创建一个简单的Windows Update错误查询(尽管我更喜欢查询WMI对象以用于SCUP):
get-winevent -logname System| Where-Object {$_.ProviderName -eq "Microsoft-Windows-WindowsUpdateClient"}
这似乎在很大程度上起作用。但是,它只返回信息事件而不是错误。这些是否位于其他地方,如果是这样,我将如何查询它们?对于某些背景,在我的环境中大约10%的Windows 10计算机上发生了特定的更新故障(缺少程序集文件),我希望将其作为目标,以便我可以部署解决方案。
使用Get-WinEvent的解决方案很好,但如果可能的话我更喜欢使用Get-WMIObject。
答案 0 :(得分:0)
您可以像这样使用 Win32_NTLogEvent :
Get-WmiObject Win32_NTLogEvent |?{($_.LogFile -eq 'System') -and ($_.SourceName -eq 'Microsoft-Windows-WindowsUpdateClient') }
注意:您可以使用类型进一步过滤,它会告诉您有关信息或错误或警告的信息。
希望它有所帮助。
答案 1 :(得分:0)
我找不到任何实际陈述的内容,但看起来float operand2 = S.top();
S.pop();
默认只返回信息消息。如果你想看到另一个,那么你需要告诉它返回那些。一种方法是使用Get-WinEvent
。
-FilterHashtable
这只会返回警告和错误。
1 - 错误
2 - 警告
4 - 信息
您可以查看枚举Get-WinEvent -FilterHashtable @{LogName='System';Level=1,2}
以查看我从哪里获取数字。
Looking at MS您可以看到哈希表过滤器支持的内容。
[System.Diagnostics.EventLogEntryType]
如果您的WMI查询遇到类似问题,那么您可以执行类似的操作
LogName=<String[]>
ProviderName=<String[]>
Path=<String[]>
Keywords=<Long[]>
ID=<Int32[]>
Level=<Int32[]>
StartTime=<DateTime>
EndTime=<DataTime>
UserID=<SID>
Data=<String[]>
*=<String[]>
您可以找到一些切线示例here
答案 2 :(得分:0)
编写WMI查询(这会覆盖奇怪的事件类型过滤器):
Get-WmiObject -Query "Select * from Win32_NTLogEvent" |?{(($_.LogFile -eq 'System') -and ($_.Type -in ("Error", "Warning"))) -and ($_.SourceName -eq 'Microsoft-Windows-WindowsUpdateClient') }
答案 3 :(得分:0)
好的,所以在做了一些额外的研究之后,我偶然发现了this website,它揭示了我遇到的问题。实质上,虽然大多数(如果不是所有)Windows事件都记录在 C:\ Windows \ System32 \ Winevt \ logs 文件夹中,但默认情况下并非所有Windows事件都在WMI中复制。
在PowerShell中, Get-WinEvent 在查询其事件数据时似乎使用上述文件夹,而 Get-EventLog 使用 Win32_WinNTLogEvent WMI类。
在我原来的问题中,我提到我无法使用Get-WinEvent查询Windows Update错误事件。这是因为我指的是系统日志文件,该文件不包含这些信息。 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返回的相同数据,必须首先修改注册表。同样,我在这个答案中发布的链接更详细地描述了该过程,但基本上我执行了以下注册表mod:
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 < / EM> 强>
修改注册表后,我能够按如下方式查询错误事件:
Get-WmiObject -query "SELECT * FROM Win32_NTLogEvent WHERE LogFile='Microsoft-Windows-WindowsUpdateClient/Operational' AND Type='Error'"
考虑到Windows Update错误可能默认存在于Win32_NTLogEvent WMI类中,有点痛苦(啊,Microsoft)。不过,这基本上解决了我的问题。
还有一点要提。上面的网站声明,在编辑注册表后,您将能够立即查询新事件。我必须先重启我的机器。