Как исправить логику обновления настройки wix после изменения InstallScope на perMachine - PullRequest
13 голосов
/ 24 марта 2009

Мы используем wix для создания настроек для нашего приложения. В случае, когда пользователь уже установил старую версию нашего приложения, мы проводим серьезное обновление с помощью элемента MajorUpgrade XML . Это все работает как нужно: если установлена ​​более старая версия, она прозрачно обновляется. Если имеется более новая версия, программа установки прерывает работу с чистым сообщением.

Однако теперь я хочу изменить InstallScope с "perUser" на "perMachine". К сожалению, это нарушает логику обновления. Новый установщик не обнаруживает и не удаляет предыдущую установку perUser. Вместо этого он просто устанавливается поверх старой версии в том же месте ProgramFiles. Пользователь видит две записи в списке «Установка и удаление программ» и видит два идентичных ярлыка на рабочем столе (старый пользовательский и новый perMachine).

Как мне перевести мой установщик из perUser в область установки perMachine, не нарушая логику обновления?

Ответы [ 4 ]

7 голосов
/ 24 марта 2009

К сожалению, установщик Windows не поддерживает это. Некоторый процесс вне вашего пакета (загрузчик / цепочка?) Должен будет управлять обновлением от пользователя к компьютеру.

5 голосов
/ 28 января 2016

Начиная с конфигурации для каждой машины.

<Property Id="ALLUSERS" Value="1" />

При этом будет запущена автоматическая проверка для каждой машины (если, я полагаю, если у вас работает элемент MajorUpgrade), которая не подхватывает предыдущую установку для каждого пользователя:

Action start 15:46:35: FindRelatedProducts.
MSI (c) (D0:0C) [15:46:35:496]: FindRelatedProducts: current install is per-machine.  Related install for product '{0C6604FB-58EC-48B9-8259-5871EFDADEB9}' is per-user.  Skipping...
MSI (c) (D0:0C) [15:46:35:496]: FindRelatedProducts: current install is per-machine.  Related install for product '{0C6604FB-58EC-48B9-8259-5871EFDADEB9}' is per-user.  Skipping...

Поэтому перед установкой убедитесь, что вы выполняете еще один FindRelatedProducts вызов для продуктов, которые были установлены в пользовательской области (например, так):

<!-- temporarily switch to per-user install scope-->   
<Publish Dialog="MyWelcomeDlg" Control="Next" Property="ALLUSERS" Value="{}">1</Publish>
<!-- find related products that have been installed per-user -->
<Publish Dialog="MyWelcomeDlg" Control="Next" Event="DoAction" Value="FindRelatedProducts">1</Publish>
<!-- switch back to per-machine install scope-->
<Publish Dialog="MyWelcomeDlg" Control="Next" Property="ALLUSERS" Value="1">1</Publish>

Это, в свою очередь, находит установку для каждого пользователя:

Action start 15:46:36: FindRelatedProducts.
FindRelatedProducts: Found application: {0C6604FB-58EC-48B9-8259-5871EFDADEB9}
MSI (c) (D0:88) [15:46:36:716]: PROPERTY CHANGE: Adding WIX_UPGRADE_DETECTED property. Its value is '{0C6604FB-58EC-48B9-8259-5871EFDADEB9}'.
MSI (c) (D0:88) [15:46:36:716]: PROPERTY CHANGE: Adding MIGRATE property. Its value is '{0C6604FB-58EC-48B9-8259-5871EFDADEB9}'.

Существующие продукты будут удалены независимо от того, в какой проверке они найдены.

Action start 15:46:41: RemoveExistingProducts.
RemoveExistingProducts: Application: {0C6604FB-58EC-48B9-8259-5871EFDADEB9}

Примечание на стороне : Это не устраняет основных трудностей, возникающих при наличии установщиков двойного назначения: пользователь 1 на машине может быть установлен в области пользователя, а затем пользователь 2 будет установлен на компьютере , Пользователь 1 увидит обе установки в своей таблице программ / функций, и я не знаю, какая из них имеет приоритет. Поэтому рассмотрите возможность установки только для каждой машины.

1 голос
/ 01 июня 2010

Вы можете использовать эту технику для определения установки для каждого пользователя при установке на компьютере: http://www.mail-archive.com/wix-users@lists.sourceforge.net/msg35197.html

0 голосов
/ 05 мая 2017

Находит как существующие установки perUser, так и / или perMachine. И вынуждает новую установку к установке perMachine (очевидно, логика, позволяющая сделать это условие условным, может быть применена по вашему желанию). Это работает, когда выполняется как обычная установка, и когда устанавливается без вывода сообщений в LocalSystem (автоматическое обновление). Имейте в виду, он может найти установку perUser только при работе от имени этого пользователя.

Создание настраиваемого действия (в DLL)

#pragma comment(linker, "/EXPORT:RunFindRelatedProducts=_RunFindRelatedProducts@4")
extern "C" __declspec(dllexport) UINT __stdcall RunFindRelatedProducts(MSIHANDLE a_hInstall)
{
MsiSetProperty(a_hInstall, "ALLUSERS", "1");
MsiDoAction(a_hInstall, "FindRelatedProducts");
MsiSetProperty(a_hInstall, "ALLUSERS", "");
MsiDoAction(a_hInstall, "FindRelatedProducts");
MsiSetProperty(a_hInstall, "ALLUSERS", "1");
return ERROR_SUCCESS;
}//end function

Затем «замените» стандартный FindRelatedProducts на пользовательское действие

<InstallUISequence>
  <FindRelatedProducts>0</FindRelatedProducts>
  <Custom Action="RunFindRelatedProducts" Before='FindRelatedProducts'>NOT Installed</Custom>
</InstallUISequence>
<InstallExecuteSequence>
  <FindRelatedProducts>0</FindRelatedProducts>
  <Custom Action="RunFindRelatedProducts" Before='FindRelatedProducts'>NOT Installed</Custom>
</InstallExecuteSequence>
...