为了账号安全,请及时绑定邮箱和手机立即绑定

如何确定导致Windows安装程序重复自我修复的原因?

如何确定导致Windows安装程序重复自我修复的原因?

如何确定导致Windows安装程序重复自我修复的原因?如何仅记录导致InstallShield 2008所做的MSI文件通过“自修复"?自我修复背后的原因是什么?如何禁用使用InstallShield 2008的MSI自修复功能?
查看完整描述

1 回答

?
饮歌长啸

TA贡献1951条经验 获得超3个赞

自我修复,简单而简短的解释如果我删除一个文件,为什么MSI安装程序要重新配置?


可供选择的答案

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


意外的Windows安装程序自修复问题-快速修复?

这篇“文章”越来越大,有些难以读懂。这是一个新写的序言-简短的“变通版本用于修复意外的自修复(常见于VB6、VisualStudio、MS Office、MS Outlook、AutoCAD等)

  • 如果你经历

    意料之外的自我修复你能做的第一件事

    是为了

    手动创建桌面快捷方式

    在问题发生时直接启动应用程序可执行文件。这就绕过了最常见的自修复触发器,“

    宣传的捷径

    如果这有效,你的问题就会“解决”(或避免)。

    这里是一个快速,充实的解释。

  • 如果问题仍然发生,或者您的问题与加载

    办公室Outlook外接程序

    或者类似的(您不能通过快捷方式启动),那么您很可能在您的系统上有一个COM注册冲突,而修复则要复杂得多。这个

    最简单

    尝试就是

    禁用任何加载项

    您不需要在所讨论的应用程序的加载项对话框中查看这是否会使问题消失。
  • 如果您仍然看到问题,那么您通常需要调试

    真正的COM注册冲突

    (或冲突的文件/MIME关联,或命令谓词)。这通常涉及(至少)你的系统上的两个相互冲突的应用程序,它们在每次运行应用程序后,在每次启动时更新注册表(总是启动其中一个应用程序不会触发自修复-当您在应用程序之间交替时,冲突就会出现)。权限问题也可能导致同一个应用程序无法更新系统,并且通过反复运行自修复来不断地尝试。下面还有更多的可能性,更多的细节
    • 实修

      “就是

      与两个应用程序供应商联系

      请他们解决这个问题

      (因为修复通常需要两个供应商MSI的修复),但根据我的经验,这很少成功。尽管试一试吧-因为这是帮助每个人克服长期烦恼的方法!我个人已经为银行部署提供了一个修复程序,并且很高兴在我的包中解决了这个问题。
    • 要调试自己,您需要获得一个打开系统上缓存的msi文件的工具,并且需要“黑”数据库-这是一个非常复杂的任务。

      需要专家技能

      ,如果桌面环境的问题非常严重,建议您寻求安装专家的帮助。它可以工作,但不要期待奇迹。
    • 请参阅下面题为“

      找出扳机或罪魁祸首进行自我修复

      “有关获取查看和修改msi文件的工具的详细信息

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


总体问题:开发人员调试和自修复

Windows安装程序部署技术,它的工作是安装指定的文件和注册表设置,并将它们保存在指定的安装位置,并确保它们是正确的版本-自修复或弹性是实现这一目标的机制。其操作与开发人员冲突,需要动态交换文件进行调试、开发和测试。

因此,许多自修(弹性)只是由试图调试的开发人员他们安装的应用程序和动态的热交换文件。见“公约”第2节一些典型的自修复问题场景“下面介绍了如何处理这个问题。在其他情况下,MSI中的真正设计错误必须纠正或系统管理陷阱这导致自我修复-有时错误源可能很难找到。

我写过关于自我修复的文章在serverFault.com上的回答..略为不同的词系统管理员,现在阅读它,它可能是一个更容易理解的解释,比这个冗长的(为开发人员设计)。在堆栈溢出上还有另一个简短的答案:如果我删除一个文件,为什么MSI安装程序要重新配置?(这可能是最短的,也是最容易理解的)。最后我找到了一篇很好的关于自我修复的文章瓦迪姆·拉普如何修复Windows安装程序的工作..这篇文章很值得一读。

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


自我修复的主要原因

这个详情如下:在该节中“一些典型的自修复问题场景“,但作为快速,预告表-主要原因是:

1.包装不良的公司msi文件或供应商的msi设计缺陷(msi包本身的设计很糟糕,并且出于各种原因意外触发了自修复)

  • 过度或错误地使用

    每个用户文件

    每个用户注册表项

    通常将错误的密钥路径设置到用户配置文件中(而不是HKCU)。有关更多细节,请参见下文第5节(以及这种情况的彩色说明)。
  • 包装干扰

    COM服务器注册错误

    (特别是

    VB6COM文件

    VBA文件和库

    从诸如

    AutoCAD

    来自Autodesk和类似产品)。
    • 两个MSI包从两个不同的位置注册相同的COM文件(ActiveX/OCX),并在每次启动应用程序时进行“自修复战斗”,以保持它们的版本正确注册。
    • 最后一个要启动的应用程序将注册表设置为自己的权限,它将一直持续到其他应用程序启动并执行同样的操作。一旦您在应用程序之间交替使用,问题就会发生。看见

      第7节

      下面是更多的vb/com自修复细节。
  • 组件密钥路径设置为

    空文件夹

    Windows安装程序删除的自修复(触发无休止的删除循环和随后的自修复)
  • ACL锁定

    权限问题(登录用户无法访问密钥文件,Windows安装程序会多次触发修复)。这也可能是由外部进行的acl更改造成的,但通常是由msi本身完成的。
  • 这里有一个serverFault.com工作正在进行中,它描述了常见的msi设计缺陷。

2.从(登录)脚本到标准OS功能、病毒、安全软件等外部原因的干扰,删除了文件或注册表项。

  • 临时档案

    自动删除

    在被MSI包错误地安装到临时文件夹之后
  • 干扰

    从坏

    登录并触发愉快的清理脚本

    清理应用程序

  • 防病毒应用

    阻塞或删除文件或注册表项,使Windows安装程序无法再检测或访问这些文件或注册表项
  • 计算机病毒

    更改或删除文件和注册表设置
  • 过度活跃的计算机修补程序

    用户删除他们不理解的文件和设置

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

  • 广告宣传的msi包

    安装失败(可能会被取消,因为安装时间太长),并不断窃听人。严格地说,这不是自我修复,而是一个被取消的广告中的安装,但结果是一样的:无休止的重新安装。
  • 终端服务器

    并发症。自修复通常在终端服务器上完全禁用。这通常不会导致自修复问题,但是应用程序安装时没有需要的每个用户文件或注册表项,这些文件或注册表项可以通过自我修复的良性使用来添加(请参阅下面的内容)。然后用户文件和用户注册表项就会丢失并出现问题。
  • UAC

    干扰,

    证书验证失败

    产生的其他问题

    窗口设计更改

    ..对于Windows的每一个版本,都会增加这样的安全特性,并且通常会为可靠的部署增加新的障碍
  • 甚至肯定

    Windows更新

    (更新、安全更新、修补程序等)可以对msi包的安全性强制执行方式进行剧烈的更改,从而导致严重的问题行为。
    • 虽然这与msi的创建有关,而不是主要与最终用户的使用有关,但

      Windows更新KB 3004394

      更新Windows检查的方式。

      撤销根证书

      ,破坏InstallShield命令行构建的旧版本(用于数字签名的设置)。到目前为止,很大程度上是一个已解决的问题,但它说明了微软如何不断地改变核心msi功能
    • 以类似的方式

      盾构坠毁

      安装Microsoft更新MS14-037“Internet Explorer版本6、7、8、9、10和11的安全更新”(KB 2962872)
    • 极有问题的变化

      在WindowsInstaller中,安装后出现基本功能

      KB 2918614

      (Vista)。

      突然,简单的msi修复操作需要管理员凭据。

      ..这彻底削弱了msi的一个核心优势:常规用户运行已批准安装的能力。

      临时管理权

      ..在安装该修复程序后,还报告了其他MSI问题。另一个Windows更新程序似乎修复了以下问题:

      KB 3008627

      (后来改为KB 3072630)

关于自我修复

WindowsInstaller旨在安装应用程序的二进制文件、设置和数据文件,并保持它们的安装并确保它们是正确的版本。自我修复是实现这一目标的一种机制。总体概念称为弹性-即,在启动应用程序之前,故障安装会触发自修复。

弹性,或自我修复,是一个WindowsInstaller的基本概念不能关机无论如何都是安全的。人做最不可思议的事有时,例如禁用整个Windows安装程序引擎阻止他们自我修复。显然,绝不能这样做。修复的原因必须找出,问题必须解决,而不是创建新的,或黑客系统。

每次你启动一个广告捷径(本质上是指向Windows安装程序功能而不是直接指向文件的特殊快捷方式),Windows安装程序将通过检查“组件密钥路径“对于您的产品。如果发现不一致,将触发修复以更正不完整的安装。”组件密钥路径“是为MSI中的组件指定的”密钥文件“-每个组件有一个。自修复也可以由实例化COM服务器(或试图)、通过文件扩展名或MIME注册激活文件的人启动,以及其他几种方式。以下是Symantec关于”自修复入口点“主题的综合文章:用入口点启动自我修复和广告功能.

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


找出扳机或罪魁祸首进行自我修复

自我修复的触发装置通常可以在事件查看器进行自我修复的系统。按照以下步骤执行打开事件查看器:

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

或者你也可以这样做:启动 => 快跑.。 => eventvwr.exe只为事件查看者。如果在“开始”菜单中没有看到“运行”,请按温基 + R.

enter image description here

  • 看“

    申请部分

    在事件日志中,您应该可以从带有ID 1001和1004的事件源“MsiInstaller”中找到警告。
  • 在上面的示例屏幕截图中

    产品代码

    显示在红色框中。
  • 为了确定产品代码用于什么产品,您可以

    查找产品名称

    通过这里解释的程序:

    如何找到已安装的MSI安装程序的产品GUID?

  • 如果您真的想深入检查MSI文件的实际内容,您必须掌握一个能够查看MSI文件的工具(

    例如Orca,InstallShield,AdvancedInstaller或类似的

    )。然后打开“LocalPackage”路径列表中列出的包,如在前面的项目点链接到的答案中的屏幕截图所示。
  • 对系统缓存的MSI文件和/或注册表进行实际修改以删除公告的入口点,例如(已公布的)快捷方式、COM注册、文件关联、MIME关联或命令谓词,这是一项专门的工作。这是非常复杂的,不是很好的做法,但这是我所知道的唯一的“最后手段”。
  • 最后,应用程序可以显式调用WindowsInstaller本身来触发共享组件的自修复,例如拼写检查器。据我所知,有几个版本的MicrosoftAccess做到了这一点,而且据我所知,这种行为是无法改变的。

MSI-专家MVP Stefan Krüger有一篇关于同样的自我修复问题的文章。他很关键地讨论了实际事件日志条目以及他们的意思。请阅读那里的实际调试过程。.


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

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

  1. 组件

    关键路径

    设置为空文件夹

    Windows安装程序删除自修复(触发无休止的删除循环和随后的自修复)。通过将文件夹添加到

    CreateFold桌

    相反(

    Wix等效

    )。根据我的经验,这是最常见的情况下,不必要的自我修复。

    非常普遍.

  2. 许多自我修复问题实际上是由试图调试应用程序的开发人员通过动态替换文件,删除文件或重命名它们。或者他们可能会使用清理注册表脚本和/或批处理脚本若要注销和注册COM文件、COM-Interop、GAC文件、文件关联或其他常见的开发人员调试和开发任务,请执行以下操作。

    • 这,这个热交换当应用程序通过广告中的快捷方式启动时,可以触发自修复。

    • 开发人员的顶级提示挣扎着自修复期间应用调试是为了广告捷径,而是直接从Windows Explorer或手动创建的快捷方式启动主EXE。这将绕过最常见的“自修复入口点“-广告捷径..自修复仍然可能是由损坏的com数据、广告中的文件关联和其他一些特殊情况造成的(阅读本赛门铁克文章有关入境点的资料)。

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

  4. 组件键路径指向临时档案这已经被应用程序删除,或者系统最终会通过某种清理机制(也可以是一个清理工具,比如CCleaner)将其删除。这对于临时文件夹本身中的文件来说很常见。这可以通过不安装临时文件,或者将文件放在其他地方并使其永久化来解决。我在世界上经常看到这个错误公司应用程序重新包装如果捕获映像的错误清理导致临时文件的安装,而该临时文件根本不应该包含在包中。通常,它们可能是临时文件,等待重新启动安装到它们想要的、可能是受保护的位置,而重新启动从来没有执行过-这是一个常见的应用程序打包错误。在较小的程度上,我从自动生成的软件包从自动构建系统出来。

  5. 许可问题如果组件的密钥文件安装到调用应用程序的用户无法访问的位置。Windows安装程序可能无法“查看”已安装的文件/密钥路径,或无法将该文件添加到文件夹中。这些问题可以更多异域调试,而且可能不会经常发生。在这个问题上有几个不同的地方:

    • 这方面的一个示例是将文件安装到

      %USERPROFILE%路径

      然后忘记设置HKCU注册表键盘,而将键盘设置为指向%USERPROFILE%文件夹/文件。这通常会产生一个不可访问的硬编码密钥路径,该路径是特定于用户的:

      C:\文档和设置\user 1\桌面

      ..对于其他登录的用户,将找不到此路径,并且自修复将在圈内运行。这里有一个

      彩色插图.

    • 另一个示例是设置为系统帐户不可写文件夹的关键路径。这可能看起来很奇怪,但可能是由于MSI错误地修改了系统ACL条目,或者是由于奇怪的系统管理员安全设置,或者是任何其他非标准的ACL/Security描述符。
  6. 另一类自修复问题出现在终端服务器西德里克斯..整体Windows安装程序服务可能会被锁定,因此任何被调用以添加每个用户数据的自修复都可能失败,从而导致自修复失败,或者更有可能根本不运行。这足以说明为什么不像一些msi文件那样依赖于自修复作为添加用户数据的方法,这样的构造必须替换为从每个机器位置复制的用户文件的应用程序部署或效率较低的用户文件。动态安装每个用户运行一次的Microsoft特性。

  7. VB6应用程序VBA应用,它们是重COM有巨大的潜力COM干扰(COM设置相互覆盖并变得不一致),已知这些设置会引发几个神秘的自修复问题,其中大多数问题都没有得到正确的解释。在启动VisualBasic 6(VB6)或VisualStudio(和许多其他应用程序)时也会发生这种情况。公分母是,当前安装状态中的某些错误触发了自修复,您可以跟踪罪魁祸首产品和部件通过遵循上面一节中概述的步骤,称为“找出扳机或罪魁祸首进行自我修复". 一定要在这里报告你的发现。(我再也不使用VB6或VBA了-你的详细发现可以帮助那些长期困扰别人的人)。

    • 虽然我从未非常详细地调试过这样的vb6问题,但这些问题似乎是由安装的应用程序造成的。

      共同控制VB6COM文件模板

      VBA文件和库

      这与现有的文件、注册表设置和框上的注册相冲突,或者每个用户的注册表项或用户配置文件可能需要为每个用户添加一次(允许自我修复完成一次,并查看问题是否消失)。特别是我在发射时听说过这些神秘的自我修复问题。

      AutoCAD

      (来自Autodesk),

      Visual Basic 6

      ,以及其他一些产品(通常在工具中提供VBA自动化)。
    • 有些应用程序甚至错误地从VB6运行时自行安装零碎,导致这些设置在卸载这些应用程序时被“撕开”。这肯定会导致自修复触发,以修复现在(部分?)坏的VB6运行时。这个问题有几个变体,“Catch all”解决方案可能是VB6运行时的完全卸载和重新安装。

      这里描述了一个非常常见的“特定”问题,涉及几个com注册表项。

      ..它很好地说明了在这个场景中发生了什么。
    • 如果您在启动时遇到意外的自我修复

      VB6AutoCADVisualStudio

      或者其他产品,你可以

      首先,尝试一个解决办法。

      为了防止这些意想不到的自我修复,首先(这不能解决问题,但可能绕过它的症状):

      为什么每次启动visual basic 6时windows安装程序都会启动?

    • 关于VB6风格的最典型的自我修复之一,请参阅我对本主题中的问题的评论:

      为什么我的应用程序会触发另一个应用程序的安装程序?

      (ActiveX控件从磁盘上的两个不同位置注册了两次)。
    • 在我看来“

      一般固定

      -这应该总是有效的-对于VB-com自我修复的问题,是让供应商更新他们的项目,以使用最新的官方和正确安装和共享ActiveX控件/OCX可用,而不是依靠自己的版本安装冗余和注册在错误的地点。
  8. Windows安装程序修复或自修复的一个特例,值得提及的是几年前MicrosoftOffice的问题。自修复会被触发,你会要求插入MicrosoftOffice安装媒体(在那些日子里,CD-ROM或DVD-今天可能是拇指驱动器)。据我所知,这与对内置Windows安装程序标准操作的错误调用有关“ResolveSource“这意外地(并且不必要地)触发了安装媒体的提示。非常常见的支援呼叫回到过去,为了完整起见在这里提到。重要的是要注意这个问题仍然可能发生。每当MS Office从任何可移动介质(而不是更好的选择网络共享)。当MS Office检测到需要进一步安装未安装的产品的可选组件(通常是共享组件)时,就会发生这种情况。例如,不寻常的拼写检查器、各种模板或特定且很少使用的工具。可以将这些组件安装为“在第一次使用时安装”(广告中的特性是正确的Windows安装程序术语)。

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

    • 不良登录脚本

      可以删除系统上的内容并触发自修复。
    • 广告包装可能失败

      安装和继续窃听人
    • 两个应用程序可能会启动

      为同一文件关联而战

    • 电脑,计算机

      修补工

      黑客可以手动删除触发自我修复的数据。
    • 反病毒可以隔离文件和注册表设置

      触发修复
    • 病毒可以改变或删除事物。

      触发自修复
    • 磁盘和注册表清理工具

      例如ccleaner可以删除文件并触发自修复。
    • 毫无疑问还有很多其他情况.。

自我修复的良性用途

终于有了自我修复的良性用途这种情况只发生一次,并不构成错误。这是合法的正确使用自我修复虽然它可能和设计错误一样烦人,但是通过用户的干预,它们可以一次又一次地弹出:

  • 自修复

    有时习惯

    添加每个用户的数据

    香港大学

    用户配置文件

    ..这种设计主要是有效的,但是随着新的部署障碍的出现,每个版本的Windows都会变得更糟。首先,自我修复通常根本不起作用。

    终端服务器

    呈现设置不完整。尽管这是讨论的重点,但最好是将应用程序复制文件复制到每个用户的位置。另一个问题是UAC。每个新的Windows版本都会出现其他问题,甚至上面描述的一些Windows更新(虚拟文件夹重定向、证书提示、以前不存在的目标路径限制等)。
  • 当需要自我修复时

    设置用户数据

    ,可能要花很长时间

    用户中止并继续这样做。

    ..这会导致自我修复一直出现,直到允许完成为止。

    共同的支持电话.

  • 还可以用“

    广告特征

    “设计要安装的”

    按需

    在应用程序使用过程中触发。很少有应用程序使用它,但是当它被使用时,一个冗长的“自修复样式”安装程序可能会运行-拉下所需的文件和设置。

    如果取消此过程,则会回滚该功能的安装,并可再次触发该功能。

    ..这个安装可以是

    慢的

    几个原因:

    • 如果安装程序使用

      大型压缩CAB文件

      首先下载,然后

      提取

      本地的

      慢盘

      在那里

      抗病毒

      开始扫描整个CAB,然后每次提取文件,操作可能需要很长时间。
    • 如果

      网络连接是无线的

      还有

      很多小文件

      下载(

      高延迟

      ),反病毒又会减慢速度。
    • 如果从可移动媒体安装,则可以获得插入源媒体的提示,以允许复制文件。如果在办公环境中使用可移动媒体(不应该使用

      网络共享上的管理安装)

    • 等等.。


查看完整回答
反对 回复 2019-07-17
  • 1 回答
  • 0 关注
  • 628 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信