无法仅在“安装”上验证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")

我也倒了这张备忘单,但无济于事。

任何人都可以看到我做错了什么,或者有任何工作示例说明如何在执行安装时获取条件以进行验证? 对于条件背后的所有逻辑,它们似乎都没有按预期工作(或者至少像我预期的那样!

提前非常感谢。

无法仅在“安装”上验证WiX条件

尝试

<Condition Message="SERVICEACCOUNT and PASSWORD must be supplied">(SERVICEACCOUNT AND PASSWORD) OR Installed</Condition>

这应该会停止没有(服务帐户和密码)的全新安装,但不会停止升级或卸载。

NOT Installed表示当前未安装MSI。升级时,msi 会检测当前安装的产品,并将运行具有升级产品代码集的 msi。当 msi 使用升级产品代码运行时,它会自行卸载,但它已设置"已安装",因此在这种情况下您的条件将始终失败。

当您尝试卸载时,也会发生同样的情况。 Installed是在 MSI 启动期间设置的,因此您的条件将失败。

通常,如果您希望在升级期间安装时发生

但不能在卸载/删除时发生任何情况,您可以将"OR 已安装"附加到您的条件中,以便在卸载时始终如此。