我有读取Windows事件日志的代码。它使用OpenEventLog、ReadEventLog并获取事件源和事件ID。然后,它在
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Eventlog\Application键,根据EventMessageFile中列出的内容加载相应的DLL,最后使用FormatMessage将事件字符串与消息DLL内容合并,以获得最终的事件消息文本。这是推荐的方法,虽然有点痛苦,但效果很好。
直到...我去查找源代码,发现它没有EventMessageFile,而是一个ProvideGuid条目。这似乎是新的方式(它们出现在Vista和Windows2008上)。Uggh --不需要传递给FormatMessage来查找消息文本和合并数据字符串
:(
在注册表中搜索guid确实会引出对其他文件的引用(在HTTP源中为http.sys),但我永远无法获得完整的消息文本。我必须使用这些EvtOpenSession API吗?我希望没有,因为我已经有了调用ReadEventLog的EVENTLOGRECORD*,而且该软件需要在Windows2003上运行,而Windows2003不支持EvtOpenSession (仅在Vista和Windows2008上可用)。注意: Vista上的一些源码有ProviderGUID,还有一些源码有EventMessageFile,所以旧方法仍然可行。
因此,我想要的是一种查看ProviderGuid并获取需要传递给FormatMessage以显示完整的事件日志消息文本的DLL的方法。
感谢您的意见
发布于 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中引入。
发布于 2009-03-03 17:50:52
有用于读取/扩展事件日志条目的Win32 API。
请参阅MSDN:http://msdn.microsoft.com/en-us/library/aa385780(VS.85).aspx
如果有其他问题,您很可能会发现补丁有问题,更不用说服务包或新版本了。
https://stackoverflow.com/questions/607345
复制相似问题