使用WixSharp制作Windows服务安装包如何彻底禁用repair功能
WixSharp 彻底禁用MSI修复功能的实现方法
ARPNOREPAIR、ARPNOMODIFY属性仅作用于控制面板的入口显示,要禁用CMD调用、右键MSI触发的修复操作,需要从MSI包的运行逻辑层面做拦截,具体可通过以下两种方案实现:
方案1:添加启动条件直接拦截修复请求(最易实现)
MSI触发修复操作时会自动设置REINSTALL属性,该属性是判断当前运行是否为修复模式的核心标识,你可以直接添加启动条件,当检测到该属性存在时直接终止安装流程:
var project = new Project("你的Windows服务安装包名称", // 原有控制面板入口隐藏配置 new Property("ARPNOMODIFY", "1"), new Property("ARPNOREPAIR", "1"), // 新增修复拦截启动条件 new LaunchCondition("NOT REINSTALL", "本安装包不支持修复操作,请卸载后重新安装。") );
触发修复时安装程序会直接弹出你设置的提示文本并退出,不会执行任何修复逻辑。
方案2:移除安装序列中的修复相关动作(更彻底)
如果不需要弹出提示,希望修复操作触发后直接无响应,可以直接从MSI的UI执行序列、后台执行序列中移除所有和修复相关的动作节点:
var project = new Project("你的Windows服务安装包名称", new Property("ARPNOMODIFY", "1"), new Property("ARPNOREPAIR", "1") ); // 移除UI序列中的修复相关动作 project.InstallUISequence .Where(seq => seq.Action == "RepairUser" || seq.Condition?.Contains("REINSTALL") == true) .ToList() .ForEach(seq => project.InstallUISequence.Remove(seq)); // 移除后台执行序列中的修复相关动作 project.InstallExecuteSequence .Where(seq => seq.Action.Contains("Repair") || seq.Condition?.Contains("REINSTALL") == true) .ToList() .ForEach(seq => project.InstallExecuteSequence.Remove(seq));
两种方案可以搭配使用,确保所有修复入口都被拦截。测试时需覆盖三个场景验证效果:控制面板程序列表入口、CMD执行msiexec /f 你的安装包.msi命令、右键MSI文件选择修复选项。
内容的提问来源于stack exchange,提问作者R.P
相关产品推荐
相关产品推荐

