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



我有一个自定义操作,每次在没有 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?

条件反射 :卸载时真的有必要验证许可证密钥吗?您能否将自定义操作设置为卸载时不运行?可以将其配置为不在主要升级启动的卸载时运行 - 而不是正常的手动触发卸载。它涉及财产UPGRADINGPRODUCTCODE。通过向条件添加NOT UPGRADINGPRODUCTCODE,自定义操作将永远不会在主要升级期间运行。像这样:UILevel=2 AND NOT UPGRADINGPRODUCTCODE.条件NOT REMOVE="ALL"也会阻止它在常规卸载时运行。条件很苛刻 - 有许多安装模式需要测试。

保留属性:还可以将密码保留在注册表中,并构造设置以将其读回(如果存在(。这涉及WiX可以轻松进行的注册表搜索。

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

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

在我疲惫的状态下,这就是我现在所能生产的一切。我会回头看看你是否活着,看看我忘了提多少。

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

最新更新