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

标签 wix windows-installer advanced-installer orca

如何对两个(或多个)MSI文件进行“内容比较”,并查看文件内部的实际区别-而不是进行无用的二进制比较? (显然,这只会告诉我是否要处理同一文件的副本)。

一些相关的典型问题场景:


我们的构建系统疯狂地吐出了MSI文件,有时我们需要弄清楚不同MSI文件之间存在哪些区别(阅读:有所更改,现在我们部署失败)。
我们从不同位置的相同源编译了MSI文件,其中一些文件无法运行报告System.BadImageFormatException-我们如何调试MSI文件中的差异? (在此处专门针对此错误的答案:Are applications dependent on the environment where it was compiled?)。
MSI文件可以使用各种工具进行编译,但是对于stackoverflow用户而言,此类文件可能最常使用WiXVisual Studio Installer Projects(免费工具包)创建。




这是关于比较已编译的MSI文件以确定存在哪些实际“内容差异”的主题的Q / A风格问题。

最佳答案

Microsoft Orca:如果已安装Visual Studio,请尝试在Orca-x86_en-us.msi下搜索Program Files (x86)-并进行安装。然后在开始菜单中找到Orca。


当前路径:C:\Program Files (x86)\Windows Kits\10\bin\10.0.17763.0\x86
适当更改版本号





About MSI Files

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

技术说明:可以想象,触发System.BadImageFormatException的MSI只是不可运行的(msiexec.exe无法运行它),但它仍然可以读取-因此具有可比性(请添加注释以验证此信息,如果您体验一下)。

流:MSI中的某些流是带有字符串值的表。可能还会有用于嵌入式cab归档的流,这些流用于存储要部署的文件,并且表仅具有二进制内容-例如Binary table,其中已编译和未编译的自定义操作都与设置所需的其他二进制内容一起存储。并且有一个特殊的“摘要流”和一个带有以其本机二进制格式存储的图标的表,该列表一直存在...对于大多数表,我们可以像比较文本中的文本一样比较每个表中的字符串。 Word文档(also used to be OLE / COM files-尽管较新的版本现在使用Open Office XML),并获得差异的详细报告。为此,您显然需要一种特殊用途的工具-能够通过所有相关流找到自己的方式的工具。下面列出了一些用于此目的的商业和免费工具。

二进制内容:在进行详细说明之前,我应注意比较Binary TableCabs TableIcon Table-或任何其他二进制表中的内容,通常只允许您进行二进制比较(特别是对于编译的自定义操作dll和exe文件)。脚本自定义操作-在二进制表中-可以作为文本进行比较,但是编译后的自定义操作仅是二进制比较。因此,如果您的问题源于已编译的自定义操作,则您无法真正在直接比较中看到它(仅看到二进制差异)。您需要访问源代码管理系统以查看用于任何形式的已编译自定义操作的代码是什么-希望您有良好的标签习惯,以便可以找到每种设置中使用的实际源代码。我不使用这种做法,但是对于内部公司发行版,您甚至可以为已编译的自定义操作包括debug-build dll,并尝试将调试器附加到正在运行的代码中,以真正了解正在发生的情况?不过,我不会在公共发行版中使用调试模式的dll-除非我明确了任何风险。调试代码可能充满(意外的)调试消息框(用作附加调试器的入口点)和其他永远不会影响生产包的问题。

想到这一点,通过使用dark.exe反编译MSI文件的技术,绝对可以将您的cab文件和图标文件与旧(或更新)MSI文件中的对应版本进行比较-如下所述。然后,使用一个好的比较工具(下面将提到“超越比较”),您可以对不同MSI版本之间的cab文件内容进行完全比较(某些文件可以是文本文件,可以是文本比较文件)。我猜出租车和图标是开放格式的“透明二进制”,而不是编译后的二进制文件(带有自定义操作等),而编译后的二进制文件本身并不是可反编译或检查的(除非您知道如何反编译托管二进制文件)。

结论:MSI文件是完全透明的,除了已编译的自定义操作。 This transparency is one of the core benefits of MSI。与以前的部署技术相比,大多数Windows Installer收益通常都围绕公司部署收益。不幸的是,开发人员可能只看到MSI的不利方面:the (potential) MSI anti-patterns(朝下-暂时非常混乱和临时)。诚然,其中一些问题非常严重,违反了“最小惊讶原则”。坦率地说,开发人员-为什么要做其他同样重要的事情-可能会坦率地被怀疑。

毫无疑问,MSI具有巨大的企业部署优势(see same link as above, towards bottom)。压缩:可靠的静默运行,远程管理,回滚,日志记录,隐式卸载功能,提升的权限,标准化的命令行,透明性,用于标准化安装程序自定义的转换以及用于可靠地提取文件的管理员安装。只是为了快速列出大公司。 Benefits in list form here

到目前为止,还有很多题外话。哪些工具可以用来比较MSI文件?



Commercial Tools

诸如InstallshieldAdvanced Installermany other MSI tools之类的几种商业部署工具都支持查看和比较MSI文件。也许我添加了太多的链接,但是让我使用我惯常的策略“如果您链接到一个链接,您就链接到了每个人” –这样可以节省一些时间和一些Google搜索。

作为特别说明-怀旧的-我见过的最好的MSI-diff功能是在Wise Package Studio中。老实说,这比其他人高出头头-始终有效,用彩色编码整齐,易于理解。此工具不再按以下说明出售:What installation product to use? InstallShield, WiX, Wise, Advanced Installer, etc(如果公司中有包装团队,也许他们周围有备用许可证?)。



Free Tools

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

dark.exe添加了更多详细信息-根本不是用于COM结构存储文件的比较工具,而是一种将MSI文件反编译为WiX XML源文件并提取所有支持文件(图标,二进制文件,驱动程序,设置文件)-之后可以将它们与常规文本/二进制比较工具进行比较。

1. Orca (MSI SDK)

Microsoft自己的名为Orca的MSI SDK工具/查看器可以查看MSI文件并进行编辑,但没有直接支持比较两个MSI文件(据我所知)。我想您可以导出表然后进行比较,但是其他工具具有更多内置功能。提到此选项是因为您可能已经安装了Orca,然后这可能是完成简单差异的一种快速方法。 “穷人的选择”。

您可能已经有了安装程序。如果已安装Visual Studio,请尝试在Orca-x86_en-us.msi下搜索Program Files (x86)-并进行安装。然后在开始菜单中找到Orca。从技术上讲,Orca是the Windows SDK的一部分安装的(大型,但免费下载)。如果您没有安装Visual Studio,也许您认识这样做的人?只是让他们搜索此MSI并将其发送给您(这是一个很小的mb文件)-应该花费他们几秒钟。如果没有,您可以随时下载Windows SDK

2. Super Orca (free third party tool)

Super Orca将允许对两个MSI文件进行基本比较。我的冒烟测试似乎表明,可以忽略诸如“摘要流”之类的高级字段。换句话说,一个直线表只是比较。可能还有其他限制。也许足够好?它很容易使用。

注意:我无法确定是否可以验证,但是我相信此工具可以保存我的MSI,而不会发出警告。当时那是非常不可取的。

3. widiffdb.vbs (MSI SDK)

MSI SDK具有一个VBScript,可用于查看两个MSI文件之间的差异。它称为widiffdb.vbsmsdn)。使用此工具,我可以看到Super Orca忽略的摘要流差异。任何MSI SDK都是权威的。


更新:All MSI SDK API scripts on github.com(实际的VBScript代码)。



出于各种目的,添加到the full list of such MSI SDK VBScripts的链接。不要混淆,只需要widiffdb.vbs来比较MSI文件,但是有许多有用的脚本可用于其他目的。
如果已安装Visual Studio,则只需搜索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}


要查找该脚本,如果已安装Visual Studio(它是Windows SDK的一部分,它将与Visual Studio一起安装),则可以在Program Files (x86)下进行搜索-(当前路径为:C:\Program Files (x86)\Windows Kits\10\bin\10.0.17763.0\x86-仅适当地替换版本号,您应该更快地找到MSI)。

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

dark.exe中的the WiX toolset二进制文件(一种可能用于编译某些MSI文件的工具包)。此dark.exe是MSI文件的“反汇编程序”或“反编译程序”。它将把MSI文件转换为wxs XML格式(首先是WiX自己的格式,用于编译MSI文件),以及许多提取的二进制文件(如果使用正确的反编译选项和标志)。

可以将wxs源文件作为常规文本源文件进行比较(我最喜欢的工具是Beyond Compare,但这是一种商业工具-有很多文本比较工具-包括Visual Studio中的那些工具)。二进制文件显然可以进行二进制比较。例如,可以将任何提取的CAB文件与另一个MSI设置版本中的另一个类似cab文件进行比较。

这是一个示例命令行:

dark.exe -x outputfolder MySetup.msi



在许多情况下,这将对MSI文件进行很好的比较,您应该能够确定真正不同的地方。
提取的二进制文件可以是脚本文件(VBScript等),也可以是任意数量的其他二进制文件(例如,编译的DLL自定义操作)。在后一种情况下,您无法真正对其进行进一步的反编译-除非它是.NET二进制文件,并且您具有反编译此类二进制文件的专业知识。
但是,应注意的是,使用完全相同的WiX源文件编译的WiX生成的MSI文件可能有所不同,原因有两个:


相同的WiX源文件也可以使用不同的compilerlinker设置进行编译,这可能会以几种不同的方式影响生成的MSI文件。要查看所有开关,请download and install WiX并将candle.exelight.exe写入命令提示符,然后按Enter。
可以将某些字段(如软件包GUID和产品GUID)设置为在wxs文件中自动生成。在这种情况下,生成的MSI文件中相应的结果字段显然对于每个构建都是不同的。


我目前还没有完整的字段列表,可以设置哪些字段可以自动生成(如果您知道的话,可以点击“ Edit”(编辑)并就地进行修改)。
提到的自动生成的字段也可以进行硬编码(这对于GUID包不好,但这是另一个漫长的故事-只要知道如果您发现两个MSI文件在同一GUID包中是二进制不同的,则您遇到了严重的麻烦-如果它们在野外-Windows Installer会按照定义将它们视为同一文件)。包裹代码应始终自动生成。离题。

MSI文件本身显然具有不同的文件日期信息,这些信息已分别编译-只是为了说明。



还有一条与当前主题无关的特别注释,但仍然很重要:您可以使用dark.exe来反编译使用WiX的Burn功能编译的可执行文件。这是WiX的引导程序功能,用于按顺序依次安装一个或多个MSI和/或EXE文件-一个接一个。这些引导程序是EXE文件,您可以将它们解压缩为组成的MSI和/或EXE文件:

dark.exe -x outputfolder setup.exe


只需打开命令提示符,CD到setup.exe所在的文件夹即可。然后指定上面的命令。具体样本:dark.exe -x outputfolder MySetup.exe。输出文件夹将包含几个子文件夹,其中包含提取的MSI和EXE文件以及Burn GUI的清单和资源文件。然后,可以如上所述分解任何MSI文件,以生成WiX源文件(wxs)。

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

由于某种原因,我从未积极使用过该工具,而是对其进行了多次测试。再次测试它似乎确实可以比较两个MSI文件,尽管它来自一个奇怪的菜单选项(这使我认为该功能以前不起作用)。


打开一个MSI,然后转到Transform => Compare Against...并浏览到要与第一个MSI比较的MSI。
比较似乎可以,并且例如,我看到摘要流中有更改,但是diff似乎没有显示出不同之处(除非我只是看不到它)。
要查看摘要流的变化,请在单独的InstEd实例中打开两个文件,然后在两个实例中都转到Tables => Summary Info...。现在比较属性表中的信息。或者,使用上面列出的widiffdb.vbs脚本。


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

毫无疑问,还有许多其他工具可以查看COM结构的存储文件,但是我认为上述选项对于大多数用户来说就足够了。我将再次添加一个指向installsite.org's list of MSI tools的链接。

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

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

在“表编辑器”视图(直接表视图)中所做的更改在其他“向导视图”中不可见。 The reason for this is explained here



链接


The same (similar) information written for system administrators

关于wix - 如何比较两个(或多个)MSI文件的内容?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48482545/

相关文章:

xml - Wix 安装路径注册表值分配 - 有什么问题?

wix - 如何从 WIX 搜索具有值(未设置值)的(默认)注册表项?

c# - 如何使用 WiX Burn MBA bundle 在 MajorUpgrade 期间检测当前安装的功能?

visual-studio-2008 - 如何让我的 VS2008 x86 安装程序在 x64 上安装 x64 程序集?

java - 我可以在应用程序安装程序中集成 Apache 和 Mysql 吗?

Wix 安装程序 TARGETDIR INSTALLDIR 设置为 E :\

c# - 微星参数检查

c++ - MsiEnumProductsEx 不工作

installation - 使用高级安装程序合并模块

inno-setup - 使用 Inno Setup 创建一个小型 Web 安装程序