首页 > 解决方案 > 如果在安装程序中修改和升级,如何限制用户更改功能?

问题描述

我有一个安装程序,要求用户选择功能。无论用户选择什么,在修改和升级安装时都不会改变。例如:我的安装程序中有以下三个功能:

      <Feature Id="Standalone" Title="Standalone" Level="2">
      </Feature>
      <Feature Id="CentralCase" Title="Central case" Level="2" >
      </Feature>
      <Feature Id="MiddleEF" Title="Middle Ef" Level="2" Display="expand">          
           <Feature Id="GUI" Title="Client" Level="3"></Feature>
           <Feature Id="AppServer" Title="Application Server" Level="3">  
      </Feature>
      </Feature> 

现在假设用户开始安装并选择第一个独立的功能并安装它。现在如果用户想修改,他应该不允许改变特性,或者即使用户想升级,用户也应该不允许改变特性。他只能升级他第一次选择的东西。有没有办法做到这一点?

标签: wixwindows-installer

解决方案


ARPNOMODIFY:我想这取决于这些功能永远不会改变的重要性。您可以将ARPNOMODIFYMSI 中的 1并且不会有可供调用Modify的按钮:

 <Property Id="ARPNOMODIFY" Value="1" Secure="yes" />

以下免责声明。这里是龙。

msiexec.exe:但是,您仍然可以通过启动 MSI 文件本身来调用 modify(默认对话框集应该正确禁用修改按钮),但更糟糕的是:您可以通过msiexec.exe命令行更改任何您想要的内容:

msiexec /i "MySetup.msi" ADDLOCAL=MyFeature

这可能没问题,因为它似乎很少使用。但是,您应该知道,远程管理系统通常依赖msiexec.exe命令行来处理 MSI 部署,因此可以使用部署系统轻松更改功能状态(通过部署工具 GUI,无需处理命令行)。

自定义操作:如果用户尝试修改通过命令行调用的功能结构,我不知道自动中止设置的方法msiexec.exe,但我想您可以InstallInitializeInstallExecuteSequence中止安装如果ADDLOCALREMOVEADVERTISE被设置?如果您没有正确调整此自定义操作,可能会导致软件包根本无法卸载或无法正确升级

一些未经验证的条件建议:如何仅在安装和修改时执行条件自定义操作?

MigrateFeatureStates:对于重大升级,GUI 不会像运行 modify 一样运行,而是全新安装(因为产品 GUID 是新的)。因此,显示的是原始安装 GUI,而不是修改的 GUI。因此,您可能需要禁用某些 GUI 控件或隐藏整个对话框以防止选择功能(在 WiX 默认对话框中不确定)。在下面添加了一个链接。标准操作MigrateFeatureStates将负责保留版本之间的功能安装状态,前提是您没有对功能结构做任何剧烈的事情。您启用此标准操作以在升级表中运行。我认为应该默认在 WiX MSI 中运行。

更新

Preselected Property:有一个特殊的属性叫做Preselected,就是自动隐藏特征选择。您可以尝试设置它或检查它是否被WiX自动设置,看看它是否隐藏了功能选择。老实说,我从未尝试过。


一些进一步的资源


推荐阅读