如何使用不存在的源写入 Windows 事件日志记录

Posted

技术标签:

【中文标题】如何使用不存在的源写入 Windows 事件日志记录【英文标题】:How to write Windows Event log records with non-existing source 【发布时间】:2013-05-02 13:59:55 【问题描述】:

有人给了我一个测试程序来将记录写入 Windows 事件日志(但我没有源代码)。我了解编写和查看事件日志的一般方式,但该程序的行为非常特殊,我可以编写记录,其来源不存在。 .../eventlog/application 中甚至没有注册表项,因此没有格式化库。

如果我从自己的代码中尝试,我可以编写这样的记录,但 Windows 事件查看器总是告诉我“找不到描述”(这是正确的,我理解为什么会发生这种情况)。

现在的问题是:既然国外的测试程序可以做到,那么它一定是有可能的——但是怎么做呢?

非常感谢! :-)

【问题讨论】:

【参考方案1】:

好的,最后我找到了它(也得到了源代码)- prog 创建了注册表项(可能在调用 CreateEventSource() 时发生),它在刷新 regedit 之前是不可见的:-|

而且,它确实注册了一个格式化库,只是我不能依赖它:C:\Windows\Microsoft.NET\Framework64\v2.0.50727\EventLogMessages.dll

或者,我可以吗?

啊,我们来解释一下: Difference between EventLog.WriteEntry and EventLog.WriteEvent methods 所以,我不能,因为我没有使用 .Net ... :-|

现在,如果我现在从 MY prog 发送另一个事件(使用与外部 prog 相同的新创建源),我通常会在事件查看器中看到它。 这意味着,WriteEntry() 实际上并没有直接写入包含文本的不同/特殊类型的 evt 日志记录(与仅写入 msg 目录 ID + 参数的标准方法相反),而是在格式化库中必须有一些技巧使 EventViewer 应用某种“默认”格式。

有什么想法可以做到这一点吗?除了只是复制上面的 EventLogMessages.dll 吗? :-)

好的,终于在http://msdn.microsoft.com/en-us/magazine/cc163446.aspx找到了关于这个的答案 "这个文件叫做 EventLogMessages.dll,它包含 65,536 个事件描述,每一个都由字符串 "%1" 组成,它是你想写的任何字符串的占位符"

我希望有类似“messageid=*”的东西,但这似乎太简单了:-|

但也许其他人对这里发生的事情感兴趣......

【讨论】:

以上是关于如何使用不存在的源写入 Windows 事件日志记录的主要内容,如果未能解决你的问题,请参考以下文章

如何高效查询事件查看器

始终可用于写入的事件日志源?

配置在 Windows 10 上运行的 Oracle XE 日志记录,防止写入 Windows 事件日志

如何防止在事件日志中截断服务异常

是否可以使用标准输出作为流利的源来捕获特定日志以写入弹性搜索?

Windows事件日志写入SQL Server并PowerBI统计分析