InstallShield - 在升级期间防止修补程序覆盖注册表值?

问题描述 投票:2回答:1

我在InstallShield MSI项目上使用InstallShield 2016,并尝试使用Update可执行文件创建次要修补程序包。一切正常,但注册表值在更新时会更改为默认值。

我已经研究过更改REINSTALLMODE字符串,但它可能对将来利用注册表项系统的限制太多了。我还读过使用AppSearch和RegLocator表将值读入msi属性。我不明白如何使用这些表,所以这是一个我不太了解的解决方案。

我错过了什么?

谢谢。

windows-installer upgrade installshield
1个回答
2
投票

精华:我写了很多,没有任何意义。让我试着把它缩短:Don't write registry values that your application might change。以下是我可能会做的更好用未来的应用程序设置管理设置:1) use a custom REINSTALLMODE不覆盖此更新上的任何注册表项,然后我会2) modify the applicationHKCU注册表项复制到新位置,从不触摸它们从那时起你的设置。 3)您还应该根据存储在HKLM中的只读模板设置进行update your application to be able to write all HKCU keys for your application if they are missing - 或者从存储在application.exe中的内部默认值中编写它们。

这样,您将来不需要您的设置写入任何HKCU设置 - 并且修改后的值不会受到干扰。 There are ways to enforce new values - if you need to


我也将留下以下内容。


真实世界:这个“overwrite registry settings on upgrade problem”在我看来是一个MSI设计反模式。或者,我喜欢称它为:an MSI Festivus Grievance(必须看视频上下文)。

为了可靠地避免这个问题,我想建议你考虑这个选项:

消除部署注册表设置:Generally you should not write registry settings from your setup that are ever changed by your application

  • HKLM keys:我只在设置中写入HKLM中的只读设置,并允许通过msiexec.exe命令行覆盖它们。然后我使用AppSearch或自定义操作将其读回升级 - 或者根本不读取 - 取决于对业务逻辑和用例有意义的任何内容。
  • HKCU keys:我更愿意在新版本中完全从部署中删除所有HKCU密钥,并通过应用程序本身编写默认注册表项 - 使用其启动序列。这基本上总是消除了很多部署问题。您甚至可以将已写入注册表中只读位置的应用程序复制设置添加到其活动的“实时”配置单元中。例如,您从HKLM中的只读注册表部分复制默认值。

这是我喜欢用来“屏蔽”我的应用程序免受每用户数据部署干扰的一般方法 - 无论是HKCU中的注册表项还是基于用户配置文件。对于某些应用,这是不可能的。例如那些没有具有启动顺序的exe的那些。

但是等等,即使您可以使用此方法并删除托管新MSI中的注册表项的组件,卸载并重新安装(在主要升级期间 - 您需要删除组件)您的包将会撕掉注册表项除非你把它们永久性地设定为永久性的。

我有时会得出结论,我必须保留旧组件并复制新组件以写入新的注册表项或不同的注册表值名称以保存新值。


记住Property Pattern:虽然对于WiX而不是Installshield,Rob Mensching's "Remember Property Pattern"是如何使用AppSearch的一课。 Installshield中的概念相同。您可以在维护和升级方案期间使用AppSearch回读属性 - 就此而言是全新安装。

Rob很好地说明了这种“记忆模式”在如何覆盖你在msiexec.exe命令行中指定的任何新值的讽刺,除非你采取措施来避免这个问题(或者你的场景允许忽略这个特殊问题 - 这是很少安全)。请阅读整篇文章的文章。


Installshield:在installshield中,您可以在System Search视图中定义AppSearch条目。这里的对话框应该在很大程度上不言自明,因为您只需指定应将设置文件中的哪些注册表项或条目读入您指定要读取的属性。对话框是“向导”,因此您只需单击它们并创建AppSearch即可。

注意!:一个非常常见的烦恼是忘记根据位数(32对64位)引用正确的注册表配置单元:

  • HKEY_LOCAL_MACHINE\SOFTWARE\Mozilla\Mozilla Firefox
  • HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\Mozilla\Firefox

这可能会导致一些真实和反复的混淆 - 至少在我的世界里。这是一个如此愚蠢的问题,我们都希望避免浪费一分钟的时间。

您可以实现Rob建议的自定义操作,以避免AppSearch擦除来自命令行的属性值。或者我想如果不应该从命令行设置有问题的属性,你可以忽略它?我想这是可能的。


自定义操作方法:我不喜欢这些,但我会简要提及它们。

Write Registry Settings With Custom Actions:有些人更喜欢直接通过自定义操作编写注册表设置,因为他们可以根据需要为自定义操作添加逻辑以编写新值,并保持msiexec.exe远离值并且不会意外地重置它们。从逻辑上来说,这不是最糟糕的方法,但是当你增加风险时,你也可能成为自己最大的敌人,因为自定义动作很难做到正确并且能够很好地调整和排序。 Custom actions are a leading cause of deployment failure

Backup / Restore - or "Preserve Values Custom Actions":有些人使用自定义操作进行备份,然后在安装结束时集中恢复注册表设置,而不是直接使用自定义操作编写针脚设置。在我看来,这不是一个好方法。非常笨重,并且容易自行覆盖错误。 Sequencing and conditioning of such custom actions can also become very complicated

还有其他方法。

© www.soinside.com 2019 - 2024. All rights reserved.