【问题标题】:Writing to Windows Event Log using win32evtlog from pywin32 library使用 pywin32 库中的 win32evtlog 写入 Windows 事件日志
【发布时间】:2018-07-17 15:26:59
【问题描述】:

我有一个将在 Windows 服务器上运行的简单 Python 脚本,我想将整个脚本中的特定事件记录到 Windows 事件日志中。有没有人有一个简单而精确的写入 Windows 事件日志的示例,以便我可以从事件查看器查看事件。我已经阅读了 pywin32 库的文档,但找不到任何明确的示例。我尝试使用以下方法构建事件:

win32evtlogutil.ReportEvent(ApplicationName, EventID, EventCategory,
                EventType, Inserts, Data, SID)

我没有成功,有人可以更深入地解释一下 ReportEvent 吗?

【问题讨论】:

  • 没有成功”是什么意思?你实际上尝试了什么?你遇到了什么问题?

标签: windows python-3.x events event-log pywin32


【解决方案1】:

一个简单的例子:

>>> import sys
>>> import win32evtlogutil
>>> import win32evtlog
>>> import time
>>>
>>>
>>> "Python {0:s} on {1:s}".format(sys.version, sys.platform)
'Python 3.5.4 (v3.5.4:3f56838, Aug  8 2017, 02:17:05) [MSC v.1900 64 bit (AMD64)] on win32'
>>>
>>> DUMMY_EVT_APP_NAME = "Dummy Application"
>>> DUMMY_EVT_ID = 7040  # Got this from another event
>>> DUMMY_EVT_CATEG = 9876
>>> DUMMY_EVT_STRS = ["Dummy event string {0:d}".format(item) for item in range(5)]
>>> DUMMY_EVT_DATA = b"Dummy event data"
>>>
>>> "Current time: {0:s}".format(time.strftime("%Y-%m-%d %H:%M:%S", time.localtime()))
 'Current time: 2018-07-18 20:03:08'
>>>
>>> win32evtlogutil.ReportEvent(
...     DUMMY_EVT_APP_NAME, DUMMY_EVT_ID, eventCategory=DUMMY_EVT_CATEG,
...     eventType=win32evtlog.EVENTLOG_WARNING_TYPE, strings=DUMMY_EVT_STRS,
...     data=DUMMY_EVT_DATA)
>>>

输出

您可以在 Event Viewer (mmc) 窗口的(上)图像中看到我从代码中输入的值与事件字段之间的对应关系。

win32evtlogutil.ReportEvent[GitHub]: mhammond/pywin32 - Python for Windows (pywin32) Extensions 的一部分,[GitHub]: mhammond/pywin32 - Python for Windows (pywin32) ExtensionsWINAPI 之上的 Python 包装器。

[MS.Docs]: ReportEventW function 解释了您需要了解的所有内容,这是用于完成此任务的 WINAPI。请务必仔细阅读它(以及它引用的其他一些 URL),以便更熟悉参数、它们的值可能是什么以及其他信息。

确保不要滥用(包括测试),否则您最终可能会被大量垃圾数据污染事件日志。

【讨论】:

  • 那么请您将答案标记为解决方案,以便可以看到它解决了您的问题?
  • 这是一个了不起的答案和例子,除了一件事。如果您不是为 event_strings 参数做五个虚拟字符串,而是一个字符串,它会自动将您的单个字符串转换为一大堆字符串,每个字符串一个字符。就像“这是一个测试”变成“T”、“h”、“i”、“s”、“”、“i”、“s”、“”、“a”、“”、“t”、“美东时间”。那么,您是否还可以包含该字符串的一个版本,它是一个普通的单个字符串,但有效?明白了,是 DUMMY_EVT_STRS = [],然后是 DUMMY_EVT_STRS.append(message1), ...
  • 不,所以它的名字是DUMMY_EVT_STRS,或者关键字是strings 。用户应该知道它需要一堆字符串,即使那一堆只包含一个字符串。传递单个字符串不尊重 API(官方 URL 也表明)。此外,您不需要 2 行,但是:DUMMY_EVT_STRS = [message1].
  • Strings 只是将内容添加到 xml 中的 Data 元素。我想为此元素设置名称属性。你能分享这方面的任何指示吗?像这样 -> <Data Name="ProcessID">4</Data>
  • 嗯,我不确定是否允许该节点具有属性。快速 API 浏览,没有产生积极的结果。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-10-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-11-01
  • 1970-01-01
相关资源
最近更新 更多