2

我有一个包含多个事件和两个通道的清单文件。我通过 mc 命令生成包含和资源文件:

mc -um manifest.man

我将资源文件链接到应用程序中。

我通过 wevtutil 命令在系统中安装清单:

wevtutil.exe im manifest.man

在应用程序中,我使用 EventRegister 进行初始化日志,使用 EventWrite 进行日志写入。生成日志事件的下一个代码返回 ERROR_SUCCESS: EVENT_DATA_DESCRIPTOR 数据;

 ULONG writeEvent(const std::string& message){
   std::string log_message_str( message );
   EVENT_DATA_DESCRIPTOR data;
   EVENT_DESCRIPTOR description;
   EventDataDescCreate( &data, message.c_str(), static_cast<ULONG>(log_message_str.size() + 1) );

   return EventWrite(log_handle, &description, 1, &data);
 }

此外,我向我的 LocalService 应用程序授予读取权限:

icacls "service_win.exe" /grant "NT AUTHORITY\LocalService":R /Q

我使用“NT AUTHORITY\LocalService”帐户启动我的应用程序,例如服务:

sc.exe create service_win binpath=D:\service_win.exe type=own obj='NT AUTHORITY\LocalService'
net start service_win

我 manifest.man 中声明的频道已添加到 WinEvents 日志中,但为空。在应用程序中,我每隔一秒通过 writeEvent 写入日志,结果为 ERROR_SUCCESS,但我的日志文件仍然为空。

更新:

我创建了带有重现步骤的github 存储库

4

2 回答 2

3

您正在使用事件跟踪技术。它需要提供者创建事件和消费者消费事件。

如果您想通过事件查看器查看事件,您可以参考使用事件记录

所以这里的问题是即使您的事件写入成功,您也无法在事件查看器中看到这些事件。这些事件错​​过了,因为您从未启动消费者来消费它们。

请参阅事件丢失原因

您可以通过 ETW 登录Windows 设备门户找到它们,如下所示:

在此处输入图像描述

有关如何消费事件的详细信息,请参阅消费事件。

于 2019-11-08T02:56:34.030 回答
3

我找到了解决方案。问题出在跟踪会话和mc 实用程序自动生成的代码中。需要使用 -um 标志调用 mc 并使用自动生成的函数进行日志写入。工作样本在这里

于 2019-11-08T18:46:16.080 回答