2012-11-22 9 views
12

Costruisco un programma di installazione di perMachine usando WiX 3.6 per installare un software che non avevo sviluppato. Sfortunatamente il software crea alcune chiavi di registro sotto HKCU durante l'esecuzione.Rimuovi chiavi di registro sotto HKCU su un'installazione per macchina

Dopo la disinstallazione, è necessario rimuovere anche le chiavi create automaticamente. Non sembra così facile rimuovere queste chiavi. Sto "combattendo" con ICE57 e/o ICE38. Entrambi lamentano il mix tra i dati perUser e perMachine.

Spero che tu possa indicarmi la giusta direzione per risolvere questo problema.

risposta

9

Per superare ICE si dovrebbe spostare registro per utente per separare i componenti e utilizzare alcuni voce di registro come percorso chiave per tale componente, vale a dire:

<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> 

Sono completamente d'accordo con Christopher: E 'pratica comune di lasciare per -utente dati sulla disinstallazione, ma se la rimozione è necessaria, quindi l'installazione attiva è l'unica opzione reale.

In primo luogo propongo di rimuovere loro su Installa o reinstallare invece di disinstallazione, è sufficiente aggiungere la voce RemoveRegirty e configurazione attiva, cioè con questo codice 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> 

Nota: [PackageCode] Uso in ActiveSetup è molto raccomandato, quindi con ogni nuova versione (build) del pacchetto MSI si aggiunge una voce separata (vedi anche la mia nota finale). Ho usato il registro di configurazione attivo per utente come percorso chiave di proposito, quindi non lo si esegue per l'utente corrente due volte.

Come per rimuoverli dopo la disinstallazione, Ora, si spera che sia necessario rimuovere l'intera chiave e non solo alcuni valori. In entrambi i casi, vorrei creare un'azione personalizzata per aggiungere la voce del Registro di sistema per l'installazione attiva durante la disinstallazione (o se ci sono molte chiavi/valori, creare e distribuire file .CMD con quelli e avviarlo su disinstallazione, prima dell'azione RemoveFiles, per aggiungere tutto di loro al registro).

Nota: che raccomando vivamente di aggiungere l'eliminazione di questo registro durante l'installazione, o si potrebbe finire per rimuovere i valori per utente quando il software è ancora installato.

Quindi, ecco il codice di WiX per tutto questo:

<CustomAction Id="CA_UninstallRegistryCleanUp" Directory="SystemFolder" ExeCommand="REG.exe ADD &quot;HKLM\SOFTWARE\Microsoft\Active Setup\Installed Components\MySoftName_CleanUp&quot; /v StubPath /d &quot;reg add ^&quot;HKCU\Key\To\Be\Removed^&quot; /va /f&quot; /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> 

Note finali: lì solo due piccoli problemi con tutta questa roba Setup attivo: attenzione su Windows Terminal Server; e una volta che l'installazione attiva è stata eseguita per un utente per il corrente .MSI, non verrà eseguita di nuovo se si decide di reinstallare lo stesso pacchetto, a meno che non si modifichi PackageConde o si rilasci la versione nella chiave di registro ActiveSetup. Questi sono argomenti per un altro giorno, fammi sapere se ne hanno bisogno.

E non dimenticare di aggiungere tutti i componenti di cui sopra ad alcune caratteristiche.

1

Il programma di installazione di Windows considera questi dati utente e la procedura migliore è di non rimuoverlo. In entrambi i casi, è molto difficile provare a rimuoverlo comunque poiché altri profili utente non rientrano nell'ambito di applicazione/contesto. È teoricamente possibile scrivere un'azione personalizzata per enumerare i profili e caricare hive del registro ma su alcune versioni di Windows (Vista) che non funzioneranno a causa delle autorizzazioni limitate concesse al servizio di installazione di Windows.

Se davvero, davvero necessario essere in grado di rimuovere i dati d'azione personalizzato sul disinstallare allora date un'occhiata a:

Active Setup Explained

che si sta per bisogno di lasciarsi alle spalle un programma (exe per esempio) contrassegnare un componente come permanente. Quindi avrai bisogno di un'azione personalizzata per scrivere un valore di registro durante la disinstallazione (perché Windows Installer non supporta questo).

Il concetto è durante l'installazione che si stabilisce un EXE e durante la disinstallazione si lascia. Quindi si scrive sulla chiave del Registro di sistema ActiveSetup indicando di eseguire il file EXE una volta per ciascun utente successivo per accedere alla macchina. L'EXE quindi elimina i valori del registro. Riavviare (educatamente) se necessario per scaricare le estensioni da explorer.

Ma onestamente, un'applicazione progettata in modo migliore non avrebbe bisogno di tutto questo.

+0

Le chiavi di registro che estendono il menu di scelta rapida di Explorer. Non rimuoverlo, risulterà nei menu abbandonati. –

+0

Perché è stato esteso per utente piuttosto che per macchina? –

+0

Risposta aggiornata per includere il riferimento all'hack –

Problemi correlati