无法通过“安装”获取WiX条件进行验证

时间:2016-07-07 11:31:36

标签: c# visual-studio wix

我搜索过并搜索了很多“解决方案”,其中包括几个关于SO的解决方案,但似乎都没有。

我们有一个用C#编写的Topshelf Windows服务,我的任务是创建一个WiX .msi形式的安装程序,它将通过命令行安装,服务帐户和密码作为参数传入。< / p>

到目前为止,我添加了以下属性:

<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"

不提供SERVICEACCOUNT或PASSWORD字段默认在LocalAccount下安装服务,我需要避免这样做,所以我写了一个条件来验证参数是否总是在安装时提供:

<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")

我还倾倒了this备忘单,但无济于事。

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

非常感谢提前。

1 个答案:

答案 0 :(得分:1)

尝试

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

这应该停止没有(SERVICEACCOUNT AND PASSWORD)但不会停止升级或卸载的全新安装。

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

尝试卸载时会发生同样的情况。在msi启动期间设置Installed,这样您的情况就会失败。

通常情况下,如果您希望在安装过程中发生任何情况,而不是在升级期间卸载/删除,则可以在您的情况下附加“OR Installed”,以便在卸载时始终为真。