2012-02-09 89 views
13

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

回答

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. 

针对上述情况,它看起来像资源没有得到正确编译。

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

对于资源正确地进行编译,csc需要如下传递的资源:

csc /win32res:<Resource.res> 
+0

非常有助于诊断潜在的错误。 – 2013-06-10 12:58:12

12

你需要注册的dll有一组特定的文件的权限。我怀疑事件记录服务在“本地服务”帐户下运行。所以只给予系统访问权限是不够的。我通过给我的PC上的“用户”组解决问题,“执行”读取&“特权。

我遇到了一个令人讨厌的问题,需要花一天时间来追踪。我分享了我的项目工作文件夹,然后取消共享。出于某种原因,这删除了“USERS”访问权限。我认为这是在Windows SDK中将事件追踪样本复制到C驱动器下的特殊文件夹并从那里安装提供程序的原因。当您在C驱动器下创建文件夹时,USERS组将被自动授予访问权限。

+0

这有帮助!完全忽略了安全设置! :) – 2013-06-10 10:31:15

7

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

+0

如果运行'wevtutil gp 01​​'输出,则此解决方案为应用程序*未能为发布商打开元数据。 **系统找不到指定的文件*** – 2014-05-23 09:31:15

+2

如果清单文件中的路径名称与dll所在的位置不匹配,则可以使用/ mf和/ rf选项以及绝对路径指向实际位置。您还需要确保该位置已授予MACHINE_NAME \ Users安全组的权限。 – 2015-02-26 19:50:21

+0

在为Chrome浏览器工作时,我不断收到此错误,唯一的好解决方案是使用/ mf和/ rf。我不明白为什么我遇到了失败(之前它对我有用),但它现在正在工作。 当使用procmon进行跟踪时,wevtutil.exe显示没有任何从DLL读取的迹象,这很奇怪。这使得研究这个警告非常困难。 – 2015-03-25 23:08:57

5

我遇到过类似的问题。解决的办法是

  • 使用绝对路径尽可能地远离相对路径远
  • 确保每个人都有读访问权清单文件

如果您的清单文件被称为manifest.manmanifest.dll,然后

  • 授予读访问给大家

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

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

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