无法仅在“安装”上验证WiX条件
本文关键字:验证 WiX 条件 安装 | 更新日期: 2023-09-27 17:55:48
我已经搜索了又搜索并尝试了许多'解决方案',包括SO上的几个解决方案,但似乎都没有奏效。
我们有一个用 C# 编写的顶级 Windows 服务,我的任务是以 WiX .msi的形式创建一个安装程序,该安装程序将通过命令行安装,并将服务帐户和密码作为参数传入。
到目前为止,我已经添加了以下属性:
<Property Id="SERVICEACCOUNT" Admin="yes" />
<Property Id="PASSWORD" Admin="yes" />
然后在安装服务期间分配这些内容:
<ServiceInstall Id="ServiceInstaller"
Type="ownProcess"
Name="MyServiceName"
DisplayName="My Service Display Name"
Description="My Service Description"
Account="[SERVICEACCOUNT]"
Password="[PASSWORD]"
Start="auto"
ErrorControl="normal" />
<ServiceControl Id="ServiceController"
Name="MyServiceName"
Remove="both"
Stop="both"
Wait="yes" />
使用 Product.wxs 处于此状态,我可以从命令行成功安装、更新和卸载服务:
msiexec.exe /i "C:'MyApplication.Installer.msi" SERVICEACCOUNT="domain'serviceaccount" PASSWORD="password"
不提供服务帐户或密码字段默认在本地帐户下安装服务,我需要避免这种情况,所以我编写了一个条件来验证安装时是否始终提供参数:
<Condition Message="SERVICEACCOUNT and PASSWORD must be supplied">(SERVICEACCOUNT AND PASSWORD) AND NOT Installed</Condition>
这有效 - 它会显示一个消息框,如果未提供参数或直接从双击运行.msi,则终止安装。
然后,升级和卸载会出现问题,即使条件指出仅在卸载时"未安装"时,或者在升级过程中出现消息框(即使使用提供的参数从命令行调用.msi)。
我已经从我发现的其他帖子中尝试了该条件的各种排列,这些帖子报告了成功,例如:
(SERVICEACCOUNT AND PASSWORD) AND NOT (WIX_UPGRADE_DETECTED OR UPGRADINGPRODUCTCODE) AND NOT (REMOVE="ALL")
我也倒了这张备忘单,但无济于事。
任何人都可以看到我做错了什么,或者有任何工作示例说明如何在执行安装时获取条件以进行验证? 对于条件背后的所有逻辑,它们似乎都没有按预期工作(或者至少像我预期的那样!
提前非常感谢。
尝试
<Condition Message="SERVICEACCOUNT and PASSWORD must be supplied">(SERVICEACCOUNT AND PASSWORD) OR Installed</Condition>
这应该会停止没有(服务帐户和密码)的全新安装,但不会停止升级或卸载。
NOT Installed
表示当前未安装MSI。升级时,msi 会检测当前安装的产品,并将运行具有升级产品代码集的 msi。当 msi 使用升级产品代码运行时,它会自行卸载,但它已设置"已安装",因此在这种情况下您的条件将始终失败。
当您尝试卸载时,也会发生同样的情况。 Installed
是在 MSI 启动期间设置的,因此您的条件将失败。
但不能在卸载/删除时发生任何情况,您可以将"OR 已安装"附加到您的条件中,以便在卸载时始终如此。