我需要帮助解决创建Windows事件提供程序时出现的"Provider''资源不可访问"问题。我使用ManGen实用程序创建了我的清单文件,并将我的 ".exe" 文件命名为我的消息和资源文件。我将“.rc”文件与我的exe文件一起编译,预期会生成'.res'文件。然而,当我运行wevtutil时,我仍然收到“资源不可访问”的警告。
当您安装清单文件 (例如 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>
您正在注册的dll需要具有特定的文件权限。我怀疑事件记录服务是在“本地服务”帐户下运行的。因此,仅授予SYSTEM访问权限是不够的。我通过为我的计算机上的“用户”组授予“读取和执行”权限来解决了这个问题。
我遇到了一个非常恶心的问题,花了一天时间才找到。我共享了我的项目工作文件夹,然后取消了共享。由于某种原因,这导致“用户”访问权限被删除。我认为这就是Windows SDK中事件跟踪示例将所有dll复制到C驱动器下的特殊文件夹并从那里安装提供程序的原因。当您在C驱动器下创建文件夹时,“用户”组会自动获得访问权限。
我遇到了完全相同的错误,但解决方案与已发布的其他答案略有不同。我需要打开清单文件并更改resourceFileName
和messageFileName
属性,以使用绝对路径到应用程序可执行文件。
wevtutil gp <Publisher>
输出 *Failed to open metadata for publisher <Publisher>. **The system cannot find the file specified.***,则此解决方案适用。 - Martin Liversage我曾经遇到过类似的问题。解决方法是:
如果您的清单文件名为manifest.man
和manifest.dll
,那么:
授予所有人读取权限
icacls %~dp0\manifest.* /t /grant Everyone:R
使用绝对路径进行安装(如果您正在使用批处理文件,则可以使用%~dp0
变量)
wevtutil im %~dp0\manifest.man /rf:"%~dp0\manifest.dll" /mf:"%~dp0\manifest.dll"