Как получить истинное имя файла из MSI (или, как прочитать базу данных MSI) в Linux?

ОБНОВЛЕНИЕ: я изменил название этого вопроса, чтобы отразить то, что действительно нужно из некоторых ответов ниже.

Я хочу, чтобы в Linux можно было получить конкретный исполняемый файл из MSI, сгенерированный из собственного средства развертывания Visual Studio 2010. Но имена, полученные 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

Сравнивая с каталогом Release решения, я вижу, что нужный мне файл (itragent.exe) на самом деле является _F90AF0EB7EEF445A92623132D00191EA - есть ли способ сделать этот вывод программно, в Linux? Или с помощью cabextract или с помощью какой-либо другой утилиты? Там есть два файла в формате XML, но у них есть только информация о версии.NET Framework и больше ничего.

Альтернативный, есть ли способ заставить VS 2010 подать исполняемые файлы в MSI с их правильными именами?

2 ответа

Проблема в том, что в cab нет информации об "истинных" именах файлов. Но он содержит порядок этих файлов. MSI файл имеет таблицу Fileгде каждый сжатый файл имеет Sequence число. Этот номер должен совпадать с порядковым номером файла в шкафу.

Я думаю, вы могли бы открыть MSI, взять реальные имена файлов из столбца FileName и их Sequence число, и как-то приравнять их к последовательности кабины.

Полезные ссылки: описание формата CAB, информация о таблице файлов и Windows Installer SDK

Файлы cab названы в честь первичного ключа в базе данных.msi. Чтобы найти их настоящие имена, нужно заглянуть в базу данных. Таблицы, которые вам нужны, включают файл, если вам просто нужно FileName (поиск от File) или для относительных путей вам также понадобится Directory (самосвязанное дерево расположений каталогов; см. серии Роба Меншинга о таблице Directory, если вам нужна помощь, чтобы разобраться в этом) и Component в качестве справочной таблицы "многие ко многим". Это.

Напоминаем, что в некоторых патологических случаях несколько записей в кабине могут иметь одинаковые имена путей, как только вы закончите, поэтому вам, возможно, придется обращаться с ними специально. Это должно быть относительно редко.

Другие вопросы по тегам