Ответ 1
Чтобы преодолеть ICE, вы должны перенести реестр для отдельных пользователей и использовать некоторые записи реестра как keyPath для этого компонента, то есть:
<Component Id='PerUserRegistry' Guid='*'>
<RegistryValue Id="PerUserRegistry_KeyPAth" KeyPath="yes" Root="HKCU" Key="Software\[Manufacturer]\[ProductName]\[ProductCode]\PerUserRegistry" Name="[PackageCode]" Value="[ProductVersion]" Type="string" />
<!--Other Per-user registry goes here-->
</Component>
Я полностью согласен с Кристофером: общепринятая практика оставлять данные для каждого пользователя при деинсталляции, но если удаление необходимо, то активная настройка - единственная реальная опция.
Сначала я предлагаю вам удалить их при установке или повторной установке вместо удаления, вам просто нужно добавить запись RemoveRegirty и Active Setup, то есть с помощью этого кода WiX:
<Component Id='ActiveSetup' Guid='*'>
<RegistryValue Id="ActiveSetup00" Root="HKLM" KeyPath="yes" Key="SOFTWARE\SOFTWARE\Microsoft\Active Setup\Installed Components\[PackageCode]\" Name="StubPath" Value="msiexec /fup [ProductCode] /qb-!" Type="string" />
<RegistryValue Id="ActiveSetup01" Root="HKLM" Key="SOFTWARE\SOFTWARE\Microsoft\Active Setup\Installed Components\[PackageCode]\" Value="[ProductName] [ProductVerion] Configuration" Type="string" />
</Component>
<Component Id='PerUserRegistryCleanup' Guid='*'>
<RegistryValue Id="PerUserRegistry_KeyPath" Root="HKCU" KeyPath="yes" Key="SOFTWARE\SOFTWARE\Microsoft\Active Setup\Installed Components\[PackageCode]\" Name="StubPath" Value="msiexec /fup [ProductCode] /qb-!" Type="string" />
<RemoveRegistryKey Id='PerUserRegCleanup' Root='HKCU' Action='removeOnInstall' Key='Key\To\Be\Removed'/>
</Component>
Примечание. Рекомендуется использовать [PackageCode] в ActiveSetup, поэтому с каждой новой версией (сборкой) пакета MSI вы добавляете отдельную запись (также см. мою последнюю заметку). Я использовал активный реестр для каждого пользователя в качестве ключевого пути, поэтому вы не запускаете его для текущего пользователя дважды.
Что касается удаления после удаления, Теперь, надеюсь, вам нужно удалить весь ключ, а не только некоторые значения. В любом случае, я бы создал пользовательское действие, чтобы добавить запись реестра для Active Setup во время удаления (или если таких ключей/значений много, создайте и разверните файл .CMD с ними и запустите его при удалении перед действием RemoveFiles, чтобы добавить все из них в реестр).
Примечание: я настоятельно рекомендую добавить удаление этого реестра во время установки или вы можете удалить значения для каждого пользователя, когда программное обеспечение еще установлено.
Итак, здесь код WiX для всего этого:
<CustomAction Id="CA_UninstallRegistryCleanUp" Directory="SystemFolder" ExeCommand="REG.exe ADD "HKLM\SOFTWARE\Microsoft\Active Setup\Installed Components\MySoftName_CleanUp" /v StubPath /d "reg add ^"HKCU\Key\To\Be\Removed^" /va /f" /f" Return="ignore" />
<InstallExecuteSequence>
<Custom Action='CA_UninstallRegistryCleanUp' After='RemoveRegistryValues'>REMOVE~="ALL"</Custom>
</InstallExecuteSequence>
<Component Id='RegCleanup_Remover' Guid='*'>
<RegistryValue Id="PerUserRegistry_KeyPAth" Root="HKLM" KeyPath="yes" Key="SOFTWARE\[Manufacturer]\[ProductName]\[ProductCode]\" Name="DummyKey" Value="[ProductVersion]" Type="string" />
<RemoveRegistryKey Id='RegCleanup_Remover' Root='HKLM' Action='removeOnInstall' Key='SOFTWARE\Microsoft\Active Setup\Installed Components\MySoftName_CleanUp'/>
</Component>
Заключительные примечания: Там всего две небольшие проблемы со всеми этими средствами Active Setup: будьте осторожны на серверах Windows Terminal Server; и как только активная настройка была запущена для одного пользователя для текущего .MSI, он не будет запускаться снова, если вы решите переустановить тот же пакет, если вы не измените его PackageConde или не установите версию в разделе реестра ActiveSetup. Это темы для другого дня, дайте мне знать, если они будут уточнены.
И не забудьте добавить все перечисленные выше компоненты к некоторым функциям.