Ste*_*mul 10 windows-installer wix orca advanced-installer msiexec
如何对两个(或更多)MSI文件进行 " 内容比较 " 并查看文件内部实际不同的内容 - 而不是进行无用的二进制比较?(这显然只告诉我我是否正在处理同一文件的副本).
一些相关和典型的问题场景:
这是一个Q/A风格的问题,主题是比较已编译的MSI文件以确定存在哪些真正的"内容差异".
Ste*_*mul 14
粗略地说,MSI文件是COM结构的存储文件 - 本质上是文件中的文件系统 - 具有不同内容的流,其中一个是精简的SQL Server数据库(我认为最通用的术语).如果MSI文件是可读的,则可以比较内容(各种格式和类型).
技术说明:可以想象,触发a的MSI About MSI Files不可运行(System.BadImageFormatException无法运行),但它仍然可以读取 - 因此可比较(如果您遇到它,请添加注释以验证这一点).
流:MSI中的某些流是具有字符串值的表.可能还存在用于存储要部署的文件的嵌入式cab存档的流,以及仅具有二进制内容的表- 例如msiexec.exe编译和未编译的自定义操作的位置与设置所需的其他二进制内容一起存储.还有一个特殊的" 概要流 ",并存储在他们的母语,二进制格式图标的表,这样的例子不胜枚举......对于大多数的表,我们可以比较每个表中的字符串很像我们比较文本Word文档(以前也是OLE/COM文件 - 虽然较新版本现在使用Open Office XML)并获得详细的差异报告.为了做到这一点,你显然需要一个专门用于工作的工具 - 一个能够找到所有相关流的方法.下面列出了一些商业和免费工具.
二进制内容:阐述在此之前,我要指出的是,在比较的内容Binary table,Binary Table,Cabs Table-或任何其他二进制表,一般会允许你一个二进制仅对比(特别是编译自定义操作DLL和EXE文件).脚本自定义操作(在二进制表中)可以作为文本进行比较,但编译的自定义操作只能进行二进制比较.因此,如果您的问题来自编译的自定义操作,您无法在直接比较中看到它(您只能看到二进制差异).您需要访问源代码管理系统,以查看用于任何类型的已编译自定义操作的代码 - 希望您有一个良好的标签实践,以便您可以找到每个设置中使用的实际源代码.我不使用这种做法,但对于内部的企业版本,您甚至可以为编译的自定义操作包含debug-build dll,并尝试将调试器附加到正在运行的代码以真正弄清楚发生了什么?我不会使用调试模式dll进行公开发布 - 除非我澄清了任何风险.调试代码可能充满(意外的)调试消息框(用作附加调试器的入口点)以及其他永远不会遇到生产包的问题.
试想想起来了,你的cab文件和图标文件绝对可以比使用技术来编译使用MSI文件中老年(或更新版本)MSI文件及其相应的版本Icon Table-这说明如下.然后,使用一个好的比较工具(下面提到Beyond Compare),你可以在不同的MSI版本之间对cab文件内容进行完全差异(并且一些文件可以是文本文件,可以进行文本比较).我认为cabs和图标是一种开放格式的"透明二进制文件",而不是编译的二进制文件(具有自定义操作等),这些二进制文件本身不具有可编译性或可检查性(除非您知道如何反编译托管二进制文件).
总之:MSI文件是完全透明的,但编译的自定义操作除外.这种透明度是MSI的核心优势之一.与以前的部署技术相比,大多数Windows Installer的优势通常都围绕企业部署优势.不幸的是,开发人员可能只看到MSI的坏方面:(潜在的)MSI反模式(对于底部 - 非常混乱和临时性).不可否认,其中一些问题非常严重,违反了"最不惊讶的原则".开发人员 - 为什么要做其他同样重要的事情 - 可能坦白地说是难以置信地摸不着头脑.
不过不留下任何错误:MSI具有巨大的企业部署优势(参见上面的相同链接,接近底部).简明:可靠的静默运行,远程管理,回滚,日志记录,隐式卸载功能,提升权限,标准化命令行,透明度,标准化设置自定义转换和管理员安装以可靠地提取文件.只是快速命名大的.列表形式的好处在这里.
到目前为止,我们进行了大量的讨论 - 让我们明白这一点.可以使用哪些工具来比较MSI文件?
一些商业部署工具(如Installshield,Advanced Installer和许多其他MSI工具)支持查看和比较MSI文件.也许我添加了太多的链接,但让我使用我通常的政策"如果你链接到一个,你链接到每个人" - 它应该节省一些时间和一些谷歌搜索.
作为一个特别的注释 - 一个怀旧的 - 我见过的最好的MSI-diff功能是在Wise Package Studio中.说实话,它总是优于其他人 - 总是工作,整齐的颜色编码,很容易理解.此工具不再按此处所述进行销售:要使用哪种安装产品?InstallShield,WiX,Wise,Advanced Installer等(如果您的公司中有一个包装团队,他们可能有一个备用许可证?).
商业工具很好,但也有一些免费的替代品可以用来比较MSI文件 - 下面是一些列表,以及一些关于如何使用每个工具的提示(以相当简单的方式).
还添加了一些更多细节dark.exe- 它们根本不是COM结构化存储文件的比较工具,而是一种将MSI文件反编译为WiX XML源文件并提取所有支持文件(图标,二进制文件,cab,安装文件)的方法 - 之后允许将它们与常规文本/二进制比较工具进行比较.
微软自己的MSI SDK工具/观众称为逆戟鲸可以查看MSI文件,并对其进行编辑,但比较两个MSI文件没有直接的支持(我知道).我想你可以导出表然后比较它们,但其他工具有更多的内置功能.提到此选项是因为您可能已经安装了Orca,然后这可能是一种快速完成简单差异的方法." 穷人的选择 ".
您可能已经拥有安装程序.如果安装了Visual Studio,请尝试搜索Commercial Tools并安装它.然后在开始菜单中找到Orca.技术上Orca是作为Windows SDK的一部分安装的(大型,但免费下载).如果你没有安装Visual Studio,也许你知道有人在做什么?只是让他们搜索这个MSI并发送给你(这是一个很小的半mb文件) - 应该花几秒钟.如果没有,您可以随时下载Windows SDK
Super Orca将允许两个MSI文件的基本比较.我的冒烟测试似乎表明可以忽略诸如摘要流之类的高级字段.换句话说,直表比较.可能还有其他限制.也许它够好了?它很容易使用.
该Free Tools有你可以用它来查看两个MSI文件之间的差异一个VBScript.它被称为dark.exe(msdn).使用此工具,我可以看到Super Orca忽略的Summary Stream差异.任何MSI SDK都是权威的.
Orca需要比较MSI文件,但有许多有用的脚本可以找到其他目的.(MSI SDK).启动Orca-x86_en-us.msi并传递两个MSI文件的完整路径以进行比较.控制台输出.来自WiX工具集的dark.exe二进制文件(一种可能用于编译某些MSI文件的工具包).这是MSI文件的"反汇编程序"或"反编译程序".它将MSI文件转换为XML格式(WiX自己的格式,用于首先编译MSI文件),以及一些提取的二进制文件(如果使用正确的反编译选项和标志).Program Files (x86)Super Orca
将(free third party tool)源文件可以作为普通的文本源文件进行比较(我最喜欢的这个工具是无法比拟的,但它是一个商业工具-有大量文本的比较工具-包括那些在Visual Studio).二进制文件显然可以进行二进制比较.例如,可以将任何提取的CAB文件与来自另一个MSI设置版本的另一个类似的cab文件进行比较.
这是一个示例命令行:
cscript.exe widiffdb.vbs "Setup 1.msi" "Setup 2.msi"
Run Code Online (Sandbox Code Playgroud)
在许多情况下,这将产生一个非常好的MSI文件比较,你应该能够确定真正不同的东西.
提取的二进制文件可以是脚本文件(VBScripts等)或任意数量的其他二进制文件(例如编译的DLL自定义操作).在后一种情况下,您无法进一步对其进行反编译 - 除非它是.NET二进制文件,并且您具有反编译此类二进制文件的专业知识.
但是,应该注意的是,使用完全相同的WiX源文件编译的WiX生成的MSI文件可能有所不同,原因如下:
同样的WiX源文件也可以使用不同的编译器和链接器设置进行编译,这可能会以多种不同的方式影响生成的MSI文件.要查看所有交换机,请下载并安装WiX,然后写入widiffdb.vbs或(MSI SDK)进入命令提示符并点击enter.
某些字段(如包GUID和产品GUID)可以设置为在wxs文件中自动生成.在这种情况下,生成的MSI文件中的结果相应字段对于每个构建显然是不同的.
我没有完整的列表,列出了此时可以设置为自动生成的字段(如果您知道,可能会点击编辑并在原位进行修改).
提到的自动生成的字段也可以是硬编码的(这对包GUID不好,但这是另一个长篇故事 - 只要知道如果你发现两个MSI文件是二进制不同的同一个包GUID,那么你遇到了严重的麻烦 - 如果他们在野外 - Windows安装程序会根据定义将它们视为同一个文件).应始终自动生成包裹代码.题外话.
MSI文件本身显然已经分别编译了不同的文件日期信息 - 只是说明显而易见.
并且特别注意与手头的主题有些无关,但重要的是:您可以使用MSI SDK反编译使用WiX的Burn功能编译的可执行文件.这是WiX的引导程序功能,用于按顺序安装一个或多个MSI和/或EXE文件 - 一个接一个.这些引导程序是EXE文件,您可以将它们解压缩为它们的组成MSI和/或EXE文件:
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}
Run Code Online (Sandbox Code Playgroud)
只需打开命令提示符,将CD打开到setup.exe所在的文件夹即可.然后指定上面的命令.具体样本:widiffdb.vbs.输出文件夹将包含几个子文件夹,其中包含提取的MSI和EXE文件以及Burn GUI的清单和资源文件.然后可以如上所述分解任何MSI文件以产生WiX源文件(wxs).
出于某种原因,我从未积极使用过这个工具,但经过多次测试.再次测试它确实似乎做了比较两个MSI文件的工作,虽然从一个奇怪的菜单选项(这使我认为该功能之前没有工作).
widiffdb.vbs并浏览到要比较第一个的MSI.widiffdb.vbs两个实例.现在比较属性表中的信息.或者使用cscript.exe上面列出的脚本.毫无疑问,许多其他工具能够查看COM结构化存储文件,但我认为上述选项应该足以满足大多数用户的需求.我将再次添加一个指向installsite.org的MSI工具列表的链接.
这个商业工具将能够作为一个查看器,并允许对MSI文件进行一些基本操作,即使没有完整的许可证运行.好一点是你甚至不需要使用原始表,但可以使用更好的用户界面来"修补"MSI中的各种内容.例如,各种升级参数(主要升级卸载失败时继续或失败等).
在表编辑器视图(直接表视图)中所做的更改将在其他"向导视图"中不可见.这里解释了其原因.
| 归档时间: |
|
| 查看次数: |
5179 次 |
| 最近记录: |