【问题标题】:InstallShield Block installing same MSI twice from command lineInstallShield Block 从命令行安装两次相同的 MSI
【发布时间】:2017-06-22 08:46:53
【问题描述】:

我已使用 InstallShield 2015 Basic MSI 创建了设置。
假设在此设置中,用户可以选择要安装客户端还是服务器, 对于每种设置类型(客户端或服务器),他可以选择安装多个功能。
现在用户选择安装客户端设置并在其下包含 2 个功能, 如果他再次使用 UI 运行设置,他将进入维护模式,使他能够添加更多属于客户端的功能。

我的问题是他也可以从命令行(msiexec /I)再次运行相同的安装程序并尝试安装服务器安装程序类型,当前安装程序不会阻止或阻止它,这可能会导致他已经损坏的客户端安装程序已安装。

所以,我想我应该编写一个 CA 来检查当前设置是否已安装,并检查用户试图从命令行运行什么操作,如果它不是卸载阻止它(仍然需要支持从命令行运行卸载) .

这个逻辑正确吗?我如何知道用户从命令行运行的命令是什么?这意味着他运行 msiexec /I 而不是尝试从命令行卸载。

我想知道是否有一个 InstallShield\MSI 内置方式 \ 属性来防止从命令行安装相同的 MSI 两次?

【问题讨论】:

  • 您是说您希望服务器和客户端功能在 UI 和命令行中相互排斥?
  • 正确,用户可以安装客户端或服务器,从 UI 我可以阻止安装两者但不能从命令行安装,我不知道如何检查用户正在从命令行运行哪个操作,是否卸载\repair 允许或 Install 不允许。
  • 如果用户请求安装两个冲突的功能或者用户请求安装的一个功能与另一个功能相冲突,我会编写一个类型 19 错误自定义操作来阻止安装安装。在条件表达式中使用功能请求和已安装状态运算符并将其安排在 CostFinalize 之后。

标签: installation windows-installer installshield


【解决方案1】:

我很难理解你。希望我的回答符合您的需求。

当您第一次运行 MSI 时,它处于安装模式。当您再次运行它时,它是一种维护模式。根据您编写安装程序的方式,您应该会看到一个带有修复、更改或删除按钮的对话框。更改按钮可用于允许用户添加附加功能或删除功能。这一切都可以从命令行以及使用 ADDLOCAL 和 REMOVE 属性来完成。那里的属性采用 , 分隔的功能名称列表。

人们犯错误的地方是使用条件未安装 | REMOVE="ALL" 在他们的自定义操作上。这没有考虑到您可能具有多个功能并在维护模式期间返回并重新配置应用程序的事实。 MSI 具有功能和组件安装以及操作状态评估器,可在更适合此工作的条件下使用。

更新:

如果用户请求安装两个冲突的功能,或者用户请求安装的一个功能与已安装的另一个功能冲突,我会编写一个类型 19 错误自定义操作来阻止安装。在条件表达式中使用功能请求和已安装状态运算符并将其安排在 CostFinalize 之后。

【讨论】:

  • 我已经更新了我的问题,希望现在更清楚了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-03-25
  • 2017-10-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-06-03
  • 1970-01-01
相关资源
最近更新 更多