首页 > 解决方案 > 如何使用 win32evtlog 列出带有限定符的 EventID

问题描述

运行简单的win32evtlog 时- 我可以列出大量事件 - 但是当我过滤到我需要的事件时;例如6005,它们没有出现。我已经过滤到那些可见并且可以找到的。

在以下代码(Python 3.7 和 win32 v222)中,如果您取出 6005 的 IF 语句,您将获得一系列事件。将 IF 语句更改为数字之一;例如16,你应该得到一些结果。

import win32evtlog as wlg

handle = wlg.OpenEventLog(None,'System')
flags = wlg.EVENTLOG_BACKWARDS_READ|wlg.EVENTLOG_SEQUENTIAL_READ

while True:
    events = wlg.ReadEventLog(handle, flags, 0)
    for event in events:
        if event.EventID == 6005:
            print('Event ID:', event.EventID)
            print('Time Generated:', event.TimeGenerated)

我可以使用 Powershell 返回结果,手动检查会在 Windows 事件查看器中找到 6005。

Get-EventLog -LogName system | where-object {$_.eventid -eq 6005}

在我写这个问题时进行了一些研究 - 我发现事件 API 对某些事件有不同的方法,因为它们包括限定符:

<EventID Qualifiers="32768">6005</EventID>  

所以看来我需要找到一种方法来转换合格事件(有时称为 InstanceID),就像这段代码一样 Scalyr [第 375 行+]
我无法破译代码 atm,因为我仍在学习 - 但我明白要点。

标签: pythonwindowseventslogging

解决方案


Eeeeeventually - 我基本上需要在结果中添加 1 位才能收到正确的答案。

import win32evtlog as wlg

handle = wlg.OpenEventLog(None,'System')
flags = wlg.EVENTLOG_BACKWARDS_READ|wlg.EVENTLOG_SEQUENTIAL_READ

while True:
    events = wlg.ReadEventLog(handle, flags, 0)
    for event in events:
        if event.EventID & 0x1fff == 6005:
            print('Event ID:', event.EventID  & 0x1fff)
            print('Time Generated:', event.TimeGenerated)

并研究其他东西 - 从这里的其他人那里得到了这个答案,他有类似的问题 Unusual event.EventID numbers like -2147481364 in Python using win32evtlog from Pywin32 出于某种原因,这以前从未出现在搜索结果中......但是,在这里链接,因为它是一种类似的看待事物的方式。


推荐阅读