Назад | Перейти на главную страницу

Получение общедоступных свойств из файла MSI

Есть ли инструмент или механизм для получения доступных общедоступных свойств из файла Windows MSI?

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

Lessmsi предоставляет командную строку, а также интерактивное приложение для получения любого атрибута из .msi.

В интерактивном режиме откройте .msi, затем перейдите в Просмотр таблицы и выберите или введите «Свойство». Однако, хотя это дает имена свойств, он не дает действительных значений для указанного свойства (или я не нашел подходящего места для поиска).

Командная строка для вывода таблицы свойств на консоль (к сожалению, не может быть > output.csv перенаправить)

lessmsi l -t Property ...\path\to\setup.msi

Учитывая, что файл MSI хранит общедоступные свойства во внутренней базе данных, вы можете просто запросить их с помощью VBScript и SQL.

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

Lessmsi - отличный инструмент, который, безусловно, работает здесь, если вы хотите открыть его графический интерфейс и провести небольшое расследование вручную. Однако я скажу, что следующая команда не представляет достоверно все свойства:

lessmsi l -t Property <msi_name>

Один из способов (лучше) гарантировать, что вы получите все возможные свойства, - это фактически выполнить установку, восстановление или удаление с помощью файла MSI и зарегистрировать процесс. Следующая команда записывает только свойства и ничего больше:

<msi_name> /lp! <msi_property_logfile>

Приведенная выше команда эквивалентна:

msiexec /lp! <msi_property_logfile> /i <msi_name>

Однако я предпочитаю не фактически установить / удалить / восстановить (а вместо этого просто извлечь). Преимущества этого метода перед Lessmsi в том, что для этого не требуется сторонняя утилита (т.е. Lessmsi), и вам не нужно вмешиваться в установку. Учитывая, что у вас достаточно места на диске для установки программы, вы можете:

msiexec /a <msi_name> /lp! <msi_property_logfile> TARGETDIR=<absolute_path_to_extract_to>

Обратите внимание, что <absolute_path_to_extract_to> может указывать на несуществующий каталог (команда создаст необходимые каталоги или завершится ошибкой).

Если вы по какой-либо причине ненавидите интерфейс установки, вы можете добавить /qr опция, которая «сократит» и, возможно, исключит пользовательский интерфейс без ущерба для процесса регистрации свойств. Однако будьте осторожны - если вы опускаетесь «ниже», чем сокращенный пользовательский интерфейс (т.е. /qb|/passive или /qn|/quiet), ваш <msi_property_logfile> могут отсутствовать некоторые свойства.

Я делаю это сейчас с помощью модуля Carbon Powershell. Чтобы установить модуль типа:

Install-Module -Name 'Carbon' -AllowClobber

Тогда просто

msi your_msi_path.msi

Пример:

msi putty-64bit-0.70-installer.msi

ProductName                 ProductVersion Manufacturer ProductCode                         

-----------                 -------------- ------------ -----------                         

PuTTY release 0.70 (64-bit) 0.70.0.0       Simon Tatham 45b3032f-22cc-40cd-9e97-4da7095fa5a2

Я думаю, что сейчас, наверное, лучший способ сделать это - использовать PowerShell. Вот сценарий, который отлично справляется со своей задачей: https://gallery.technet.microsoft.com/scriptcenter/Get-MsiDatabaseProperties-09d9c87c