使用pywin32库中的win32evtlog将日志写入Windows事件日志

3
我有一个简单的Python脚本将在Windows服务器上运行,我想记录特定事件到Windows事件日志中。是否有人有一个简单而精确的编写到Windows事件日志的示例,以便我可以从事件查看器中查看该事件。我已经阅读了pywin32库的文档,但找不到清晰的示例。我已尝试使用以下命令构建事件:
win32evtlogutil.ReportEvent(ApplicationName, EventID, EventCategory,
                EventType, Inserts, Data, SID)

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


had no success”是什么意思?你实际上尝试了什么?你遇到了什么问题? - CristiFati
pywin32基础代码中有一个很好的例子:https://github.com/mhammond/pywin32/blob/main/win32/Demos/eventLogDemo.py - Nuno André
1个回答

9
一个简单的例子:
>>> import sys
>>> import time
>>> import win32evtlog
>>> import win32evtlogutil
>>>
>>>
>>> "Python {:s} on {: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 {:d}".format(item) for item in range(5)]
>>> DUMMY_EVT_DATA = b"Dummy event data"
>>>
>>> "Current time: {: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的一部分,它是一个Python封装的WINAPIs。 文档(WiP)可以在[GitHub.MHammond]: Python for Win32 Extensions Help(或[ME.TimGolden]: Python for Win32 Extensions Help)找到。

你需要了解的一切都在[MS.Docs]: ReportEventW function中有详细解释,这是用于完成此任务的WINAPI。请务必仔细阅读它(以及它引用的其他URL),以便更加熟悉参数、可能的取值以及其他相关信息。

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


那么你能否将答案标记为解决方案,这样就能清楚地显示它解决了你的问题了吗? - CristiFati
那是一个很棒的答案和例子,除了一件事。如果你不为event_strings参数提供五个虚拟字符串,而是只提供一个字符串,它会自动将你的单个字符串转换成一堆由一个字符组成的字符串。就像"这是一个测试"变成"T","h","i","s"," ","i","s"," ","a"," ","t","e","s","t"。所以,你能否也包含一个正常的、单一的字符串版本,但是它能正常工作呢?明白了,就是DUMMY_EVT_STRS = [],然后DUMMY_EVT_STRS.append(message1),... - user3224303
Strings只是在xml中为Data元素添加内容。我想为这个元素设置Name属性。你能分享一些关于这个的指导吗?就像这样 -> <Data Name="ProcessID">4</Data> - mrk m
嗯,我不确定那个节点是否允许有属性。快速浏览API,没有得到积极的结果。 - CristiFati
语言无关。最后都调用相同的函数。不管怎样,你的请求很奇怪,看起来像一个“XY 问题”。为什么你需要完全这样?作为一种解决方法,你可以将第一个字符串作为属性名,下一个字符串作为其值,然后是标签数据。 - CristiFati
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接