Установщик Windows - удаление предыдущей версии, когда версии отличаются в политике установки (для пользователя, для компьютера)

У нас есть плагин visio (скажем, версия 1), который был установлен Пользователем с правами администратора от имени пользователя ("Просто я"), а установщик MSI был создан с использованием настройки и развертывания Visual Studio. Позже из-за политики организации на месте были отозваны права администратора для всех пользователей. Таким образом, новая версия (версия 2) должна быть установлена ​​ИТ-администратором для каждой машины (опция для всех), чтобы плагин был доступен для всех пользователей на этой машине, а также для удаления старой версии (установленной версии 1). Пользователем, чьи разрешения были отозваны.

Мы пытаемся автоматизировать удаление, чтобы избежать ручного вмешательства. Утилита работает, обнаруживая все установленные экземпляры приложения, просматривая ключи реестра на этом компьютере и принудительно удаляя его с помощью msiexec. Но msiexec не удается удалить версию, которая была установлена ​​другим пользователем с кодом выхода 1605 - это действие действительно только для продуктов, которые установлены в данный момент.

Если Пользователь (который установил плагин версии 1) получает права администратора для удаления приложения, он может вручную удалить его, что доказывает, что приложение не было взломано и находится в состоянии, которое можно удалить без каких-либо проблем.

Любые указания о том, как программно удалить приложение, установленное на компьютере, который был установлен другим пользователем с опцией "Просто я", действительно помогли бы

3 ответа

Решение

Это не просто проблема Visual Studio. Установщик Windows не позволяет контексту установки (пользователь / машина) измениться во время обновления. Вы должны выполнить вход в качестве профиля (ов) пользователя, выполнившего установку, и удалить их перед установкой новой установки для каждого компьютера.

Я нашел дополнительную документацию:

Следующий подход можно использовать для устранения существующих установок для каждого пользователя и установки нового пакета на компьютер, если вы используете Installshield. То же самое должно быть возможно сделать с вашим собственным CA замены для "ISSetAllUsers", если вы не используете Installshield. Далее предполагается, что таблица "обновлений" правильно заполнена для "крупного обновления" - выполните поиск информации об основных обновлениях:

  1. Вставьте пользовательское действие InstallSield ISSetAllUsers перед FindRelatedProducts. Это действие будет считывать значение ALLUSERS для существующей установки и применять его для новой установки. Ниже описано, как добавить это действие.
  2. Переместите RemoveExistingProducts в начале последовательности, до InstallInitialize.
  3. Сразу после RemoveExistingProducts используйте свойство set CA, чтобы установить для ALLUSERS значение 1.
  4. Очень важно, чтобы обе вышеуказанные операции были выполнены до InstallInitialize. Если значение ALLUSERS изменится после InstallInitialize, все компоненты будут находиться в нераспознанном состоянии после установки, и обычно происходит самовосстановление.

Чтобы вставить пользовательское действие ISSetAllUsers, вам нужно сделать следующее:

  1. В Installshield выберите Сервис -> Параметры -> Общие -> Включить "Автоматически создавать действие ISSetAllUsers". Нажмите ОК.
  2. Перейдите в представление обновлений и вставьте фиктивную запись.
  3. Перейти к прямому редактору, удалить фиктивную запись из таблицы обновлений.
  4. Действие ISSetAllUsers должно быть вставлено. Перейдите в представление InstallExecuteSequence и переместите действие до FindRelatedProducts.

Важное замечание : Обратите внимание, что настраиваемое действие ISSetAllUsers никогда не должно добавляться ни в один проект, если только вам не нужно выполнить переход от пользователя к компьютеру. Действие будет эффективно гарантировать, что новая установка будет установлена ​​с тем же значением, что и старая установка, если только не настроено настраиваемое действие свойства для принудительной установки для каждой машины (как мы делаем в сценарии, описанном выше).

Я создал пакет, чтобы сделать это несколько лет назад, но для моей жизни я не могу его найти. Насколько я помню, это было связано с использованием серьезного обновления и таблицы обновлений для удаления установки для каждого пользователя в контексте нужного пользователя, а затем с помощью настраиваемого действия set свойство для изменения значения ALLUSERS до того, как новая установка достигнет InstallInitialize и выполнит новая установка на машину. Это означает, что вы должны переместить RemoveExistingProduct как можно раньше в InstallExecuteSequence, а затем выполнить свойство set сразу после него.

Звучит безумно, но, насколько я помню, это сработало после серьезного тестирования и отладки. Важной частью является запуск нового установщика от имени пользователя, который первоначально установил установку для каждого пользователя. Это не всегда легко сделать с логистической точки зрения, так как sccm может запустить установку в другом контексте. Также может случиться так, что вам придется переместить RemoveExistingProducts еще раньше в последовательности и переместить некоторые стандартные действия за ним, чтобы он работал. Я не помню точно - извините. Вы можете использовать ActiveSetup, чтобы запланировать запуск установки "один раз для каждого пользователя". Затем вам может потребоваться отключить графический интерфейс настройки, чтобы избежать сбоев с сообщениями об ошибках для каждого пользователя, если установка отсутствует.

Обратите внимание, что вышесказанное сложно сделать в Orca. Попробуйте в Wise для Windows Installer или Installshield. Обратите внимание, что пакеты Installshield также имеют свой собственный способ переопределения значения ALLUSERS, и вам может потребоваться отключить их вариант, чтобы заставить ваш работать. Это не должно быть легко:-).

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