Как проверить, установлено ли приложение (для любого пользователя) в то время, и сделать его обновлением, а не установкой?

У меня есть продукт, который установлен на многих сайтах. Теперь мы выпустили обновление. Но проблема заключалась в том, что в первой версии установка выполнялась для каждого пользователя, а теперь мы сделали это для установки на компьютере. В новой версии (v3) имеются настраиваемые действия, которые выполняются при обнаружении старой установки (v2). Но он не определяется как установленный, когда MSI запускается от имени другого пользователя, установившего версию 2. Есть ли способ определить, установлена ​​ли старая версия (даже если она была установлена ​​другим пользователем, отличным от текущего пользователя), вероятно, в сценарии установки.

2 ответа

Решение

Проверьте оба реестра 64/32 для установленных приложений. Ищите GUID вашего продукта под этими ключами. Если это там, это установлено.

Это работает для MSI.

32-разрядный: [HKEY_LOCAL_MACHINE\ SOFTWARE \ Wow6432Node \Microsoft\Windows\CurrentVersion\Uninstall]

64 бит: [HKEY_LOCAL_MACHINE\ ПРОГРАММНОЕ ОБЕСПЕЧЕНИЕ \Microsoft\Windows\CurrentVersion\Uninstall]

Поскольку вы не знаете, сколько пользователей может быть на компьютере и кто установил ваш продукт для каждого компьютера или для каждого пользователя, я думаю, что единственный надежный способ - это использовать MsiGetProductInfoEx() или эквивалентный для поиска вашего продукта для всех пользователей машина. Например, я не знаю ваших точных сценариев, но если администратор устанавливает ваш новый продукт для каждой машины от имени пользователя, который установил его для каждого пользователя, то вы застряли, если вы не сможете узнать пользователя, который фактически установил его. Бесполезно искать установку для каждого пользователя! Вам нужно будет перечислить всех пользователей, получить каждый SID и спросить, установил ли он ваш продукт, используя этот API (или эквивалентный). Если он найден, вы скажете пользователю войти в систему как этот пользователь и удалить продукт. IIRC не всегда удается, когда другой пользователь (даже администратор) пытается удалить продукт для каждого пользователя, установленный другим пользователем.

По моему опыту, в большинстве случаев люди пытаются определить, установлен ли продукт, используя какой-либо метод обнаружения, который не зависит от контекста установки. Затем, если при обновлении для каждой машины не установлено свойство, в котором говорится, что для каждой машины установлена ​​установка, просто выдайте ошибку и попросите удалить вручную.

NB: добавлены пользовательские действия и используется ::MsiConfigureProduct() для удаления и MsiGetProductInfoEx() для проверки установки продукта

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