我搜索过并搜索了很多“解决方案”,其中包括几个关于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备忘单,但无济于事。
任何人都可以看到我做错了什么,或者有任何有关如何在执行安装时获得验证条件的工作示例?对于条件背后的所有逻辑,它们都没有按预期工作(或者至少像我期望的那样!)
非常感谢提前。
答案 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”,以便在卸载时始终为真。