11
  • 如何仅记录导致 Installshield 2008 生成的 MSI 文件通过“自我修复”重新安装的更改?
  • 自我修复背后的原因是什么?
  • 如何使用 Installshield 2008 禁用 MSI 的自我修复?
4

1 回答 1

20

自我修复,简单而简短的说明如果我删除文件,为什么 MSI 安装程序会重新配置?


可用的替代答案

更新有一个更短、更“以解决方案为重点”的答案可用,也许先试试。此答案侧重于“了解自我修复”,而不是解释为消除问题而采取的步骤。您可能还想阅读此答案的第一部分。


意外的 Windows Installer 自我修复问题 - 快速修复?

这篇“文章”变得很大,有些难以阅读。这是一个新编写的序言 -用于修复意外自我修复的简短“解决方法版本”(通常在 VB6、Visual Studio、MS Office、MS Outlook、AutoCAD 等中找到)

  • 如果您遇到意外的自我修复您可以尝试的第一件事手动创建桌面快捷方式,直接指向问题发生时您正在启动的应用程序可执行文件。这绕过了最常见的自我修复触发器,“广告捷径”。如果这有效,您的问题将被“解决”(或避免)。这是一个快速,充实的解释
  • 如果问题仍然存在,或者您的问题与加载MS OfficeMS Outlook 加载项或类似(您无法通过快捷方式启动)有关,那么您的系统很可能存在 COM 注册冲突,并且修复涉及更多。最简单的尝试是在相关应用程序的插件对话框中禁用您不需要的任何插件,看看这是否会使问题消失
  • 如果您仍然看到问题,那么您通常需要调试真正的 COM 注册冲突(或冲突的文件/MIME 关联或命令动词)。这通常涉及(至少)您系统上的两个冲突应用程序,它们在另一个应用程序运行后在每次启动时更新注册表(始终启动其中一个应用程序不会触发自我修复 - 当冲突浮出水面时)您在应用程序之间交替)。也有可能是权限问题导致同一个应用程序更新系统失败,并且通过反复运行自我修复不断尝试。还有更多的可能性,下面有更多细节
    • 真正的修复”是联系两个应用程序供应商要求他们修复问题(因为修复通常需要修复两个供应商的 MSI),但根据我的经验,这很少成功。不过请尝试一下 - 因为这是帮助每个人解决长期烦恼的方法!我亲自为银行部署提供了一个带有修复程序的设置,并且很高兴在我的包中解决了这个问题
    • 要调试自己,您需要获得一个工具来打开系统上缓存的 MSI 文件,并且您需要“破解”数据库 - 这是一项非常复杂的任务,需要专家技能,如果出现以下情况,建议您寻求安装专家的帮助对于您的桌面环境,这个问题非常严重。它可以工作,但不要指望奇迹。
    • 有关获取查看和修改 MSI 文件的工具的更多详细信息,请参阅下面名为“寻找自我修复的触发因素或罪魁祸首”的部分

“文章”的其余部分深入描述了自我修复问题。除了本“简短”部分中描述的内容外,还有许多其他潜在的自我修复原因。


整体问题:开发者调试和自我修复

Windows Installer是一种部署技术,它的工作是安装指定的文件和注册表设置,并将它们保存在指定的安装位置,并确保它们是正确的版本——自我修复或弹性是为此目的的一种机制。它的操作与开发人员冲突,需要在运行中交换文件以进行调试、开发和测试。

因此,许多自我修复(弹性)仅由开发人员尝试调试已安装的应用程序和动态热交换文件触发。有关如何处理此问题,请参见下文“一些典型的自修复问题场景”中的第 2 节。在其他情况下,MSI中存在必须纠正的真正设计错误或导致自我修复的系统管理缺陷- 有时很难找到错误源。

我在 serverfault.com 上的回答中写过关于自我修复的问题。用于系统管理员的单词略有不同,现在阅读它可能比这个长篇(面向开发人员)更易于理解。stackoverflow 上还有另一个更简短的答案:如果我删除文件,为什么 MSI 安装程序会重新配置?(这可能是最短且最容易理解的)。最后,我找到了Vadim Rapp的一篇关于自我修复的非常好的文章:如何修复 Windows 安装程序的自我修复工作。这篇文章很值得一读。

如果 Windows Installer 确定正在启动的产品已正确安装,则不会发生自我修复。当发生自我修复时,需要在系统上进行一些更改才能使应用程序正常运行。


自我修复的主要原因

下面的“一些典型的自我修复问题场景”部分提供了详细信息,但作为一个快速的铺垫列表- 主要原因是:

1. 企业微星文件封装不良或供应商微星设计缺陷(微星封装本身设计不良,因各种原因意外触发自修复)

  • 过度或错误地使用每用户文件每用户注册表项,通常在用户配置文件(而不是 HKCU)中设置了错误的密钥路径。有关详细信息,请参阅下面的第 5 节(以及这种情况的彩色插图)
  • 来自错误 COM 服务器注册的程序包干扰(尤其是来自 Autodesk 的AutoCAD和类似产品 等产品的VB6 COM 文件VBA 文件和库)。
    • 两个 MSI 包从两个不同的位置注册相同的 COM 文件 (ActiveX/OCX),并在每次应用程序启动时“自我修复”以保持其版本正确注册。
    • 最后一个启动的应用程序为自己设置了注册表,它会持续到另一个应用程序启动并执行相同的操作。一旦您在应用程序之间切换,就会出现问题。有关更多 VB/COM 自我修复的详细信息,请参阅下面的第 7 节
  • 组件密钥路径设置为 Windows 安装程序在自我修复时删除的空文件夹(触发无限循环的删除和随后的自我修复)
  • ACL 锁定权限问题(登录用户无法访问密钥文件并且 Windows Installer 反复触发修复)。这也可能是由外部完成的 ACL 更改引起的,但通常由 MSI 本身完成
  • 这是一个 serverfault.com 正在进行的工作,描述了常见的 MSI 设计缺陷

2. 文件或注册表项因外部原因的干扰而被删除,从(登录)脚本到标准操作系统功能、病毒、安全软件等……

  • 临时文件被MSI 软件包错误安装到临时文件夹后,Windows会自动删除这些文件
  • 来自错误登录的干扰- 并触发快乐的清理脚本清理应用程序
  • 防病毒应用程序阻止或删除文件或注册表项,使 Windows Installer 无法再检测或访问它们
  • 计算机病毒更改或删除文件和注册表设置
  • 过度活跃的计算机修补程序和用户删除他们不理解的文件和设置

3. 导致有缺陷或有问题的部署的 Windows 设计更改、缺陷或限制

  • AD 宣传的 MSI 软件包无法安装(可能会因为安装时间过长而被取消)并不断骚扰人们。严格来说,这不是自我修复,而是广告安装被中止,但结果是一样的:无休止的重新安装
  • 终端服务器并发症。终端服务器上通常完全禁用自我修复。这通常不会导致自我修复问题,但应用程序安装时没有所需的每个用户文件或注册表项,可以通过良性使用自我修复来添加(阅读下文)。然后,用户文件和用户注册表项丢失并导致问题
  • Windows 设计更改导致的UAC干扰、证书验证失败和其他问题。对于每个版本的 Windows 都添加了此类安全功能,通常最终会为可靠部署增加新的障碍
  • 甚至某些Windows 更新(更新、安全更新、修补程序等)也可以对 MSI 包的安全实施方式进行重大更改,从而导致严重的问题行为
    • 尽管这与 MSI 的创建有关,而不是主要与最终用户的使用有关, 但更新了 Windows 检查已撤销根证书的方式的Windows 更新 KB3004394破坏了 Installshield 命令行构建的旧版本(用于数字签名的设置)。现在基本上是一个已解决的问题,但说明了 Microsoft 如何不断更改核心 MSI 功能
    • 许多用户在安装 Microsoft 更新 MS14-037“Internet Explorer 版本 6、7、8、9、10 和 11 的安全更新”(KB2962872) 后以类似的方式崩溃
    • 安装kb2918614 (Vista)后,Windows Installer 基本功能发生了一个非常有问题的更改。突然,一个简单的 MSI 修复操作需要管理员凭据。这完全破坏了 MSI 的核心优势:普通用户能够以临时管理员权限运行已批准的安装。安装该修复程序后,还报告了其他 MSI 问题。似乎另一个 Windows 更新修复了这些问题:kb3008627(后来被 kb3072630 取代)

关于自我修复

Windows Installer 旨在安装应用程序的二进制文件、设置和数据文件并保持它们的安装并确保它们是正确的版本。自我修复是为此目的的一种机制。整体概念称为弹性- 即损坏的安装会在应用程序启动之前触发自我修复。

弹性或自我修复是Windows Installer 的内置主要概念,不能任何安全的方式关闭。人们有时会做最不可思议的事情,例如禁用整个 Windows Installer 引擎以停止他们的自我修复。这显然绝不能做。必须确定修复的原因,并解决问题,而不是创建新问题或入侵系统。

每次您启动广告的快捷方式(本质上是指向 Windows Installer 功能而不是直接指向文件的特殊快捷方式)时,Windows Installer 将通过检查您的产品的“组件密钥路径”来验证安装。如果发现差异,则会触发修复以纠正不完整的安装。“组件密钥路径”是为 MSI 中的组件指定的“密钥文件”——每个组件都有一个。自我修复也可以通过实例化 COM 服务器(或尝试)、通过文件扩展名或 MIME 注册激活文件以及其他一些方式来启动。以下是赛门铁克关于“自我修复入口点”主题的综合文章:使用入口点启动自我修复和广告功能

如果文件被删除、移动或简单地覆盖(由用户手动或以某种方式自动),则可能会导致自我修复(如果文件或注册表设置未设置为密钥路径,则不会触发自我修复)。


寻找自我修复的触发器或罪魁祸首

自修复的触发器通常可以在发生自修复的系统上的事件查看器中找到。按照以下步骤打开事件查看器

  • 右键单击“我的电脑”
  • 点击管理
  • 如果收到 UAC 提示,请单击继续
  • 转到事件查看器部分,然后检查 Windows 日志

或者,您可以执行以下操作:开始=>运行... => eventvwr.exe仅用于事件查看器。如果您在开始菜单中没有看到运行,请按WINKEY+ R

在此处输入图像描述

  • 查看事件日志的“应用程序部分”,您应该会发现来自 ID 为 1001 和 1004 的事件源“MsiInstaller”的警告
  • 在上面的示例屏幕截图中,产品代码显示在红色框内
  • 为了确定产品代码用于什么产品,您可以通过此处说明的过程查找产品名称如何找到已安装 MSI 设置的产品 G​​UID?
  • 如果您真的想深入检查 MSI 文件的实际内容,您必须掌握一个能够查看 MSI 文件的工具(例如 Orca、Installshield、Advanced Installer 或类似工具)。然后,您打开“LocalPackage”路径列表中列出的包,如上一个要点链接的答案中的屏幕截图所示。
  • 实际修改系统缓存的 MSI 文件和/或注册表以删除广告的入口点,例如(广告的)快捷方式、COM 注册、文件关联、MIME 关联或命令动词,是一项专家工作。这是非常复杂的做法,不是很好的做法,但它是我所知道的唯一“最后的手段”。
  • 最后,应用程序可以显式调用 Windows Installer 本身来触发共享组件的自我修复 - 例如拼写检查器。我相信一些版本的 Microsoft Access 做到了这一点,据我所知,这种行为无法改变或解决。

MSI 专家MVP Stefan Krüger有一篇关于相同自我修复问题的文章。他批判性地讨论了实际的事件日志条目及其含义。请阅读那里的实际调试过程


一些典型的自修复问题场景:

这是上面概述中已经概述的几个自我修复问题场景的“详细解释”。

  1. 组件密钥路径设置为一个空文件夹,Windows 安装程序会在自行修复时删除该文件夹(触发无限循环的删除和后续的自我修复)。这可以通过将文件夹添加到CreateFolder 表来解决(Wix 等效项)。以我的经验,这是不需要的自我修复最常见的情况。很常见
  2. 许多自我修复问题实际上是由开发人员试图通过动态替换文件、删除文件或重命名来调试他们的应用程序引起的。或者他们可以使用清理注册表脚本和/或批处理脚本来注销和注册 COM 文件、COM-Interop、GAC 文件、文件关联或其他常见的开发人员调试和开发任务。

    • 当应用程序通过宣传的快捷方式启动时,这种热插拔可以触发自我修复。

    • 对于在应用程序调试期间难以进行自我修复的开发人员来说,一个重要提示不要宣传的快捷方式启动应用程序,而是直接从 Windows 资源管理器或手动创建的快捷方式启动主 EXE。这将绕过最常见的“自我修复入口点”——宣传的捷径。自我修复仍可能由损坏的 COM 数据、公布的文件关联和其他一些特殊情况导致(请阅读此 Symantec 文章以获取入口点信息)。

  3. 其他应用程序或更确切地说是其他 MSI 程序包可能会通过干扰注册表数据(通常是 COM 设置,但也与其他设置和文件)来破坏您的安装并导致自我修复。这些可能是最难解决的一些情况,因为应用程序基本上都在与之抗争,而最后一个运行的应用程序每次都会更新注册表。通常,必须重新设计两个 MSI 文件才能使应用程序在同一台机器上运行。或者,按照当天的顺序,整个应用程序可能会被虚拟化(例如:Microsoft App-V 虚拟包)并在其自己的沙箱中运行,这似乎是当今公司越来越多的做法。这种错误场景经常出现在一套在企业环境中重新打包的应用程序很糟糕。来自不同包的 COM 片段会覆盖来自另一个包的 COM 服务器的磁盘路径,并且每次应用程序启动时都会通过广告快捷方式进行自我修复战斗。不同文件版本的相同文件名也可以从不同的文件位置注册,并共享一些干扰的注册表设置。据我回忆,文件系统和注册表中至少有 7 个变量或设置必须同步,COM 服务器才能正确实例化。有关VB6VBA COM 应用程序上下文中 COM 干扰的更专业描述,请参见下面的第 7 节。

  4. 组件密钥路径指向一个临时文件,该文件已被应用程序删除,或者最终会被系统通过某种清理机制(也可以是清理工具,如 ccleaner)删除。这对于临时文件夹本身中的文件很常见。这可以通过不安装临时文件或将文件放在其他地方并使其永久化来解决。我在企业应用程序重新打包的世界中最常看到这个错误其中捕获的图像的错误清理会导致安装一个根本不应该包含在包中的临时文件。通常,它们可能是等待重新启动以将其安装到其预期的、可能受保护的位置的临时文件,并且从未执行过重新启动——这是一个常见的应用程序打包错误。在较小程度上,我在来自自动构建系统的自动生成的包中看到了它。

  5. 权限问题:如果组件的密钥文件安装到调用应用程序的用户无法访问的位置。Windows Installer 可能无法“看到”已安装的文件/密钥路径,或者无法将文件添加到文件夹中。这些问题可能更难以调试,并且可能不会经常发生。这个问题有几种变化:

    • 例如,当您将文件安装到%USERPROFILE% 路径,然后忘记设置 HKCU 注册表键路径,而是将键路径设置为指向 %USERPROFILE% 文件夹/文件时。这通常会产生用户特定的不可访问的硬编码密钥路径:C:\Documents and settings\user1\Desktop。其他用户登录将找不到此路径,自修复循环运行。这是一个彩色插图
    • 另一个示例是设置为系统帐户不可写的文件夹的关键路径。这可能看起来很奇怪,但可能是由于 MSI 对系统 ACL 条目的错误修改、奇怪的系统管理员安全设置或任何其他非标准 ACL/安全描述符造成的。
  6. 与终端服务器Citrix有关的另一类自我修复问题出现了。整个Windows 安装程序服务可能会被锁定,因此为添加每个用户数据而调用的任何自我修复都可能会失败,因此自我修复可能会失败或更可能根本不运行。这足以说明不要像某些 MSI 文件那样依赖自我修复作为添加用户数据的一种方式,并且必须用从每台计算机位置复制的用户文件的应用程序部署或Microsoft的不太有效的ActiveSetup功能来替换此类构造每个用户运行一次。

  7. 众所周知, VB6 应用程序VBA 应用程序基于 COM 的大量COM 干扰(COM 设置相互覆盖并变得不一致),它们会引发几个神秘的自我修复问题,其中大部分都没有得到适当的解释。这也可能在启动 Visual Basic 6 (VB6) 或 Visual Studio(以及许多其他应用程序)时发生。共同点是当前安装状态中的一些错误触发了自修复,您可以按照上面“查找自修复的触发器或罪魁祸首”一节中概述的步骤来追踪罪魁祸首产品和组件.请务必在此处报告您的发现(我不再使用 VB6 或 VBA - 您的详细发现可以帮助其他长期烦恼的人)。

    • 尽管我从未详细调试过此类 VB6 问题,但问题似乎是由于安装了通用控件VB6 COM 文件模板VBA 文件以及与框上现有文件和注册表设置和注册冲突的库的应用程序造成的,或者某些每个用户的注册表项或用户配置文件可能需要为每个用户添加一次(允许自我修复完成一次,看看问题是否消失)。特别是我在启动AutoCAD(来自 Autodesk)、Visual Basic 6和其他几个产品(通常在工具中提供 VBA 自动化)时听说过这些神秘的自我修复问题。
    • 一些应用程序甚至错误地自行安装了 VB6 运行时的零碎部分,导致这些设置在卸载这些应用程序时被“删除”。这肯定会导致触发自我修复以修复现在(部分?)损坏的 VB6 运行时。这个问题有几个变种,“包罗万象”的解决方案可能是完全卸载并重新安装 VB6 运行时。下面是一个涉及几个 COM 注册表项的非常常见的“特定”问题的描述。它很好地说明了在这种情况下会发生什么。
    • 如果您在启动VB6AutoCADVisual Studio或其他产品时遇到意外的自我修复,您可以先尝试一种解决方法,以防止这些意外的自我修复发生在第一时间(这不能解决问题,但可能会绕过它的症状):为什么每次我启动Visual Basic 6时Windows Installer都会启动
    • 有关最典型的 VB6 样式自我修复之一,请参阅我对本主题中问题的评论:为什么我的应用程序会触发另一个应用程序的安装程序?(ActiveX 控件从磁盘上的两个不同位置注册了两次)。
    • 在我看来,对于 VB-COM 自我修复问题,应该始终有效的“一般修复”是让供应商更新他们有问题的项目,以使用最新的官方并正确安装和共享可用的 ActiveX 控件/OCX,并且不要依赖自己的版本冗余安装并在错误的位置注册。
  8. Windows Installer 修复或自我修复的一个特殊情况值得一提的是,几年前 Microsoft Office 的问题会触发自我修复,并且会要求您插入 Microsoft Office 安装介质(在那些日子 CD-ROM 或 DVD - 今天可能是拇指驱动器)。据我回忆,这与对内置 Windows Installer 标准操作“ ResolveSource ”的错误调用有关,该操作意外(且不必要地)触发了安装媒体的提示。当天非常常见的支持电话回电,并在此处提及以确保完整性。需要注意的是,这个问题仍然可能发生每当从任何可移动媒体(而不是网络共享的更好选择)安装 MS Office 时。当 MS Office 检测到它需要安装最初未安装的产品的更多可选(通常是共享的)组件时,就会发生这种情况。例如不寻常的拼写检查器、各种模板或特定且很少使用的工具。可以将这些组件安装为“首次使用时安装”(宣传的功能是正确的 Windows Installer 术语)。

  9. 还有许多其他可能的情况。举几个例子:

    • 错误的登录脚本可能会删除系统上的内容并触发自我修复
    • 广告宣传的软件包可能无法安装并不断骚扰人们
    • 两个应用程序可能会开始争夺相同的文件关联
    • 计算机修补匠和黑客可以手动删除触发自我修复的数据
    • 防病毒软件可以隔离触发修复的文件和注册表设置
    • 病毒可以更改或删除事物并触发自我修复
    • ccleaner等磁盘和注册表清理工具可以删除文件并触发自我修复
    • 毫无疑问还有许多其他场景......

良性用于自我修复

最后,自我修复有良性用途,发生一次且不构成错误。这是自我修复的合法和正确使用,尽管它可能与设计错误一样令人讨厌,并且通过用户干预,它们可以一次又一次地弹出:

  • 自我修复有时用于将每个用户的数据添加HKCU用户配置文件。这种设计主要是可行的,但随着新的部署障碍的出现,每个版本的 Windows 都会变得更糟。一方面,自我修复通常在终端服务器上根本不起作用,从而导致设置不完整。尽管这不是本次讨论的重点,但最好让应用程序将文件复制到每个用户的位置。另一个问题是 UAC。其他问题出现在每个新的 Windows 版本中,甚至如上所述的某些 Windows 更新(虚拟文件夹重定向、证书提示、以前不存在的目标路径限制等)。
  • 当需要自我修复来设置用户数据时,用户可能需要很长时间才能中止它并继续这样做。这会导致自修复一直重新出现,直到它被允许完成。一个常见的支持电话
  • 还可以安装具有“广告功能”的产品,这些功能旨在在应用程序使用期间触发“按需”安装。很少有应用程序使用它,但是当使用它时,可能会运行冗长的“自我修复式”安装程序 - 拉下所需的文件和设置。如果取消此过程,则该功能的安装将回滚并且可以再次触发。由于以下几个原因,此安装可能会很
    • 如果安装程序使用大型压缩 CAB 文件,这些文件首先下载然后在本地解压到慢速磁盘上,在该磁盘上,防病毒软件开始扫描整个 cab,然后每个解压文件的操作可能需要很长时间。
    • 如果网络连接是无线的并且有很多小文件要下载(高延迟),操作也可能很慢,而且防病毒软件可能会减慢速度。
    • 如果从可移动媒体安装,您可能会收到插入源媒体以允许复制文件的提示。如果在办公环境中使用可移动媒体,一个非常常见的支持电话(不应该 -在网络共享上使用管理员安装
    • ETC...
于 2011-05-20T00:21:58.287 回答