Windows installer InstallExecuteSequence缓存干扰自定义操作

Windows installer InstallExecuteSequence缓存干扰自定义操作,windows-installer,Windows Installer,我需要升级一个可以在每用户上下文中安装的产品,升级到一个始终在每机器上下文中的新版本。这些要求是: 对于执行升级的管理员用户而言,无论旧版本是按用户(无论是谁)还是按机器上下文安装的,都应该是完全无缝的。 MSI升级应该成功,而无需知道最初在每个用户上下文中安装产品早期版本的用户的密码 应通过单个.msi文件执行安装(不允许使用setup.exe) 安装应该能够在静默(非UI)模式下运行 安装期间不允许重新启动 我的策略是在安装开始时查找产品是否已在每用户上下文中安装,如果已安装,则手动将注册表

我需要升级一个可以在每用户上下文中安装的产品,升级到一个始终在每机器上下文中的新版本。这些要求是:

  • 对于执行升级的管理员用户而言,无论旧版本是按用户(无论是谁)还是按机器上下文安装的,都应该是完全无缝的。
    MSI升级应该成功,而无需知道最初在每个用户上下文中安装产品早期版本的用户的密码
  • 应通过单个.msi文件执行安装(不允许使用setup.exe)
  • 安装应该能够在静默(非UI)模式下运行
  • 安装期间不允许重新启动
  • 我的策略是在安装开始时查找产品是否已在每用户上下文中安装,如果已安装,则手动将注册表项转换为每机器上下文(我已选中:除此转换外,不需要其他更改,如文件系统更改等)。
    我找到了如何将注册表中所有适当的键从用户设置移动到计算机设置(预加载适当的用户配置单元,以防它没有出现在HKEY_用户中),并创建了自定义操作来执行此操作,并且在运行MSI之前,当我将其作为独立的可执行文件运行时,确实起作用

    然而,问题是,当Windows Installer运行InstallExecuteSequence时,它首先会为所有产品创建一个“缓存的产品上下文”。因此,当我的自定义操作在InstallExecuteSequence过程中运行时,此缓存已经创建。因此,确定是否存在具有相同升级代码的旧产品的FindRelatedProducts操作会查看该缓存,并忽略我的自定义操作应用的更改。
    如果在运行MSI之前,以前的产品处于每用户上下文中,FindRelatedProducts将查看缓存,而不会应用升级并删除以前的版本,因为新产品处于每机器上下文中,即使之前的产品版本已通过我的自定义操作配置为注册表中的每台计算机上下文


    如何在不违反上述要求的情况下解决此问题?

    由于以下几个原因,您所要求的是不可能的。一是Windows Installer不支持同时升级和更改安装范围。您只能用另一个全用户安装升级一个全用户安装

    另一个问题是不可能为其他用户配置文件下的每个用户安装提供服务


    您设法完成的任何操作都是一次彻底的黑客攻击,祝您好运。

    忘记添加:在FindRelatedProducts操作之后覆盖PREVIOUSVERSIONSINSTALLED属性没有帮助。