Wix Remove 自定义操作失败

Posted

技术标签:

【中文标题】Wix Remove 自定义操作失败【英文标题】:Wix Remove custom action fails 【发布时间】:2014-01-10 09:38:59 【问题描述】:

我正在尝试让我的安装程序在删除应用程序时使用自定义操作来删除计划任务。创建“CreateScheduledTask”的自定义操作正常工作,但删除失败。

MSI (s) (B4:D8) [09:28:45:761]: Note: 1: 1721 2: RemoveScheduledTask 3: C:\Foobar\ 4: "C:\Windows\SysWOW64\SCHTASKS.EXE" /DELETE /TN "Automated Admin" /F 

信息 1721。此 Windows 安装程序包有问题。无法运行完成此安装所需的程序。请联系您的支持人员或软件包供应商。操作:RemoveScheduledTask,位置:C:\Foobar\,命令:"C:\Windows\SysWOW64\SCHTASKS.EXE" /DELETE /TN "Automated Admin" /F MSI (s) (B4:44) [09:28:45:777]:调用远程自定义操作。 DLL:C:\Windows\Installer\MSIBB52.tmp,入口点:CommitIIS7ConfigTransaction

如果我运行,语法是正确的

"C:\Windows\SysWOW64\SCHTASKS.EXE" /DELETE /TN "Automated Admin" /F 

从命令行正确删除任务。

<!-- Code for setting the automated task-->
<CustomAction Id="CreateScheduledTask" 
Return="check" 
Impersonate="no" 
Execute="deferred" 
Directory="INSTALLLOCATION" 
ExeCommand="&quot;[SystemFolder]SCHTASKS.EXE&quot; /CREATE /SC MINUTE /MO 15 /TN &quot;Automated Admin&quot;  /TR &quot;[AutomatedAdmin]FooBar.exe&quot; /RU &quot;NT Authority\System&quot; /RP /RL HIGHEST" />

Wix 片段是

<CustomAction Id="RemoveScheduledTask" 
Return="ignore" 
Impersonate="no" 
Execute="deferred" 
Directory="INSTALLLOCATION" 
ExeCommand="&quot;[SystemFolder]SCHTASKS.EXE&quot; /DELETE /TN &quot;Automated Admin&quot; /F" />

<InstallExecuteSequence>
  <Custom Action="CreateScheduledTask" Before="InstallFinalize">NOT Installed</Custom>
  <Custom Action="RemoveScheduledTask" Before="RemoveFiles">REMOVE="ALL"</Custom>
</InstallExecuteSequence>

【问题讨论】:

我有完全相同的问题和配置。安装程序是 x86,在多台 x64 计算机上运行良好,但在 x86 Win 8 Pro 平板电脑上首次安装时出现此问题。 看起来我的 x86 平板电脑的 CustomAction 可能没有以管理员身份运行。 (即使 UAC 管理员提示安装)当我手动添加任务时它不会被安装删除。 @Brent 你能删除正常安装的任务吗?删除对我永远不起作用。你能发布你的wix片段吗? 之前一切正常,我想那是因为我完全禁用了 UAC。我正在努力让它与启用默认级别的 UAC 一起工作。我稍后会发布配置作为答案。试图弄清楚这一点。 哦,平板电脑上的卸载不起作用的问题是我安装了以前的版本(相当旧)并且卸载程序挂起。因此,一旦我修复了依赖项并将其卸载,现在一切都可以正常工作了。 【参考方案1】:

您的代码看起来正确,这是我的配置,它编译为 x86 .msi,我在 Windows 8.1 x64/x86 和 Windows Server 2008r2 x64 上进行了测试。将 UAC 设置为默认值并禁用。 (.msi 会提示管理员权限)

<CustomAction Id="TaskDelete" Return="ignore" Execute="deferred" Directory="TARGETDIR" Impersonate="no"
 ExeCommand="SCHTASKS.EXE /DELETE /TN &quot;My Client Service&quot; /F" />

<CustomAction Id="TaskCreate" Return="check" Execute="deferred" Directory="TARGETDIR" Impersonate="no" 
 ExeCommand="SCHTASKS.EXE /CREATE /SC MINUTE /MO 20 /TN &quot;My Client Service&quot; /TR &quot;sc.exe start My_Client_Service&quot; /RU SYSTEM /RP /RL HIGHEST /F" />

<Directory Id="TARGETDIR" Name="SourceDir">
  <Directory Id="ProgramFilesFolder">
    <Directory Id="INSTALLDIR" Name="My Company" >
...components...
   </Directory>
  </Directory>
</Directory>

<InstallExecuteSequence>
  <!--Remove task on Uninstall or Upgrade-->
  <Custom Action='TaskDelete' Before="TaskCreate">REMOVE="ALL"</Custom>
  <!--Add task on Install or Upgrade-->
  <Custom Action='TaskCreate' Before="InstallFinalize">(NOT Installed) OR UPGRADINGPRODUCTCODE</Custom>
</InstallExecuteSequence>

【讨论】:

由于您已将 Return 设置为忽略,它是否有效,或者您只是没有注意到错误? 是的,它有效,认为我忽略了无法找到删除的错误,尽管因为设置为仅在 REMOVE="ALL" 时运行,除非升级,否则删除代码通常不会运行/卸载。这是在这种情况下的正确行动,也是其他人所做的。现在没有时间通过​​运行日志来仔细检查。

以上是关于Wix Remove 自定义操作失败的主要内容,如果未能解决你的问题,请参考以下文章

WIX 自定义操作执行失败

修改数据库时 WiX 工具集自定义操作失败

Wix - 自定义操作返回代码 - 处理

使用Wix在MSI中自定义操作出错时显示最终用户消息

Wix 的 VC++ 自定义操作

使用 WiX C#/.NET 4 自定义操作时出现错误 2896