12

WiX 3.6 を使用して perMachine インストーラーを作成し、開発していないソフトウェアをインストールします。残念ながら、ソフトウェアは実行中に HKCU の下にいくつかのレジストリ キーを作成します。

アンインストール時に、自己作成キーも削除する必要があります。これらのキーを削除するのは簡単ではないようです。私は ICE57 および/または ICE38 と「格闘」しています。両方とも、perUser と perMachine のデータの混在について不平を言っています。

うまくいけば、この問題を解決するための正しい方向に私を向けることができます.

4

2 に答える 2

9

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

最後の注意事項: この Active Setup に関するすべての問題には、2 つの小さな問題があります。Windows ターミナル サーバーには注意してください。現在の .MSI の 1 人のユーザーに対してアクティブ セットアップが実行されると、PackageConde を変更するか、ActiveSetup レジストリ キーの下でバージョンを上げない限り、同じパッケージを再インストールすることを決定しても、再度実行されることはありません。これらは別の日のトピックです。明確にする必要がある場合はお知らせください。

上記のすべてのコンポーネントをフィーチャーに追加することを忘れないでください。

于 2012-11-23T14:09:27.103 に答える
1

Windowsインストーラーはこのユーザーデータを考慮し、ベストプラクティスはそれを削除しないことです。いずれにせよ、他のユーザープロファイルはスコープ/コンテキスト外であるため、とにかくそれを削除しようとすることは非常に困難です。理論的には、プロファイルを列挙してレジストリハイブをロードするカスタムアクションを作成することは可能ですが、Windowsインストーラーサービスに付与されたアクセス許可が制限されているために機能しないバージョンのWindows(Vista)もあります。

本当に、アンインストール時にカスタムアクションデータを削除できる必要がある場合は、以下を参照してください。

アクティブセットアップの説明

コンポーネントを永続的なものとしてマークすることにより、プログラム(たとえばexe)を残す必要があります。次に、アンインストール中にレジストリ値を書き込むためのカスタムアクションが必要になります(Windowsインストーラーはこれをサポートしていないため)。

コンセプトは、インストール中にEXEを配置し、アンインストール中にそのままにしておくことです。次に、ActiveSetupレジストリキーに書き込み、後続のユーザーがマシンにログオンするたびにEXEを1回実行するように指示します。次に、EXEはレジストリ値を削除します。エクスプローラーから拡張機能をアンロードする必要がある場合は、(丁寧に)再起動します。

しかし、正直なところ、より適切に設計されたアプリケーションでは、これらすべてが必要になるわけではありません。

于 2012-11-23T02:30:49.637 に答える