我有读取 Windows 事件日志的代码。它使用 OpenEventLog、ReadEventLog 并获取事件源和事件 ID。然后它在下面查找源
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Eventlog\Application
键,根据中列出的内容加载适当的 DLLEventMessageFile
最后使用FormatMessage
将事件字符串与消息 DLL 内容合并以获得最终的事件消息文本。这是推荐的方法,虽然有点痛苦,但效果很好。
直到...我去查找来源并发现它没有EventMessageFile
,而是一个ProvideGuid
入口。这似乎是新方式(它们出现在 Vista 和 Windows 2008 上)。呃——没有什么可以传递给 FormatMessage 来查找消息文本并合并到数据字符串中
:(
在注册表中搜索 guid 确实会导致对其他文件的引用(在 HTTP 源的情况下为 http.sys),但我永远无法获得完整的消息文本。我必须使用那些吗EvtOpenSession
蜜蜂?我希望不会,因为我已经拥有了EVENTLOGRECORD*
从一个电话到ReadEventLog
,并且该软件需要在 Windows 2003 上运行,其中EvtOpenSession
不受支持(仅适用于 Vista 和 Windows 2008)。注意:Vista 上的某些源具有 ProviderGUID,其他源具有 EventMessageFile,因此旧方法仍然可行。
因此,我所追求的是一种查看 ProviderGuid 并获取需要传递给 FormatMessage 的 DLL 的方法,以显示完整的事件日志消息文本。
感谢您的任何意见
Richard 链接到的 API 适用于 Vista/Server 2K8 中引入的新型事件系统(代号为 Crimson,有时称为基于清单的提供程序)。这个新系统的工件之一是使用这些日志的新 API,另一个是使用这个新框架生成事件的某些 EventSource 的 ProviderGuid 键。
我认为你应该稍后使用 Windows Vista 上的功能来使用这些日志,它应该会为你处理这些工作。您可以使用 EvtFormatMessage 方法来格式化字符串。我相信这些 API 也会读取“经典”提供商生成的事件。
如果您从 .NET 应用程序使用这些消息,则可以使用 .NET 3.5 中引入的 System.Diagnostics.Eventing.Reader 命名空间中的类型。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)