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

时间:2018-02-21 06:13:10

标签: c windows-installer extract cab

MSI数据库包含一组表,我可以成功枚举File表,其中包含所有可部署文件'meta-deta。我需要提取的是这些文件的实际内容。 msiexec lessmsi 7-zip 都可以,但我找不到任何源/ API来执行此操作。

我发现所有其他(资源)文件都在Binary表中,而数据字段可用于获取这些文件的内容(如图标,自定义DLL)等等)。

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

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

3 个答案:

答案 0 :(得分:3)

将所有文件提取到某个位置最直接的方法是将产品安装在&#34;广告&#34;模式。如果您这样做:

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

你会看到会发生什么。

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

答案 1 :(得分:3)

菲尔给了你简单/简单的答案,但我想我可能会给你一些更多的信息,因为你做了一些研究。结帐:

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

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

您还需要递归目录表以构建目录树并知道放置文件的位置。

有趣的东西。 C#中有一些库使这个方法更简单。或者只是像菲尔所说的那样打电话给msiexec / a。 :)

答案 2 :(得分:2)

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

Chris 已经链接到您可以检查的 DTF代码,但这里也是一个直接指向 dark.exe 的链接:{ {3}}。我会尝试两者。这是C#,你似乎想要原生。

更新:在我了解您可以使用的Win32功能之前,请查看C#DTF功能的这个小摘要:https://github.com/wixtoolset/wix3/tree/develop/src/tools/dark

本机Win32函数How to programmatically read the properties inside an MSI file?可以在MSDN上找到处理MSI文件(这是将MSI文件作为数据库处理)。还有The database functions(用于将MSI文件作为实际安装程序处理)。

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

顺便说一下:这有助于描述您尝试解决的实际问题以及您在技术上需要什么。可以 - 一如既往 - 更少参与实现您所需要的方式。除非您正在编写安全软件或恶意软件扫描程序或超级参与的内容。

很明显:WiX的dark.exe将MSI文件完全反编译成WiX源文件和用于构建它们的资源文件 - 然后您可以对各种类型的内容进行文本和二进制比较(<表格的strong>文本比较,二进制文件的二进制比较等...)。下面的答案描述了通过命令行执行此操作的过程:MSI Installer Functions(这是关于比较MSI文件,但这样做的一个选项是反编译它们 - 请参阅dark.exe部分 - 仅供参考找到你问题的其他人的参考资料。)

我喜欢将各种内容链接在一起,以便我们可以在以后轻松找到内容。严格来说,这里似乎没有必要,你有我想要的东西,但其他人可能会从一些进一步的链接中获益。以下是一些相关链接: