我有一个自定义操作,我希望每次在不使用UI的情况下执行MSI都会执行该操作:
<InstallExecuteSequence>
<Custom Action="InitSetup" Before="CostFinalize">UILevel=2</Custom>
</InstallExecuteSequence>
执行升级时,此操作的一部分是验证命令行中提供的用户密码:
msiexec / i my.msi PROP_PASSWORD = 12345
其中的PASSWORD属性被标记为“隐藏且安全”:
<Property Id="PROP_PASSWORD" Hidden="yes" Secure="yes" />
在升级过程中,在删除旧版本的同时,InitSetup再次被触发,但是没有将PROP_PASSWORD传递给它,因此该操作失败并导致整体升级失败。
有没有办法强制将PROP_PASSWORD转发到要卸载的MSI?
答案 0 :(得分:1)
条件 :确实需要在卸载时验证许可证密钥吗?您能否将自定义操作设置为不在卸载上运行?可以将其配置为不在主要升级启动的卸载上运行-与常规的手动触发的卸载相反。它涉及属性UPGRADINGPRODUCTCODE
。通过将NOT UPGRADINGPRODUCTCODE
添加到您的条件中,自定义操作将不会在重大升级期间运行。类似于:UILevel=2 AND NOT UPGRADINGPRODUCTCODE
。条件NOT REMOVE="ALL"
也会阻止它在常规卸载中运行。条件很艰苦-有很多安装模式需要测试。
持久属性 :您还可以将密码保留在注册表中,并构造您的设置以将其读回。这涉及WiX可以轻松完成的注册表搜索。
Live? :您与以前的包裹一起住吗?如果是这样,您可以通过较小的升级来修补实时版本,以更改已安装产品的卸载顺序。在上述情况下,我建议更改自定义操作的条件,这可以通过较小的升级来实现。
Setup.exe启动的卸载程序 :如果您使用由Burn制作的setup.exe启动器,则可以通过以下方法开始卸载旧版本:启动器,而不是从实际的MSI内部启动(由于在任何时候都只需要激活一个MSI安装会话,因此存在严重的技术限制)。这将使您可以将任何命令行传递给卸载例程。
在我疲惫的状态下,我现在可以生产的一切。我会回头看看您是否还活着,看看我忘了要提多少。
答案 1 :(得分:0)
只需结束关于我最终如何解决的问题-或更准确地说,可以找到解决方法:由于自定义操作的条件为UILevel = 2而不是使用/ q启动静默安装,所以我指示使用/ qb-。这会将UILevel设置为3。从用户体验的角度来看,他们将仅看到通知表单和进度栏。它不会显示阻止对话框。