Программно определить устанавливаемый пакет MSI - PullRequest
0 голосов
/ 23 октября 2018

Я хотел бы знать, устанавливается ли или обновляется пакет.

Движок MSI устанавливает глобальный мьютекс, но не относится к продукту.

Одна из идей, которые у меня есть, состоит в том, чтобыпроверять запущенные экземпляры msiexec и проверять параметры командной строки, чтобы определить файл msi, и проверять его код продукта, но я хотел бы посмотреть, есть ли лучший вариант, хотя не удалось найти подходящий API.

Спасибо

Ответы [ 2 ]

0 голосов
/ 29 октября 2018

Поскольку я хочу определить, что является установщиком Windows, но не работает, это то, что я сделал до сих пор:

  1. Сканирование всех процессов и анализ всех экземпляров C:\Windows\System32\msiexec.exe и C:\Windows\SysWow64\msiexec.exe
  2. Получите параметр командной строки и проверьте, использовался ли /I.
  3. Поскольку указанный в командной строке файл MSI может не содержать полный путь и текущий каталог процессаможет отличаться от того, который был запущен при запуске процесса, я использовал следующий метод для сканирования пакета:
  4. Используя VirtualQuery и GetMappedFileName сканируйте процесс, ища все отображенные в память файлы
  5. Для каждого отображенного в памяти файла попробуйте открыть его, используя MsiOpenDatabase.MsiOpenPackage не будет работать, поскольку пакет используется программой установки.
  6. Запустите SQL, чтобы получить ProductCode и UpgradeCode из таблицы Property.
0 голосов
/ 28 октября 2018

Основное обновление : Если MSI выполняет серьезное обновление, то код продукта предыдущей версии будет добавлен к свойству, указанному как ActionProperty в таблице обновлений самого нового пакета.В WiX это свойство обычно называется WIX_UPGRADE_DETECTED по соглашению, но оно может называться как угодно.

Другими словами, проверяется, является ли WIX_UPGRADE_DETECTED или эквивалентнымсвойство может иметь любое значение, которое может использоваться для обнаружения обновления.

UPGRADINGPRODUCTCODE : в более старой настройке - той, которая удаляется во времяосновное обновление - встроенное свойство MSI (в отличие от того, которое вы объявляете) UPGRADINGPRODUCTCODE будет установлено в коде продукта более новой установки. Другими словами, вы можете использовать это свойство (UPGRADINGPRODUCTCODE) в условиях старого пакета, но оно не будет установлено в более новой установке .Это очень распространенная путаница.

Поиск установленного продукта : Вы можете легко получить код продукта для установленного продукта: Как найти продуктGUID установленной установки MSI? MSI API имеет множество методов и свойств, которые можно использовать для определения практически любого, что вы хотите об установленном MSI.Доступ к нему можно получить через COM, Win32, Управляемый код .

ОБНОВЛЕНИЕ : . Сценарий здесь показывает, как идентифицировать соответствующие продукты с помощьюMSI API RelatedProducts вызывает .Наверху.


Некоторые ссылки :

...