首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >读取特定的Windows事件日志事件

读取特定的Windows事件日志事件
EN

Stack Overflow用户
提问于 2012-06-27 11:59:45
回答 3查看 34.9K关注 0票数 15

我正在开发一个程序,需要知道如何根据记录号读取Windows事件日志中的特定条目,这个脚本已经有了记录号。下面是我一直在使用的代码,但在找到我要查找的事件之前,我不想遍历所有的事件。有什么想法吗?

代码语言:javascript
复制
import win32evtlog

server = 'localhost' # name of the target computer to get event logs
logtype = 'System'
hand = win32evtlog.OpenEventLog(server,logtype)
flags = win32evtlog.EVENTLOG_BACKWARDS_READ|win32evtlog.EVENTLOG_SEQUENTIAL_READ
total = win32evtlog.GetNumberOfEventLogRecords(hand)

while True:
    events = win32evtlog.ReadEventLog(hand, flags,0)
    if events:
        for event in events:
            if event.EventID == "27035":
                print 'Event Category:', event.EventCategory
                print 'Time Generated:', event.TimeGenerated
                print 'Source Name:', event.SourceName
                print 'Event ID:', event.EventID
                print 'Event Type:', event.EventType
                data = event.StringInserts
                if data:
                    print 'Event Data:'
                    for msg in data:
                        print msg
                break
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-06-27 13:16:33

不是的!没有函数可以让您根据事件id获取事件。

参考:Event logging functions

代码语言:javascript
复制
GetNumberOfEventLogRecords  Retrieves the number of records in the specified event log.
GetOldestEventLogRecord     Retrieves the absolute record number of the oldest record 
                            in the specified event log.
NotifyChangeEventLog        Enables an application to receive notification when an event
                            is written to the specified event log.

ReadEventLog                Reads a whole number of entries from the specified event log.
RegisterEventSource         Retrieves a registered handle to the specified event log.

唯一感兴趣的其他方法是读取最早的事件。

您必须以任何方式迭代结果,并且您的方法是正确的:)

你只能像下面这样改变你的方法的形式,但这是不必要的。

代码语言:javascript
复制
events = win32evtlog.ReadEventLog(hand, flags,0)
events_list = [event for event in events if event.EventID == "27035"]
if event_list:
    print 'Event Category:', events_list[0].EventCategory

这和你正在做的是一样的,但是更简洁

票数 10
EN

Stack Overflow用户

发布于 2014-05-23 03:54:29

我意识到这是一个古老的问题,但我遇到了它,如果我遇到了,其他人也可能会遇到。

您还可以编写自定义查询,这些查询允许您通过可以编写脚本的任何WMI参数(包括事件ID)进行查询。它还有一个好处,那就是让你可以拉出所有那些VBS WMI查询的灰尘。实际上,我使用这个功能的频率比其他任何功能都要高。有关示例,请参阅:

  • http://technet.microsoft.com/en-us/library/ee176693.aspx
  • http://technet.microsoft.com/library/ee176695.aspx

以下是在应用程序日志中查询特定事件的示例。我还没有详细介绍它,但是您也可以构建一个WMI时间字符串,并查询特定日期/时间之间或之后的事件。

代码语言:javascript
复制
#! py -3

import wmi

def main():
    rval = 0  # Default: Check passes.

    # Initialize WMI objects and query.
    wmi_o = wmi.WMI('.')
    wql = ("SELECT * FROM Win32_NTLogEvent WHERE Logfile="
           "'Application' AND EventCode='3036'")

    # Query WMI object.
    wql_r = wmi_o.query(wql)

    if len(wql_r):
        rval = -1  # Check fails.

    return rval



if __name__ == '__main__':
    main()
票数 13
EN

Stack Overflow用户

发布于 2017-05-07 03:02:48

现在有一个名为winevt的python库(Python3及更高版本)可以执行您所请求的操作。您正在寻找的内容可以通过以下方式来实现:

代码语言:javascript
复制
from winevt import EventLog
query = EventLog.Query("System","Event/System[EventID=27035]")
event = next(query)
票数 9
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11219213

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档