我正在为使用自定义事件日志源的网站创建安装程序.我希望我们的基于WiX的安装程序在安装期间创建该事件日志源.
有没有人知道使用WiX框架执行此操作的最佳方法.
我创建了一个自定义操作:
<CustomAction Id='AddEventLog' BinaryKey='CustomActionEventLog.dll' DllEntry='AddEventLog' Return="check" Execute="immediate"/>
Run Code Online (Sandbox Code Playgroud)
安装顺序
<Custom Action="AddEventLog" Before="InstallFinalize" />
Run Code Online (Sandbox Code Playgroud)
我的安装程序确实弹出并说它需要管理员权限才能运行。我授予它。
InstallPrivileges='elevated' InstallScope='perMachine' AdminImage='yes'
Run Code Online (Sandbox Code Playgroud)
但是,当它运行自定义操作时,它不起作用,因为它不是以管理员身份运行。
我什至尝试将以下内容添加到我的自定义操作项目 dll 上的 app.manifest。它没有帮助。
<requestedExecutionLevel level="requireAdministrator" uiAccess="false" />
Run Code Online (Sandbox Code Playgroud)
我已经搜索了所有关于这个主题的教程和论坛帖子。注意到已经奏效了。
如果有人对此有更好的标签,请随时添加它们,我一整天都在为此苦苦挣扎。
更新澄清:
虽然我的 customAction 与 EventLog 一起工作,但我没有使用http://schemas.microsoft.com/wix/UtilExtension Util:EventSource。这是一个普遍的问题,您甚至可以强制以管理员身份运行 customAction 吗?
我正在使用WIX为我的应用程序创建一个安装程序.到目前为止一切正常.但是,我正在尝试在安装期间创建一个新的事件源,但这不会按预期工作.
我已经在这里阅读并理解了这个问题,但我有一个不同的情况,其中给定的解决方案似乎不能正常工作.以下是不同的做法:
WixNetFxExtension来确定.NET 3.5是否作为启动条件安装.WixUtilExtension到,因为它描述了用于32位/ 64位构建配置的东西在这里我想做的是:在进行32位安装时使用32位框架的事件消息文件,否则使用64位框架的事件消息文件.
上面链接的SO问题中的一条评论建议使用以下内容让系统使用32位框架的事件消息文件:
<util:EventSource
Log="Application"
Name="*source name*"
EventMessageFile="[NETFRAMEWORK20INSTALLROOTDIR]EventLogMessages.dll"/>
Run Code Online (Sandbox Code Playgroud)
我修改了这个来解释这两种类型的设置:
<?if $(var.Platform) = x64 ?>
<util:EventSource Log="..." Name="..." EventMessageFile="[NETFRAMEWORK20INSTALLROOTDIR64]EventLogMessages.dll" />
<?else ?>
<util:EventSource Log="..." Name="..." EventMessageFile="[NETFRAMEWORK20INSTALLROOTDIR]EventLogMessages.dll" />
<?endif ?>
Run Code Online (Sandbox Code Playgroud)
在文件的开头,相同的<?if ...条件工作,相应地改变产品和foldernames.
代码上面的一些代码我正在使用以下代码来允许.NET Framework检测:
<PropertyRef Id="NETFRAMEWORK35"/>
<PropertyRef Id="NETFRAMEWORK20"/>
<Condition Message="...">
<![CDATA[Installed OR NETFRAMEWORK35]]>
</Condition>
Run Code Online (Sandbox Code Playgroud)
当我运行安装程序时,一切似乎都有效,也创建了事件源,我也可以从我的应用程序中使用它,但是,我仍然得到未找到事件消息文件的信息.检查注册表我发现消息文件的路径丢失了:
EventMessageFile REG_EXPAND_SZ EventLogMessages.dll
Run Code Online (Sandbox Code Playgroud)
我期望32位/ 64位框架的路径也存在,但它似乎并没有被假定.
我在这做错了什么?
我基于这个例子创建了我的事件源.我的事件源看起来像这样:
[EventSource(Name = "Samples-EventSourceDemos-EventLog")]
public sealed class MinimalEventSource : EventSource
{
public static MinimalEventSource Log = new MinimalEventSource();
[Event(1, Message = "{0} -> {1}", Channel = EventChannel.Admin)]
public void Load(long baseAddress, string imageName)
{
WriteEvent(1, baseAddress, imageName);
}
}
Run Code Online (Sandbox Code Playgroud)
该示例使用代码来模拟安装/卸载过程.从其他一些SO问题中,我看到了另一个使用事件消息文件安装事件源的示例.
但它缺少一些很好的例子,说明如何安装/注册由清单定义的EventSource.我正在调查使用CustomAction做类似的事情:
wevtutil.exe im <EtwManifestManFile> /rf:"EtwManifestDllFile" /mf:"EtwManifestDllFile"
但是想知道你有什么建议吗?