2012-09-17 131 views
1

期间有条件地启动服务我有一个MSI安装程序来安装服务,默认情况下它会停止。用户可以手动打开它或停止它。我也有一个MSI补丁。Wix在补丁

问题:安装补丁程序时,服务停止。如果它打开,我希望修补程序离开服务,如果它是关闭,则会关闭。我怎样才能达到这种功能?

回答

0

所以最后我使用了两个自定义操作。一个在安装补丁程序之前保存服务的状态。如果服务是STOPPED,我使用MYSERVICE_STATUS等属性将它们设置为“0”,如果它们是RUNNING,则将其设置为“1”。

修补程序安装完成后,我启动另一个自定义操作来检查这些属性和每个服务的最终状态。如果MYSERVICE_STATUS == 1和服务现在是STOPPED他们,我重新启动它。

2

据我了解补丁工作方式,这是预期的默认行为。

请注意,当您第一次安装MSI软件包(初始安装)时,服务将被安装为停止状态,并且MSI软件包将缓存在系统中的特殊位置。安装补丁程序时,修补程序为安装程序包带来的更改将应用​​于缓存的MSI,从而将其转换为期望的方式,并重新安装程序包。因此,只要初始软件包包含将服务安装为停止的说明,并且修补程序更改不会修改此内容,则将重新安装该组件并且服务最终停止 - 就像初次安装后一样。

为了改变这种行为,你可以尝试标记包含服务的组件为NeverOverwrite。如果您为某个组件设置了NeverOverwrite='yes',则在修补程序应用程序期间不会重新安装该组件,因此现有服务将保持独立状态,并且保持应用修补程序之前的状态。

我不确定是否需要在初始安装包中更改组件描述的方式。希望,改变它在新的一个将工作。否则,如果您已经提供了产品的初始版本,则可能会造成问题。

我应该警告你,我没有尝试这种确切的情况,所以你可能想先验证这个建议。

+0

感谢您的回答。不幸的是,MSI是在一段时间之前发布的,现在我正在开发这个补丁。所以我不能尝试使用“NeverOverwrite”属性。我不能通过重新定义修补程序中的元素来实现此目的吗?我想我也可以通过自定义操作完成,但这是最后的手段。 – Herno

+0

您是否尝试过'NeverOverwrite'属性的方法?正如我在答复中提到的那样,我不确定它会起作用,但你一定要尝试一下。只要补丁首次应用于视图,只有产品重新安装发生,才有可能重新安装,以便知道'NeverOverwrite' ... –

+0

我刚刚尝试过,看起来它没有奏效。我已经看到ServiceControl表有一个名为“StopXXXXService”的条目。也许我可以使修补程序转换表并删除此条目?有没有办法?谢谢 – Herno