wix - 如果在安装程序中修改和升级,如何限制用户更改功能?
问题描述
我有一个安装程序,要求用户选择功能。无论用户选择什么,在修改和升级安装时都不会改变。例如:我的安装程序中有以下三个功能:
<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>
现在假设用户开始安装并选择第一个独立的功能并安装它。现在如果用户想修改,他应该不允许改变特性,或者即使用户想升级,用户也应该不允许改变特性。他只能升级他第一次选择的东西。有没有办法做到这一点?
解决方案
ARPNOMODIFY:我想这取决于这些功能永远不会改变的重要性。您可以将
ARPNOMODIFY
MSI 中的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
,但我想您可以InstallInitialize
在InstallExecuteSequence
中止安装如果ADDLOCAL
,REMOVE
或ADVERTISE
被设置?如果您没有正确调整此自定义操作,可能会导致软件包根本无法卸载或无法正确升级。
一些未经验证的条件建议:如何仅在安装和修改时执行条件自定义操作?
MigrateFeatureStates:对于重大升级,GUI 不会像运行 modify 一样运行,而是全新安装(因为产品 GUID 是新的)。因此,显示的是原始安装 GUI,而不是修改的 GUI。因此,您可能需要禁用某些 GUI 控件或隐藏整个对话框以防止选择功能(在 WiX 默认对话框中不确定)。在下面添加了一个链接。标准操作MigrateFeatureStates将负责保留版本之间的功能安装状态,前提是您没有对功能结构做任何剧烈的事情。您启用此标准操作以在升级表中运行。我认为应该默认在 WiX MSI 中运行。
更新:
Preselected Property:有一个特殊的属性叫做Preselected,就是自动隐藏特征选择。您可以尝试设置它或检查它是否被WiX自动设置,看看它是否隐藏了功能选择。老实说,我从未尝试过。
一些进一步的资源:
- 隐藏整个对话框: Wix,以前版本存在时的自定义对话框
推荐阅读
- c# - 如何从 ViewModel 异步更新 UI 元素
- ios - 如何处理从 iOS 文件应用程序共享的多个文件
- javascript - 为什么选择器返回的是字符串而不是请求的数据?
- django - Django Heroku - ModuleNotFoundError:没有名为“django_heroku”的模块
- sql - 使用虚拟条件确保使用多列索引?
- xamarin.ios - App Center 真实设备构建错误 No iOS 签名身份与指定的配置文件匹配
- flutter - 如何在flutter中存储和显示格式化文本?
- angular - 如何在反应输入中保持默认值
- javascript - 为什么 async await 不能正确地与 axios 一起工作?
- youtube-api - YouTube API ListResponse ETag 不一致