如何从 MSI 数据库中提取部署文件

How extract deployment files from MSI database

MSI 数据库包含一组 table,我可以成功枚举 File table,其中包含所有可部署文件的元数据。我需要提取的是这些文件的实际内容。 msiexec, lessmsi, 7-zip 都可以,但是我没找到source/API 去做。

我发现所有其他(资源)文件都在 Binary table 中,并且 Data 字段可用于获取内容这些文件(如图标、自定义 DLL 等)。

此外,我发现并知道 Media table 包含有关 .CAB 文件的信息(MSI 的所有内容都嵌入了 <MediaTemplate EmbedCab="yes"/>。这只是意味着 CAB 文件包含实际内容。我可能需要从 .msi 文件的 "Structured Storage" 中读取内容。

如何使用本机 C Msi* 函数提取 CAB/MSI 文件的内容?

将所有文件提取到某个位置的最直接方法是以 "advertised" 模式安装产品。如果您执行以下操作:

msiexec /a [msi 路径] TARGETDIR=[某个文件夹]

你会看到会发生什么。

在 C++ 中,使用该命令行调用 MsiInstallProduct ()。

Phil 已经给了你 easy/simple 答案,但我想我可能会为你提供更多信息,因为你已经做了一些研究。结帐:

https://msdn.microsoft.com/en-us/library/windows/desktop/aa372919(v=vs.85).aspx

这是结构化存储的地方。您会看到类似于 Disk1.cab 的名称 (PK) 和二进制数据。数据是一个 CAB 文件,cab 中的文件条目与 File.File 列匹配。从那里你可以使用 File.FileName 列来获取短名称和长名称(毫无疑问你会想要长名称)并联合组件 table 来获取目录 table ID.

您还需要递归目录 table 来构建目录树并知道将文件放在哪里。

有趣的东西。 C# 中有一些库使这种方式更简单。或者像 Phil 所说的那样调用 msiexec /a 。 :)

您已经得到了很多很好的答案,包括使用 WiX 工具包中的 dark.exe通过下载 WiX 源代码,您应该能够从那里ready-made 获得您需要的代码。我想您可能已经这样做了。

Chris 已经link编辑了 DTF 代码 你可以查看,但这里有一个 link 直接到 dark.exe 以及:https://github.com/wixtoolset/wix3/tree/develop/src/tools/dark。我会尝试两者。这是C#,你好像想要原生的。

更新:在我介绍您可以使用的 Win32 功能之前,请查看 C# DTF 功能的这个小摘要:How to programmatically read the properties inside an MSI file?

本机 Win32 函数The database functions to deal with an MSI file can be found on MSDN (this is to deal with the MSI file as a database). There are also MSI Installer Functions(用于处理 MSI 文件作为实际安装程序)。

通过 Google 搜索,您当然可以找到很好的本机代码示例。玩得开心!


顺便说一句:这将有助于描述您正在尝试解决的实际问题以及您在技术上需要什么。可以 - 一如既往 - 较少涉及的方式来实现你的需要。除非你正在编写安全软件或恶意软件扫描程序或其他东西super-involved。


所以很明显:WiX 的 dark.exe 将 MSI 文件完全反编译为 WiX 源文件和用于构建它们的资源文件 - 然后您可以文本和二进制比较各种类型的内容 (text compare for tables,binary compare for binaries,等等...)。通过命令行执行此操作的过程在以下答案中进行了描述:(这是关于比较 MSI 文件,但这样做的一种选择是反编译它们 - 请参阅 dark.exe 部分 - 仅用于供找到您问题的其他人参考)。


我喜欢 link 把事情放在一起,这样我们以后可以很容易地找到内容。严格来说,这里似乎没有必要,我认为你有你需要的东西,但其他人可能会从进一步的 links 中受益。这里有一些相关的 links: