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

时间:2015-09-01 10:35:07

标签: c# .net wix


我尝试使用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并复制 - >粘贴&#39; ExeCommand&#39;在cmd中执行它,它工作正常
可能这很简单但是现在我不明白为什么它不起作用。
所有的帮助都表示赞赏。

完整包含文件

<?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>

2 个答案:

答案 0 :(得分:0)

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

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

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

希望这有帮助。

答案 1 :(得分:0)

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

其次,使用loggging查看安装过程中会发生什么。使用下面的concole命令将在YourInstaller.msi所在的同一文件夹中创建安装过程的日志文件:

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

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