3

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

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Eventlog\Application

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

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

:(

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

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

感谢您的任何意见

4

2 回答 2

1

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

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

其他任何东西,您都可能会发现补丁有问题,更不用说服务包或新版本了。

于 2009-03-03T17:50:51.670 回答
1

Richard 链接到的 API 用于 Vista/Server 2K8 中引入的新型 Eventing 系统(代号为 Crimson,有时称为 Manifest Based Providers)。这个新系统的工件之一是使用这些日志的新 API,另一个是使用这个新框架产生事件的某些 EventSources 的 ProviderGuid 键。

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

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

于 2009-03-29T09:02:07.323 回答