向 WiX 安装程序添加自定义操作

Posted

技术标签:

【中文标题】向 WiX 安装程序添加自定义操作【英文标题】:Adding Custom Action to WiX Installer 【发布时间】:2015-09-01 10:35:06 【问题描述】:

我正在尝试使用 WiX 安装程序在 cmd 中运行自定义命令。我使用 Product.wxs 中的包含文件,该文件在整个安装过程中被正确使用。 我有 3 个自定义操作,其中 2 个工作正常。似乎不起作用的一个是:

<CustomAction Id='AddDefaultDomain'
        Directory='TARGETDIR'
        Impersonate="no"
        Execute="immediate"
        ExeCommand="C:\windows\system32\inetsrv\appcmd.exe set config /section:basicAuthentication /defaultLogonDomain:[%USERDOMAIN]  /commit:apphost"
        Return="asyncNoWait" />

安装程序运行正常,当我通过 cmd 窗口调用 AppCmd 并复制->在 cmd 中粘贴“ExeCommand”并执行它时,它工作正常。 可能这很简单,但现在我不明白为什么它不起作用。感谢所有帮助。完整包含文件

<?xml version="1.0" encoding="utf-8"?>
<Include>
  <!-- Create Scheduled Task -->
  <InstallExecuteSequence>
    <Custom Action="CreateScheduledTaskGoogleService" After="InstallFiles">NOT Installed</Custom>
    <Custom Action="CreateScheduledTaskGoogleServiceId" After="CostFinalize">NOT Installed</Custom>
    <!-- Add Defualt DOmain -->
    <Custom Action="AddDefaultDomain" After="CostFinalize">NOT Installed</Custom>

  </InstallExecuteSequence>
  <CustomAction Id="CreateScheduledTaskGoogleService" Return="check" Impersonate="no" Execute="deferred" BinaryKey="WixCA" DllEntry="CAQuietExec" />
  <CustomAction Id="CreateScheduledTaskGoogleServiceId" Property="CreateScheduledTaskGoogleService" Execute="immediate" Value="&quot;[SystemFolder]SCHTASKS.EXE&quot; /CREATE /TN &quot;ActaNet Control - Google Sync&quot; /XML &quot;[INSTALLFOLDERPROGRAMFILESGOOGLE]ScheduledTask.xml&quot;" />

  <!-- DOES NOT SEEM TO BE WORKING! -->
  <CustomAction Id='AddDefaultDomain'
        Directory='TARGETDIR'
        Impersonate="no"
        Execute="immediate"
        ExeCommand="C:\windows\system32\inetsrv\appcmd.exe set config /section:basicAuthentication /defaultLogonDomain:[%USERDOMAIN]  /commit:apphost"
        Return="asyncNoWait" />

  <!-- Delete Scheduled Task -->
  <InstallExecuteSequence>
    <Custom Action="TaskDeleteGoogleService" Before="CreateScheduledTaskGoogleService">REMOVE="ALL"</Custom>
  </InstallExecuteSequence>
  <CustomAction Id="TaskDeleteGoogleService" Return="ignore" Execute="deferred" Directory="TARGETDIR" Impersonate="no" ExeCommand="SCHTASKS.EXE /DELETE /TN &quot;ActaNet Control - Google Sync&quot; /F" />
</Include>

【问题讨论】:

【参考方案1】:

我要做的第一件事是确认命令实际上正在执行。使用 Process Monitor 等工具来确认这一点。

完成此操作后,我将查看该命令是否正在修改目标系统上的某些内容,而这需要提升的权限才能执行此操作。如果是这样,我会将 Execute 属性的值更改为“延迟”,看看它是否有效。您似乎正在尝试使用即时模式自定义操作更改目标系统上的某些内容。将操作标记为延迟还需要您将操作置于“InstallInitialize”和“InstallFinalize”之间。

在您目前的情况下,您正尝试以立即模式启动 exe。立即模式模拟登录用户,因此在 UAC 环境中,任何修改目标系统的自定义操作都可能失败。

希望这会有所帮助。

【讨论】:

【参考方案2】:

首先,将自定义操作的“执行”更改为延迟,因为您没有立即类型的系统权限。

其次,使用日志记录查看安装过程中发生的情况。使用以下 concole 命令将在 YourInstaller.msi 所在的同一文件夹中创建安装过程的日志文件:

msiexec -i YourInstaller.msi -l*v log.txt

您可以通过自定义操作名称在结果 log.txt 文件中查找安装程序尝试执行它时会发生什么。

【讨论】:

以上是关于向 WiX 安装程序添加自定义操作的主要内容,如果未能解决你的问题,请参考以下文章

使用 WIX 安装程序在自定义操作中停止设置错误

如何在关闭对话框的 Wix 安装程序中停止自定义操作中的进度条

如何从包含多个 MSI 的 wix 自定义引导程序包中安装/卸载单个 msi,例如安装项目的添加/删除功能?

Wix 自定义卸载操作 - 如何在 msi 删除文件之前运行

如何关闭正在运行的 wix 安装程序?

使用 WiX 自定义操作在安装文件夹中创建文件