InstallExecuteSequence缓存会干扰自定义操作操作

时间:2010-12-23 18:25:41

标签: windows-installer

我需要将可以在每用户上下文中安装的产品升级到始终在每台计算机上下文中的新版本。要求是:

  1. 旧版本是安装在每用户(无论是谁)还是每台计算机上下文中,对于执行升级的管理员用户来说应该是完全无缝的。 MSI升级应该成功,而无需知道在每用户上下文中最初安装产品的先前版本的用户的密码。
  2. 应从单个.msi 文件执行安装(不允许使用setup.exe)。
  3. 安装应该能够以静默(非UI)模式运行。
  4. 安装过程中不允许重新启动。
  5. 我的策略是在安装开始时找到产品是否已经安装在每个用户的上下文中,如果是这样,将手动将注册表项转换为Per-Machine上下文(我检查过:没有其他更改,如除了这个转换之外,还需要文件系统更改等 我想出了如何将注册表中的所有适当的密钥从用户设置移动到计算机设置(如果它没有出现在HKEY_USERS中,则预先加载适当的用户配置单元)并创建自定义操作,并且我在运行MSI之前将其作为独立的可执行文件运行时工作。

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

    如果不违反上述要求,可以采取哪些措施来解决这个问题?

1 个答案:

答案 0 :(得分:0)

出于几个原因,您无法提出要求。一个是Windows Instalelr不支持同时升级和更改安装范围。您只能使用其他全部用户安装升级全用户安装。

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

你设法完成的任何事情都是彻底的黑客攻击,祝你好运。