WiX:卸载不会停止或删除我的Windows服务

时间:2012-01-27 16:55:05

标签: wix windows-installer wix3.5

我是WiX的新手,但我过去曾使用Installshield和Windows Installer做过一些事情。

我认为我是一个设置Windows服务的相当简单的安装程序。如果这有所不同,它会在“NT AUTHORITY \ NETWORK SERVICE”下设置它。

安装工作正常,但在卸载过程中我得到一个提示告诉我“安装必须更新系统运行时无法更新的文件或服务。如果选择继续,则需要重新启动才能完成设置“。如果我点击确定除了服务之外都会卸载所有内容(即使重启后)。它仍然启动,与服务相关的exe也被遗忘。

我可以手动停止并删除服务,而不会出现sc.exe命令的问题。

另外,如果我在运行卸载之前手动停止了服务,我没有得到上面提到的提示,但结果仍然相同。该服务已离开,文件也是如此。

以下是我的Wix的一部分:

<Component Id='cmpService' Guid='{542f970e-ca39-4501-aae4-9e03eaac9a25}' >
    <File Id='ServiceExeFile' Name='nls.service.agent.exe'
            ReadOnly='no' Compressed='yes' KeyPath='yes' Vital='yes' Hidden='no' System='no'
            Checksum='no'  />
    <ServiceInstall Id='MyServiceInstall' DisplayName='RaMP Data Collector' Name='rampDataCollector'
            ErrorControl='normal' Start='auto' Type='ownProcess' Vital='yes'
            Account='NT AUTHORITY\NETWORK SERVICE' />
    <ServiceControl Id='MyServiceControl' Name='rampDataCollector'  
            Start='install' Stop='uninstall' Remove='uninstall' Wait='yes' />
</Component>

我试过了

  • 取消Account ='NT AUTHORITY \ NETWORK SERVICE'并获得相同的结果
  • 改变我的所有Guid只是确定并得到相同的结果。
  • 查看两个方案的详细日志(卸载前运行的服务和卸载前停止的服务),但我没有看到任何可以解密的有趣内容。

以下是我运行卸载时msi日志中的部分,并且首先手动停止服务。我粘贴了服务组件和MSI操作周围的部分。

MSI (s) (A4:58) [10:44:11:080]: Component: cmpService; Installed: Local;   Request: Absent;   Action: Null
MSI (s) (A4:58) [10:44:11:080]: Component: cmpFolderPermissions; Installed: Local;   Request: Absent;   Action: Absent
MSI (s) (A4:58) [10:44:11:080]: Component: cmpApplicationShortcut; Installed: Local;   Request: Absent;   Action: Absent

MSI (s) (A4:58) [10:44:11:876]: Doing action: StopServices
Action ended 10:44:11: SchedSecureObjectsRollback. Return value 1.
Action start 10:44:11: StopServices.
MSI (s) (A4:58) [10:44:11:878]: Doing action: DeleteServices
Action ended 10:44:11: StopServices. Return value 1.
Action start 10:44:11: DeleteServices.
MSI (s) (A4:58) [10:44:11:879]: Doing action: RemoveRegistryValues
Action ended 10:44:11: DeleteServices. Return value 1.

任何帮助都将不胜感激。

我想作为最后的手段,我可​​以使用sc命令执行自定义操作并在卸载时停止/删除服务。

1 个答案:

答案 0 :(得分:2)

您应该了解卸载安装程序但卸载组件时不会发生服务命令。正如日志所说,没有采取任何行动。

如果您执行诸如破坏组件规则或在安装程序之外为应用程序提供服务以及弄乱组件/文件引用计数等问题,就会发生这种情况。

例如,如果存在foo.exe,然后MSI安装了foo.exe,它将在卸载时落后。因此,与之相关的服务也会。