ICE を克服するには、ユーザーごとのレジストリを別のコンポーネントに移動し、そのコンポーネントのキーパスとしていくつかのレジストリ エントリを使用する必要があります。
<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>
私は Christopher に完全に同意します。アンインストール時にユーザーごとのデータを残すのが一般的ですが、削除が必要な場合は、Active Setup が唯一の現実的なオプションです。
まず、アンインストールではなく、インストールまたは再インストール時にそれらを削除することをお勧めします。必要なのは、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>
注: ActiveSetup で [PackageCode] を使用することを強くお勧めします。そのため、MSI パッケージの新しいバージョン (ビルド) ごとに個別のエントリを追加します (私の最終メモも参照してください)。意図的にユーザーごとのアクティブ セットアップ レジストリをキー パスとして使用したので、現在のユーザーに対して 2 回実行することはありません。
アンインストール後にそれらを削除することについては、いくつかの値だけでなく、キー全体を削除する必要があることを願っています。いずれの場合も、アンインストール中にアクティブ セットアップのレジストリ エントリを追加するカスタム アクションを作成します (または、そのようなキー/値が多数ある場合は、それらを使用して .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 に関するすべての問題には、2 つの小さな問題があります。Windows ターミナル サーバーには注意してください。現在の .MSI の 1 人のユーザーに対してアクティブ セットアップが実行されると、PackageConde を変更するか、ActiveSetup レジストリ キーの下でバージョンを上げない限り、同じパッケージを再インストールすることを決定しても、再度実行されることはありません。これらは別の日のトピックです。明確にする必要がある場合はお知らせください。
上記のすべてのコンポーネントをフィーチャーに追加することを忘れないでください。