首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在没有EventMessageFile的情况下读取Windows事件日志?

如何在没有EventMessageFile的情况下读取Windows事件日志?
EN

Stack Overflow用户
提问于 2009-03-03 17:30:05
回答 2查看 8.1K关注 0票数 3

我有读取Windows事件日志的代码。它使用OpenEventLog、ReadEventLog并获取事件源和事件ID。然后,它在

代码语言:javascript
复制
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Eventlog\Application

键,根据EventMessageFile中列出的内容加载相应的DLL,最后使用FormatMessage将事件字符串与消息DLL内容合并,以获得最终的事件消息文本。这是推荐的方法,虽然有点痛苦,但效果很好。

直到...我去查找源代码,发现它没有EventMessageFile,而是一个ProvideGuid条目。这似乎是新的方式(它们出现在Vista和Windows2008上)。Uggh --不需要传递给FormatMessage来查找消息文本和合并数据字符串

:(

在注册表中搜索guid确实会引出对其他文件的引用(在HTTP源中为http.sys),但我永远无法获得完整的消息文本。我必须使用这些EvtOpenSession API吗?我希望没有,因为我已经有了调用ReadEventLogEVENTLOGRECORD*,而且该软件需要在Windows2003上运行,而Windows2003不支持EvtOpenSession (仅在Vista和Windows2008上可用)。注意: Vista上的一些源码有ProviderGUID,还有一些源码有EventMessageFile,所以旧方法仍然可行。

因此,我想要的是一种查看ProviderGuid并获取需要传递给FormatMessage以显示完整的事件日志消息文本的DLL的方法。

感谢您的意见

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2009-03-29 09:02:07

Richard链接的API用于Vista/Server 2K8中引入的新样式事件系统(代号为Crimson,有时称为基于清单的提供者)。这个新系统的工件之一是使用这些日志的新API,另一个是使用此新框架生成事件的特定EventSources的API密钥。

我认为你应该稍后使用Windows Vista上的函数来消费这些日志,它应该会为你处理这些工作。您可以使用EvtFormatMessage方法设置字符串的格式。我相信这些API也会读取“经典”提供者产生的事件。

如果您从.NET应用程序使用这些消息,则可以使用System.Diagnostics.Eventing.Reader命名空间中的类型,该名称空间在.NET 3.5中引入。

票数 1
EN

Stack Overflow用户

发布于 2009-03-03 17:50:52

有用于读取/扩展事件日志条目的Win32 API。

请参阅MSDN:http://msdn.microsoft.com/en-us/library/aa385780(VS.85).aspx

如果有其他问题,您很可能会发现补丁有问题,更不用说服务包或新版本了。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/607345

复制
相关文章

相似问题

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