Installation InstallShield Block从命令行安装相同的MSI两次

Installation InstallShield Block从命令行安装相同的MSI两次,installation,windows-installer,installshield,Installation,Windows Installer,Installshield,我已使用InstallShield 2015基本MSI创建了安装程序。 假设在此设置中,用户可以选择是安装客户端还是服务器, 对于每种安装类型(客户端或服务器),他都可以选择安装若干功能。 现在用户选择安装客户端安装程序,并在其下包含2个功能, 如果他再次使用UI运行安装程序,他将进入维护模式,使他能够添加更多属于客户端的功能 我的问题是,他还可以从命令行(msiexec/I)再次运行相同的安装程序,并尝试安装服务器安装类型,当前安装程序未阻止或阻止它,这可能会导致他已安装的客户端安装程序损坏

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

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

所以,我想我应该写一个CA来检查是否安装了当前的安装程序,检查用户试图从命令行运行什么操作,如果没有卸载,则阻止它(仍然需要支持从命令行运行卸载)

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


我想知道是否有InstallShield\MSI build in way\property阻止从命令行两次安装同一个MSI?

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

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

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

更新:


如果用户请求安装两个相互冲突的功能,或者用户请求安装一个与另一个已安装的功能冲突的功能,我将编写一个类型19错误自定义操作来阻止安装。在条件表达式中使用“功能请求”和“已安装状态”操作符,并在条件表达式完成后对其进行调度

我已经更新了我的问题,希望现在更清楚。你是说你想让服务器和客户端功能在UI和命令行中相互排斥吗?正确,用户可以安装客户端或服务器,从UI我可以阻止安装,但不能从命令行,我不知道如何检查哪个操作用户正在从命令行运行,是允许的卸载\修复还是不允许的安装。如果用户请求安装两个冲突的功能,或者用户请求安装一个与另一个已安装的功能冲突的功能,我将编写类型19错误自定义操作来阻止安装。在条件表达式中使用“功能请求”和“已安装状态”操作符,并在条件表达式完成后对其进行调度。