Как получить истинное имя файла из 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 в качестве справочной таблицы "многие ко многим". Это.
Напоминаем, что в некоторых патологических случаях несколько записей в кабине могут иметь одинаковые имена путей, как только вы закончите, поэтому вам, возможно, придется обращаться с ними специально. Это должно быть относительно редко.