Aby przezwyciężyć ICES należy przenieść każdego użytkownika rejestru w celu oddzielenia składników i używać wpis rejestru jako keypath dla tego składnika, tj:
<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>
I całkowicie zgadzam się z Christopherem: Powszechną praktyką jest, aby pozostawić za - dane użytkownika dotyczące deinstalacji, ale jeśli usunięcie jest konieczne, aktywna konfiguracja jest jedyną realną opcją.
Najpierw proponuję, aby usunąć je zainstalować lub ponownie zainstalować zamiast deinstalacji, wystarczy dodać wpis RemoveRegirty i Active Setup, czyli z tego kodu 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>
Uwaga: [PackageCode] Zastosowanie w ActiveSetup jest bardzo zalecane, więc przy każdej nowej wersji (kompilacji) pakietu MSI dodajesz osobny wpis (zobacz także moją notatkę końcową). Użyłem aktywnego rejestru instalacji użytkownika jako ścieżki klucza, więc nie uruchamiaj go dla bieżącego użytkownika dwukrotnie.
Co do usuwania ich po odinstalowaniu, Teraz, mam nadzieję, że trzeba usunąć cały klucz, a nie tylko niektóre wartości. W obu przypadkach utworzę niestandardową akcję, aby dodać wpis rejestru dla Instalacji aktywnej podczas deinstalacji (lub jeśli istnieje wiele takich kluczy/wartości, utwórz i zainstaluj plik .CMD wraz z tymi i uruchom go po odinstalowaniu, przed operacją RemoveFiles, aby dodać wszystkie z nich do rejestru).
Uwaga: zdecydowanie zaleciłabym dodanie usunięcia tego rejestru podczas instalacji, lub może się zdarzyć, że usunie się wartości dla poszczególnych użytkowników, gdy oprogramowanie zostanie zainstalowane.
Więc oto kod WiX za to wszystko:
<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>
Uwagi końcowe: tam tylko dwa małe problemy z tym wszystkim aktywnym rzeczy konfiguracji: uważać na serwerach Windows Terminal; i po uruchomieniu aktywnej konfiguracji dla jednego użytkownika dla bieżącego .MSI, nie będzie on uruchamiany ponownie, jeśli zdecydujesz się na ponowną instalację tego samego pakietu, chyba że zmienisz jego PackageConde lub podniosę wersję w kluczu rejestru ActiveSetup. To są tematy na inny dzień, daj mi znać, jeśli ich potrzebujesz, wyjaśnione.
Nie zapomnij dodać wszystkich powyższych komponentów do niektórych funkcji.
Klucze rejestru rozszerzające menu kontekstowe eksploratora. Nieusunięcie go spowoduje opuszczenie menu. –
Dlaczego został rozszerzony na użytkownika, a nie na maszynę? –
Zaktualizowana odpowiedź na odwołanie do hackowania –