如何在Linux中从MSI获取文件的真实名称(或者,如何读取MSI数据库)?

如何在Linux中从MSI获取文件的真实名称(或者,如何读取MSI数据库)?,linux,visual-studio-2010,windows-installer,cab,Linux,Visual Studio 2010,Windows Installer,Cab,更新:我更改了这个问题的标题,以反映下面一些答案中真正需要的内容 我希望能够在Linux中从VisualStudio2010的本机部署工具中生成的MSI获取特定的可执行文件。但是由cabextract获得的名字都很时髦: -rw-r--r-- 1 root wheel 159 Jul 16 17:26 _07DAC52BD05CC8A8D6B2195350CC8C13 -rw-r--r-- 1 root wheel 34304 Oct 29 12:10 _09C75789ECE59A

更新:我更改了这个问题的标题,以反映下面一些答案中真正需要的内容

我希望能够在Linux中从VisualStudio2010的本机部署工具中生成的MSI获取特定的可执行文件。但是由cabextract获得的名字都很时髦:

-rw-r--r-- 1 root wheel     159 Jul 16 17:26 _07DAC52BD05CC8A8D6B2195350CC8C13
-rw-r--r-- 1 root wheel   34304 Oct 29 12:10 _09C75789ECE59A0AC891A85289474E75
-rw-r--r-- 1 root wheel    8704 Oct 29 12:10 _0CB147FD23752DEFAC3B73925E1E38DB
-rw-r--r-- 1 root wheel     766 Oct 29 12:10 _1D0B16C3296C400D9FD4018E77AC0B05
-rw-r--r-- 1 root wheel   10752 Oct 29 12:10 _24792622E94742D68A455C4F1D54D51F
-rw-r--r-- 1 root wheel     159 Oct 29 12:10 _90A663D25084CD22A230CCB8F55A3700
-rw-r--r-- 1 root wheel   12800 Oct 29 12:10 _BC47FBF48B42E5E71C9901188422814A
-rw-r--r-- 1 root wheel  873984 Oct 29 12:10 _EAFFD36EAA914E7F9D3DAC8BA13DFB6A
-rw-r--r-- 1 root wheel    4608 Oct 29 12:10 _F434E52DDE0AB5C2D68CE7A78B0B2477
-rw-r--r-- 1 root wheel  467456 Oct 29 12:10 _F90AF0EB7EEF445A92623132D00191EA
-rw-r--r-- 1 root wheel  421200 Oct 29 12:10 F_CENTRAL_msvcp100_x86.AFA96EB4_FA9F_335C_A7CB_36079407553D
-rw-r--r-- 1 root wheel  773968 Oct 29 12:10 F_CENTRAL_msvcr100_x86.AFA96EB4_FA9F_335C_A7CB_36079407553D
与解决方案的发布目录相比,我可以看到我想要的文件(itragent.exe)实际上是_F90AF0EB7EEF445A92623132D00191EA——在Linux中有没有一种方法可以通过编程得出这个结论?要么使用cabextract,要么借助其他工具?其中有两个文件是XML文本,但它们只有.NET Framework版本信息,没有其他内容


或者,有没有办法强制VS 2010以正确的名称将MSI中的可执行文件归档?

有问题,cab不包含有关文件“真实”名称的信息。但它包含这些文件的顺序。MSI文件有表
文件
,其中每个压缩文件都有
序列
编号。该编号应与文件柜内文件的序列号相同

我想,你可以打开MSI,从
FileName
列和它们的
Sequence
编号中提取真实的文件名,并以某种方式将它们等同于cab序列


有用的链接:、和

cab文件以.msi数据库中的主键命名。要找到他们的真名,你必须查一下数据库。如果您只需要
文件名
(从
文件
中查找),或者对于相对路径,您还需要(目录位置的自链接树;请参阅Rob Menshing的系列文章,如果您需要帮助理解它)以及多对多查找表


请注意,在某些病理情况下,一旦完成,cab中的多个条目可能具有相同的路径名,因此您可能需要特别处理这些条目。这应该比较少见。

啊,我明白了。现在我所需要的是从Linux中读取这个数据库的方法。有没有一些现成的实用程序可以做到这一点?看起来Wine支持Windows Installer API。您可以开始查找API:MsiOpenDatabase、MsiDatabaseOpenView、MsiViewExecute、MsiViewFetch、MsiRecordGetString。