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

下查找源代码
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Eventlog\Application

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

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

:(

在注册表中搜索guid会导致引用其他文件(在HTTP源的情况下为http.sys),但我永远无法获得完整的消息文本。我是否必须使用那些 EvtOpenSession API?我希望不会因为我已经从 ReadEventLog 调用了 EVENTLOGRECORD * ,并且该软件需要在Windows 2003上运行,其中 EvtOpenSession 不受支持(仅适用于Vista和Windows 2008)。注意:Vista上的某些来源有ProviderGUID,而其他来源有EventMessageFile,因此旧方法仍然可行。

所以我想要的是查看ProviderGuid并获取需要传递给FormatMessage的DLL以显示完整的事件日志消息文本。

感谢任何输入

有帮助吗?

解决方案

Richard链接到的API用于Vista / Server 2K8中引入的新式Eventing系统(代号为Crimson,有时称为基于Manifest的提供程序)。这个新系统的一个工件是使用这些日志的新API,另一个是使用这个新框架生成事件的某些EventSource的ProviderGuid密钥。

我认为您应该稍后使用Windows Vista上的功能来使用这些日志,它应该为您处理工作。您可以使用EvtFormatMessage方法格式化字符串。我相信这些API也会读取由“Classic”产生的事件。提供者。

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

其他提示

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

请参阅MSDN: http://msdn.microsoft的.com / EN-US /库/ aa385780(VS.85)的.aspx

还有其他任何问题,您可能会发现修补程序出现问题,更不用说服务包或新版本了。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top