警告-运行wevtutil时无法访问提供程序资源

14

我需要帮助解决创建Windows事件提供程序时出现的"Provider''资源不可访问"问题。我使用ManGen实用程序创建了我的清单文件,并将我的 ".exe" 文件命名为我的消息和资源文件。我将“.rc”文件与我的exe文件一起编译,预期会生成'.res'文件。然而,当我运行wevtutil时,我仍然收到“资源不可访问”的警告。

4个回答

15

当您安装清单文件 (例如 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 中使用 文件->打开 并在资源查看器中打开您的 exe 文件,您应该能够看到已编译的资源。你至少应该有一个“WEVT_TEMPLATE”条目。

为了正确编译资源,需要按以下方式将资源传递给csc

csc /win32res:<Resource.res>

12

您正在注册的dll需要具有特定的文件权限。我怀疑事件记录服务是在“本地服务”帐户下运行的。因此,仅授予SYSTEM访问权限是不够的。我通过为我的计算机上的“用户”组授予“读取和执行”权限来解决了这个问题。

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


这很有帮助!完全忽略了安全设置! :) - Richard Macwan

8

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


如果运行 wevtutil gp <Publisher> 输出 *Failed to open metadata for publisher <Publisher>. **The system cannot find the file specified.***,则此解决方案适用。 - Martin Liversage
3
如果清单文件中的路径名与dll实际位置不匹配,您可以使用/mf和/rf选项来指定实际位置的绝对路径。您还需要确保该位置已授予MACHINE_NAME \ Users安全组特权。 - Eric MSFT
在为Chrome工作时,我一直遇到这个错误,唯一的好解决方案是使用/mf和/rf。我不明白为什么我会遇到失败(以前它对我有效),但现在它正在工作。当使用procmon跟踪时,我们vtutil.exe没有显示过从DLL读取的任何迹象,这很奇怪。这使得研究此警告非常困难。 - Bruce Dawson

7

我曾经遇到过类似的问题。解决方法是:

  • 尽可能使用绝对路径,避免使用相对路径
  • 确保每个人都有读取清单文件的权限

如果您的清单文件名为manifest.manmanifest.dll,那么:

  • 授予所有人读取权限

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

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

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接