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

如何比较两个(或更多)MSI文件的内容?

/ 猿问

如何比较两个(或更多)MSI文件的内容?

拉莫斯之舞 2019-06-20 10:27:47

如何比较两个(或更多)MSI文件的内容?

我怎么做“内容比较“其中两个(或更多)MSI文件并查看文件中的实际不同之处-而不是执行无用二进制比较?(这显然只告诉我是否在处理同一个文件的副本)。

一些相关的和典型问题情景:

  • 我们的构建系统会疯狂地释放MSI文件,有时我们需要弄清楚不同的MSI文件之间存在什么差异(读:有变化了,现在我们正在失败部署)。
  • 我们在不同的位置从相同的源编译msi文件,其中一些文件无法运行报告。

    System.BadImageFormatException

    -如何调试MSI文件中的差异?(关于这一错误的答复-特别是在这里:

    应用程序是否依赖于编译它的环境?).

  • msi文件可以用各种工具编译,但对于堆栈溢出用户来说,这些文件可能最常见的是使用

    维克斯

    Visual Studio安装程序项目

    (免费工具包)。


查看完整描述

1 回答

?
慕桂英4014372

About MSI Files

粗略地说MSI文件是结构化存储文件-实质上是文件中的一个文件系统-具有不同内容的流,其中一个是剥离的SQLServer数据库(用我认为最通用的术语)。如果MSI文件是可读的,则可以比较(各种格式和类型的)内容。

科技笔记:可以想象,一个MSI触发一个System.BadImageFormatException只是不能跑(msiexec.exe无法运行),但它可能仍然是可读的-因此具有可比性(请添加注释,以验证这一点,如果您经历过)。

溪流*一些溪流在MSI中有字符串值。也可能有流嵌入式CAB档案用于存储要部署的文件,以及二元含量只-例如Binary table编译和未编译的自定义操作都与安装程序需要的其他二进制内容一起存储的地方。还有一个特别的“摘要流“一个表中的图标以其本地二进制格式存储,列表继续进行.对于大多数表,我们可以比较每个表中的字符串,就像我们比较Word文档中的文本一样(也曾是OLE/com文件-虽然较新的版本现在使用开放Office XML)并得到详细的差异报告。为了做到这一点,您显然需要一个专用工具为了这份工作-一个能够在所有相关的溪流中找到路的人。下面列出了一些商业和免费工具。

二元含量*在详细说明这一点之前,我应该注意,比较Binary TableCabs TableIcon Table-或任何其他二进制表,通常只允许您进行二进制比较(特别是对于已编译的自定义操作DLL和exe文件)。脚本自定义操作-在二进制表中-可以作为文本进行比较,但是编译后的自定义操作仅是二进制比较。因此,如果您的问题来自编译后的自定义操作,则不能在直接比较中真正看到它(您只看到二进制差异)。您需要访问源代码管理系统,以查看用于任何类型的编译自定义操作的代码。-希望你有一个良好的标签实践因此,您可以找到在每个设置中使用的实际源代码。我不使用这种做法,但是对于内部的公司发行版,您甚至可以为编译的自定义操作包括调试构建DLL,并尝试将调试器附加到正在运行的代码中,以真正了解发生了什么?不过,我不会在公开发布时使用调试模式DLL-除非我澄清了任何风险。调试代码可能充斥(意外的)调试消息框(用作附加调试器的入口点)和其他不应击中生产包的问题。

想想看,可以将您的CAB文件和图标文件与它们在旧的(或更新的)MSI文件中的相应版本进行比较,方法是使用以下方法对msi文件进行反编译。dark.exe-下文对此作了说明。然后,使用一个很好的比较工具(下面提到了“比较之外”),您可以对不同MSI版本之间的CAB文件内容做一个完整的区分(其中一些文件可以是文本文件,也可以是文本比较)。我想出租车和图标是一种开放格式的“透明二进制文件”,而不是编译后的二进制文件(包括自定义操作等),它们本身并不是可反编译的或可检查的(除非您知道如何反编译托管二进制文件)。

总结性MSI文件是完全透明的,但编译后的自定义操作除外。这种透明性是msi的核心优势之一。..与以前的部署技术相比,大多数Windows安装程序的好处通常集中在公司部署好处上。不幸的是,开发人员可能只看到MSI的坏方面:(潜在的)msi反模式(目前朝向底部-非常混乱和临时)。诚然,其中一些问题非常严重,违反了“最不吃惊原则”。开发人员-为什么还有其他同样重要的事情要做-可能会让他们莫名其妙地绞尽脑汁。

不过,毫无疑问:MSI有着巨大的企业部署效益(见上面相同的链接,指向底部。). 凝聚:可靠的静默运行,远程管理,回滚,日志,隐式卸载功能,提升权限,标准化命令行,透明性,转换为标准化的设置定制和管理安装,以可靠地提取文件。只是为了快速点出那些大的。此处以列表形式提供福利.

到目前为止已经消化了很多-让我们直截了当地说..什么工具可以用来比较MSI文件?


Commercial Tools

几个商业部署工具比如盾构高级安装程序许多其他MSI工具支持查看和比较MSI文件。也许我添加了太多的链接,但让我使用我通常的策略:“如果你链接到一个链接,你就链接到每个人”-这应该会节省一些时间和一些谷歌搜索。

作为一个特别的注意-一个怀旧的-我所见过的最好的msi-diff功能是在WISE软件包工作室..诚实是头和肩膀之上,总是工作,整洁的颜色编码,只是容易理解。此工具不再出售,如下所述:使用什么安装产品?InstallShield,Wix,Wise,AdvancedInstaller等(如果你有一个包装团队在你的公司,也许他们有一个备用许可证在附近?)


Free Tools

商业工具很好,但也有几种免费的选择这可以用来比较MSI文件-下面是一些MSI文件的列表,以及一些如何使用每个工具的提示(以一种非常简约的方式)。

还有一些更多的细节dark.exe-这根本不是COM结构存储文件的比较工具,而是一种将MSI文件分解为Wix XML源文件并提取所有支持文件(图标、二进制文件、出租车、安装文件)的方法-允许随后将它们与常规的文本/二进制比较工具进行比较。

1. Orca (MSI SDK)

微软的自己MSI SDK工具/查看器虎鲸可以查看MSI文件并编辑它们,但是没有直接支持比较两个MSI文件(据我所知)。我认为您可以导出这些表,然后比较它们,但是其他工具有更多内置特性。之所以提到这个选项,是因为您可能已经安装了Orca,然后这可能是实现简单差异的一种快速方法。“穷人的选择".

您可能已经拥有了安装程序。..如果安装了VisualStudio,请尝试搜索Orca-x86_en-us.msi-低于Program Files (x86)-并安装它。然后在“开始”菜单中找到Orca。从技术上讲,Orca是作为WindowsSDK(大,但免费下载)。如果您没有安装VisualStudio,那么您可能知道有人安装了吗?只要让他们搜索这个MSI,并发送给你(这是一个很小的半毫巴文件)-应该花他们几秒钟。如果没有,可以随时下载WindowsSDK

2. Super Orca (free third party tool)

超级Orca将允许两个MSI文件的基本比较。我的烟雾测试似乎显示,高级领域,如摘要流可能被忽略。换句话说,一个直表只能比较。可能还有其他限制。也许它足够好?它很容易使用。

3. widiffdb.vbs (MSI SDK)

这个MSI SDK有一个VBScript,可以用来查看两个MSI文件之间的差异。它叫做widiffdb.vbs(MSDN)。使用此工具,我可以看到SuperOrca忽略的汇总流差异。任何MSISDK都是权威的。

更新在github.com上的所有MSISDKAPI脚本(实际的VBScript代码)。

  • 加入一个链接到

    这类MSI SDK VBScripts的完整列表

    -为各种目的。别困惑,只是

    widiffdb.vbs

    是比较MSI文件所必需的,但是有许多有用的脚本可用于其他目的。
  • 如果安装了VisualStudio,只需搜索

    widiffdb.vbs

    ..发射

    cscript.exe

    并将完整路径传递到两个MSI文件以比较它们。控制台输出。

用法:

cscript.exe widiffdb.vbs "Setup 1.msi" "Setup 2.msi"

样本输出:

Property Value           [ALLUSERS] {1}->{2}
Property Value           [MSIINSTALLPERUSER] {}->{1}
Property INSERT          [MSIINSTALLPERUSER]
\005SummaryInformation   [9] {{00000000-0000-0000-0000-000000000000}}->{{00000000-0000-0000-0000-000000000001}}
\005SummaryInformation   [12] {28.03.2019 15:20:02}->{28.03.2019 14:40:52}
\005SummaryInformation   [13] {28.03.2019 15:20:02}->{28.03.2019 14:40:52}
\005SummaryInformation   [15] {2}->{10}

要找到脚本,可以在Program Files (x86)如果安装了VisualStudio(它是WindowsSDK的一部分,也将与VisualStudio一起安装)-(当前的路径是:C:\Program Files (x86)\Windows Kits\10\bin\10.0.17763.0\x86-只要适当地替换版本号,就可以更快地找到MSI)。

4. dark.exe (WiX toolkit - open source)

这个Dar.exe二进制Wix工具集(可能用于编译一些MSI文件的工具包)。这,这个dark.exe是MSI文件的“反汇编程序”或“反编译器”。它将msi文件转换为wxsXML格式(首先用于编译MSI文件的Wix自己的格式),以及一些提取的二进制文件(如果使用正确的反编译选项和标志)。

这个wxs源文件可以作为常规文本文件进行比较(我最喜欢的工具是无与伦比,但它是一个商业工具-有大量的文本比较工具-包括那些在VisualStudio)。二进制文件显然可以进行二进制比较。例如,可以将任何提取的CAB文件与来自另一个MSI安装版本的另一个类似的CAB文件进行比较。

下面是一个示例命令行:

dark.exe -x outputfolder MySetup.msi
  • 在许多情况下,这将产生一个非常好的比较MSI文件,您应该能够确定什么是真正不同的。

  • 提取的二进制文件可以是脚本文件(VBScript等.)或任意数量的其他二进制文件(例如,已编译的DLL自定义操作)。在后一种情况下,您无法进一步反编译它-除非它是.NET二进制文件,并且您具有反编译此类二进制文件的专业知识。

  • 但是,应该注意的是,使用完全相同的Wix源文件编译的Wix生成的MSI文件可能因以下几个原因而有所不同:

    • 我没有一个完整的列表,可以将哪些字段设置为在此时自动生成(如果您知道的话,可以在原地点击编辑和修改这个字段)。

    • 上述自动生成的字段也可以进行硬编码(这对包GUID不好,但这是另一个冗长的故事-只要知道,如果您发现两个与同一个包GUID二进制不同的MSI文件,那么您将陷入严重的麻烦-如果它们是野生的-Windows安装程序将它们定义为相同的文件)。软件包代码应该始终是自动生成的。离题。

    • 同样的wix源文件也可以用异类编译器链接器设置,这会以几种不同的方式影响生成的MSI文件。看所有开关,下载并安装Wix只需写candle.exelight.exe进入命令提示符并命中进入.

    • 某些领域,如包GUID产品GUID可以设置为自动生成在WXS文件中。在这种情况下,生成的MSI文件中生成的相应字段将明显不同。

    • MSI文件本身显然有不同的文件日期信息,它们是单独编译的-只是为了说明显而易见的情况。

还有一个特别的注释,它与手头的主题有些无关,但仍然很重要:您可以使用dark.exe解压缩使用Wix烧伤特性编译的可执行文件。这是Wix的引导特性用于依次安装一个或多个MSI和/或EXE文件。这些引导程序是EXE文件,您可以将它们解压到它们的组成MSI和/或EXE文件中:

dark.exe -x outputfolder setup.exe

只需打开命令提示符,cd到setup.exe所在的文件夹。然后指定上述命令。混凝土样本:dark.exe -x outputfolder MySetup.exe..输出文件夹将包含两个子文件夹,其中包含提取的MSI和EXE文件,以及烧伤GUI的清单和资源文件。然后,任何MSI文件都可以像上面所描述的那样进行分解,以生成一个Wix源文件(WXS)。

5. InstEd (free third party tool - with plus version available)

出于某种原因,我从来没有积极使用过这个工具,但是测试了几次。再次测试它,它似乎确实做了比较两个MSI文件的工作,尽管是通过一个奇怪的菜单选项(这让我觉得这个特性以前不起作用)。

  • 打开MSI,然后转到

    Transform => Compare Against...

    并浏览到您想要比较的MSI第一个。
  • 比较似乎是可以的,而且我看到总结流中有一些变化-例如-但是差异似乎并没有显示出什么是不同的(除非我没有看到它)。
  • 若要查看摘要流更改,请在单独的insted实例中打开两个文件,然后转到

    Tables => Summary Info...

    在这两种情况下。现在比较属性表中的信息。或者使用

    widiffdb.vbs

    上面列出的脚本。

6. Other Tools... (COM-structured storage file viewers)

毫无疑问,还有许多其他工具能够查看COM结构的存储文件,但我认为上述选项应该足以满足大多数用户的需要。我将添加一个链接到org的MSI工具列表再来一次。

7. Advanced Installer (commercial tool with some free features)

这个商业工具可以作为查看器运行,并且允许对MSI文件进行一些基本操作,即使没有使用完整的许可证运行。好的一点是,您甚至不需要使用原始表,但是可以使用更好的用户界面来“修复”MSI中的各种内容。例如,各种升级参数(在主要升级卸载失败时继续或失败,等等)。

中的更改表编辑器视图(直起表视图)将在其他“向导视图”中不可见。原因在这里解释。.


链接


查看完整回答
反对 回复 2019-06-20
  • 1 回答
  • 0 关注
  • 81 浏览
我要回答
慕课专栏
更多

添加回答

回复

举报

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