14

我需要帮助解决在尝试创建 Windows 事件提供程序时无法访问的“提供程序”资源。我使用 ManGen 实用程序创建清单文件,并将我的“.exe”文件命名为我的消息和资源文件。我编译“生成带有我的 exe 文件的 .rc 文件和预期的 .res 文件。但是,当我运行 wevtutil 时,我不断收到“资源不可访问”警告。

4

4 回答 4

14

当您安装清单(例如wevtutil im manifest.man)时,如果资源不可用,您应该会看到某种警告:

**** Warning: Publisher EventsProvider resources are not accessible.

要获取一些附加信息,请尝试检索有关其中一个发布者的信息。例如:

c:\...> wevtutil gp <EventProviderName>
Failed to open metadata for publisher <EventProviderName>. Access denied.

好的,上面提示了权限问题,所以让我让路径可访问,然后再试一次:

c:\...> wevtutil gp <EventProviderName>
Failed to open metadata for publisher <EventProviderName>. The specified resource
type cannot be found in the image file.

对于上述情况,看起来资源没有正确编译。

如果您File->Open使用 VS 并在资源查看器中打开您的 exe,您应该能够看到已编译的资源。您至少应该有一个“WEVT_TEMPLATE”条目。

要正确编译资源,csc需要按如下方式传递资源:

csc /win32res:<Resource.res>
于 2012-03-06T18:59:58.730 回答
12

您正在注册的 dll 需要具有一组特定的文件权限。我怀疑事件日志服务在“本地服务”帐户下运行。所以仅仅给予 SYSTEM 访问权限是不够的。我通过给我的电脑上的“用户”组“读取和执行”特权来解决问题。

我遇到了一个令人讨厌的问题,花了一天时间才找到。我共享了我的项目工作文件夹,然后取消共享。由于某种原因,这删除了“用户”访问权限。我认为这就是 Windows SDK 中的事件跟踪示例将所有 dll 复制到 C 驱动器下的特殊文件夹并从那里安装提供程序的原因。当您在 C 盘下创建文件夹时,USERS 组将自动获得访问权限。

于 2012-10-26T16:14:41.600 回答
8

我有完全相同的错误,但解决方案与已经发布的其他答案略有不同。我必须打开清单文件并更改resourceFileNamemessageFileName属性以使用应用程序可执行文件的绝对路径。

于 2014-04-15T13:16:13.100 回答
7

我遇到了类似的问题。解决方案是

  • 尽可能使用绝对路径并远离相对路径
  • 确保每个人都具有对清单文件的读取权限

如果您的清单文件被称为manifest.manand manifest.dll,那么

  • 授予所有人读取权限

    icacls %~dp0\manifest.* /t /grant Everyone:R

  • 使用绝对路径安装(%~dp0如果您使用的是批处理文件,则可以使用变量)

    wevtutil im %~dp0\manifest.man /rf:"%~dp0\manifest.dll" /mf:"%~dp0\manifest.dll"

于 2015-09-22T21:56:41.870 回答