WiX ScheduleReboot 不遵守条件
Posted
技术标签:
【中文标题】WiX ScheduleReboot 不遵守条件【英文标题】:WiX ScheduleReboot does not respect condition 【发布时间】:2013-09-17 13:36:20 【问题描述】:情况
我有一个由 Windows Forms 应用程序和 Windows 服务组成的应用程序。要安装这些组件,我使用的是 WiX。到目前为止一切正常,但是当我尝试在 Windows XP 上安装时出现问题。
当安装程序在关闭安装之前尝试启动服务时,它不起作用。我收到“用户无权启动”消息。
我从 .wxs 文件中删除了 ServiceControl
块,重新构建,尝试安装并重新启动电脑(这在 Windows XP 上)。所以现在我的服务开始正常了。
问题
我需要询问重启和禁用<ServiceControl>
from <Component>
,仅当 Windows 是 XP 并且 Service Pack 小于 3 时。
所以我尝试了这个:
<Product>
<!-- (...) -->
<InstallExecuteSequence>
<ScheduleReboot After="InstallFinalize">
<![CDATA[NOT (VersionNT <= 501 AND ServicePackLevel <> 3)]]>
</ScheduleReboot>
</InstallExecuteSequence>
<!-- (...) -->
</Product>
<!-- (...) -->
<Fragment>
<ComponentGroup>
<Component>
<File Id="ServExe" Name="Serv.exe" DiskId="1"
Source="Serv.exe" KeyPath="yes"/>
<ServiceInstall
Id="ServiceInstaller"
Type="ownProcess"
Name="Serv"
DisplayName="Serv"
Description="Serv"
Start="auto"
Account="[SERVICEACCOUNT]"
Password="[SERVICEPASSWORD]"
ErrorControl="normal" />
<ServiceControl Id="StartService" Start="install" Stop="both"
Remove="uninstall" Name="Serv" Wait="yes" />
</Component>
<!-- (...) -->
</ComponentGroup>
</Fragment>
但无论是什么 Windows(我尝试过 XP、XP SP 2、XP SP 3、Windows 7),我总是得到“需要重新启动”对话框。而且我不知道如何在<ServiceControl>
中设置安装时间条件。
我该如何解决这个问题?
【问题讨论】:
【参考方案1】:在 InstallExecuteSequence 表中,仅当 Condition 为 True 时才会执行操作。尝试像这样简化您的表达式:(VersionNT = 501 AND ServicePackLevel = 3)。 您可以使用 Orca 打开您的 msi 文件并检查 InstallExecuteSequence 表是否在 ScheduleReboot 行中包含正确的 Condition 记录。 尝试创建您的安装日志文件并检查安装程序如何评估您的状况。
【讨论】:
感谢您的回答,但我在这里提出的表达式与您的建议的逻辑值不同。我试图简化但没有造成任何差异。在 Orca 中,情况是一样的。 我犯了一个错误,正确的条件应该是(VersionNT = 501 AND ServicePackLevel ServiceControl 不允许使用 Condition 作为子元素。您可以尝试创建两个安装相同文件的组件项目 - 一个用于 XP SP3 及更高版本,第二个用于其他文件。但在我看来,创建将启动您的服务的外部自定义操作 dll 更简单。 现在条件合适。但是您说 ServiceControl 不允许将 Condition 用作子元素。 这不是真的,我删除了条件的左侧并且工作,不是针对我的情况,而是针对一般情况。以上是关于WiX ScheduleReboot 不遵守条件的主要内容,如果未能解决你的问题,请参考以下文章