MSI:在InstallValidate期间如何在卸载时停止服务 - 无论如何都可以工作吗?

时间:2016-04-27 10:29:12

标签: wix windows-installer uninstall

我想知道,如果在WiX项目文件中将服务标记为Remove="uninstall" Stop="uninstall",如何以及何时尝试停止服务。

我为什么要问: 在卸载时,RESTART MANAGER无法正确识别或处理该服务,从而导致“重新启动对话框”。

我将调试器连接到服务并意识到,它从未被尝试停止 - 至少,不是通过注册的ControlHandler。我猜测它将以执行“sc stop servicename”或通过Services-Dialog停止它的方式停止。服务本身是用C ++编写的,控制处理程序由RegisterServiceCtrlHandler注册,它在两个概述的情况下都能正常工作。停止服务时调用处理程序。不是这样,如果通过MSI停止/卸载它。

顺便说一句,正如Wix Installer Problem: Why does RestartManager mark Service as RMCritical and not RMService中jbudreau的答案所述,如果服务作为LocalSystem运行,那么在InstallValidate部分中是否可以停止服务?在InstallValidate中,卸载过程尚未提升。

关于停止LocalSystem服务的过程如何处理卸载的一些解释会很棒!

提前致谢!

修改 这是ServiceInstall和ServiceControl的服务定义:

        <DirectoryRef Id="BINDIR">
        <!-- the service -->
        <Component Id="myProgramsvc.exe" Guid="1f64c03f-26ea-47ba-985c-2a566afffffa">
            <File Id="myProgramsvc.exe" KeyPath="yes" Vital="yes"
                  Source="SourceDir\bin\myProgramsvc.exe"/>
            <ServiceInstall Id="MyProgramSvc" Type="ownProcess"
                            Vital="yes" Name="MyProgramSvc" DisplayName="Test MyProgram Service"
                            Description="Test MyProgram Service" Start="auto" Account=".\LocalSystem"
                            ErrorControl="normal" Interactive="no" Arguments="--run"/>
            <ServiceControl Id="MyProgramSvc" Name="MyProgramSvc" Wait="yes" Remove="uninstall" Stop="uninstall" Start="install"/>
        </Component>
    </DirectoryRef>

和进程层次结构,其中RestartManager抱怨---- as.exe(PID:4312): process hierarchy of the service 编辑2:(id 9324与截图不同,取自不同的日志文件尝试)

MSI (s) (BC:38) [16:46:14:141]: RESTART MANAGER: Detected that application with id 9324, friendly name '---as.exe', of type RmCritical and status 1 holds file[s] in use.
MSI (s) (BC:38) [16:46:14:141]: RESTART MANAGER: Did detect that a critical application holds file[s] in use, so a reboot will be necessary.

编辑3: 日志文件:uninstall.log - 日志文件太大,无法在此处发布(30000个字符限制)。

1 个答案:

答案 0 :(得分:1)

InstallValidate不会停止服务 - 这是由Stop​​Services操作完成的。 InstallValidate试图找出正在使用的文件(使用Restart Manager)并显示正在使用的文件对话框。在涉及服务的情况下,它会忽略ServiceControl表中具有“停止卸载”设置的服务所使用的任何文件。如果要确保服务完全停止,请使用wait =“yes”。这是一个标准的停止服务控制处理程序调用。

如果该服务触发了一堆仍在运行的进程,则它只是一个普通的使用中文件问题,而且服务不相关。这些进程需要关闭调用(来自服务?)或者他们应该与Restart Manager集成,这类事情:http://www.codeproject.com/Articles/772868/Restart-Manager-Support-For-Windows-Application

如果进程响应Windows消息,则WiX util CloseApplication应将其关闭。

我会指出您的WiX中可能只有一个错误,其中ServiceControl中指定的服务不正确。由于您可以控制任何服务(不只是您正在安装/卸载的服务),因此不会检查该名称是否与您的服务或任何其他服务相对应。如果你从未看到服务控制停止被调用,这是最简单的解释。