在升级到正在卸载的 MSI 期间传递 属性

Passing property during upgrade to MSI that being uninstalled

我有一个自定义操作,我希望每次在没有 UI 的情况下执行 MSI 时执行该操作:

<InstallExecuteSequence>
  <Custom Action="InitSetup" Before="CostFinalize">UILevel=2</Custom>
</InstallExecuteSequence>

执行升级时,此操作的一部分是验证命令行中提供的用户密码:

msiexec /i my.msi PROP_PASSWORD=12345

中的密码 属性 被标记为隐藏和安全:

<Property Id="PROP_PASSWORD" Hidden="yes" Secure="yes" />

在升级期间,删除旧版本时,InitSetup 再次被触发,但 PROP_PASSWORD 没有被传递给它,因此操作失败并导致整体升级失败。

有没有办法强制PROP_PASSWORD转发到正在卸载的 MSI?

条件:真的有必要在卸载时验证许可证密钥吗?您能否将自定义操作设置为在卸载时不 运行?可以将其配置为在主要升级启动的卸载时不 运行 - 与正常的手动触发卸载相反。它涉及属性UPGRADINGPRODUCTCODE。通过将 NOT UPGRADINGPRODUCTCODE 添加到您的条件中,自定义操作将永远不会 运行 在重大升级期间。类似于:UILevel=2 AND NOT UPGRADINGPRODUCTCODE。条件 NOT REMOVE="ALL" 也会阻止它在常规卸载时 运行ning。条件艰苦,有多种安装方式可以测试。

Persist Properties:您还可以将密码保存在注册表中,并构建您的设置以在密码存在时读取它。这涉及 WiX 可以轻松完成的注册表搜索。

Live?:你用之前的包裹住吗?如果是这样,您可以通过较小的升级来修补实时版本,以更改已安装产品的卸载顺序。在上述情况下,我建议更改自定义操作的条件,这可以通过较小的升级来实现。

Setup.exe 已启动卸载:如果您使用由 Burn 制作的 setup.exe 启动器,一个选项是是通过启动器开始卸载旧版本,而不是从实际的 MSI 本身(由于任何时候只需要一个 MSI 安装会话处于活动状态,因此具有严重的技术限制)。这将允许您将任何命令行传递给卸载例程。

在我疲惫的状态下,这就是我现在所能做的。我回头看看你是不是活着,看看我忘记说了多少。

只是为了结束关于我最终如何解决它的主题 - 或者更准确地说找到了一个解决方法:由于自定义操作有一个条件 UILevel=2 而不是使用 /q 启动静默安装,我指示使用 /qb- 升级。这会将 UILevel 设置为 3。从用户体验的角度来看,他们只会看到通知表单和进度条。它不会显示阻止对话框。