如何修复 MSI 软件更新注册损坏问题

本文提供了在安装软件更新后修复或卸载某些产品可能失败的问题的解决方案。

适用于:Windows 10 - 所有版本,Windows Server 2012 R2
原始 KB 编号: 971187

症状

安装软件更新后,某些产品的修复或卸载可能会失败。 如果已启用 MSI 日志记录,则会在日志中找到以下行:

找不到本地修补程序“”。 从源头查找它。
...
MainEngineThread 返回 1612

在注册表中查看时,可能会发现以下注册表子项中缺少软件更新缓存注册: HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Installer\UserData\<SID>\Patches\<SQUID>

解决方案

重要

此部分(或称方法或任务)介绍了修改注册表的步骤。 但是,注册表修改不当可能会出现严重问题。 因此,请务必严格按照这些步骤操作。 为了加强保护,应先备份注册表,再进行修改。 如果出现问题,可以还原注册表。

若要解决此问题,请执行以下步骤:

  1. 确认产品已受影响。

    要执行此操作,请执行以下步骤:

    1. 通过打开以下注册表子项查找产品的软件更新注册: HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Installer\UserData\<SID>\Products\<ProductSQUID>\Patches
      在此子项下,将有一个子项用于应用于产品的每个软件更新。

    2. 对于采用以下格式的每个子项,请执行以下步骤: HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Installer\UserData\<SID>\Products\<ProductSQUID>\Patches\<PatchSQUID>

      验证是否存在以下子项:

      HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Installer\UserData\<SID>\Patches\<PatchSQUID>

      如果缺少子项,则产品将受到影响。 继续执行步骤 2。

      如果子项存在,请验证 LocalPackage 字符串值是否已正确设置,以及 LocalPackage 字符串值引用的包是否也存在。

      1. 如果缺少 LocalPackage 字符串值或引用的包,则产品会受到影响。 继续执行步骤 2。
      2. 如果引用的包存在,并且不需要执行其他操作。
  2. 重新创建软件更新缓存注册表详细信息。 为此,请按照下列步骤操作:

    1. 在 %windir%\installer\*.msp 中搜索你尝试安装的软件更新。 验证软件更新在摘要信息Stream中是否具有正确的 Patch 全局唯一标识符 (GUID) ,并面向正确的产品 GUID。

      注意

      由于此目录充当每用户安装和每计算机安装的缓存,因此可以使用每用户安装来模拟此目录中的软件更新。

    2. 创建以下子项: HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Installer\UserData\<SID>\Patches\<PatchSQUID>

      注意

      重新创建软件更新缓存注册表存在安全风险。 但是,这是修复损坏的唯一方法。 可以通过确保软件更新是正确的软件更新来降低安全风险。 为此,请验证软件更新的校验和。

    3. 在创建步骤 2 的注册表子项中创建 LocalPackage 字符串值。 确保 LocalPackage 字符串值设置为软件更新的路径。

  3. 删除剩余的软件更新引用。 要执行此操作,请执行以下步骤:

    1. 打开以下子项,然后从“AllPatches”多 sz 值中删除 <PatchSQUID>HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Installer\UserData\<SID>\Products\<ProductSQUID>\Patches

    2. 删除以下注册表子项: HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Installer\UserData\<SID>\Products\<ProductSQUID>\Patches\<PatchSQUID>

    3. 删除以下注册表子项: HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Installer\UserData\<SID>\Patches\<PatchSQUID>

      注意

      如果缺少此子项,请跳过此步骤。

    4. 如果产品是按计算机安装的,请执行以下步骤:

      1. 打开以下子项: HKEY_LOCAL_MACHINE\Software\Classes\Installer\Products\<ProductSQUID>\Patches

        1. <PatchSQUID>如果存在字符串值,请将其删除。
        2. <PatchSQUID>如果字符串值存在于“Patchs”Multi-sz 值中,请删除该<PatchSQUID>字符串值。
      2. 如果存在以下注册表子项,请将其删除: HKEY_LOCAL_MACHINE\Software\Classes\Installer\Patches\<PatchSQUID>

    5. 如果产品是按用户非托管安装的:

      1. 打开以下注册表子项: HKEY_CURRENT_USER\Software\Microsoft\Installer\Products\<ProductSQUID>\Patches

        1. <PatchSQUID>如果存在字符串值,请将其删除。
        2. <PatchSQUID>如果存在“Patchs”Multi-sz 值中的 ,请将其删除。
      2. 如果存在以下注册表子项,请将其删除: HKEY_CURRENT_USER\Software\Microsoft\Installer\Patches\<PatchSQUID>

    6. 如果产品是按用户托管安装的:

      1. 打开以下注册表子项: HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Installer\Managed\<SID>\Installer\Products\<ProductSQUID>\Patches

        1. <PatchSQUID>如果存在字符串值,请将其删除。
        2. <PatchSQUID>如果存在“Patchs”Multi-sz 值中的 ,请将其删除。
      2. 如果存在以下注册表子项,请将其删除: HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Installer\Managed\<SID>\Installer\Patches\<PatchSQUID>

References

本文并非针对 Windows 更新 或 Microsoft 更新所发生的问题。