2017-12-30 33 views
0

セットアップの古いバージョンは、InstallScope = "PerMachine"で作成されました。 新しいバージョンのインストールには、InstallScope = "PerUser"が含まれています。古いバージョンが作成するレジストリキーと同じレジストリキーを使用する必要があります。アップグレード時のレジストリの問題

問題は、アップグレード中にこれらのレジストリキーの下に格納されている値はすべて、古いバージョンによって保存された初期値で最後に上書きされることです。インストールの前に手動でこれらのキーを削除しても、インストールプロセス後にそれらのキーが(間違った値で)再表示されます。

私はカスタムアクションを作成しようとしましたが、これらのキーは特に削除しましたが、結果は同じです。

古いバージョンが新しいバージョンのインストールプロセスを妨げないようにして、古いレジストリキーを削除して再作成できるようにするにはどうすればよいですか?

は正しい結果が得られます新しいバージョンをインストールした直後REPAIRを実行する:私が働いていることが判明何

新しいバージョンをインストールする前に古いバージョンを手動でアンインストールしても、キーは削除されませんが、正しい値で上書きできます。

+0

私はあなたがInstallFinalizeの後にトリックのカスタムアクションでメインインストールが完了した後に、自動的に魔法の修復を行うことができると思います。私はそれを試したことはありませんし、それをお勧めしたくないです。最初に私の答えをお読みください。 –

+0

私が前のコメントで言ったように、私は本当にそれをお勧めしたくありませんが、InstallFinalizeの後にカスタムアクションを試すことができます。これは '' msiexec.exe/fum [ProductCode]/qn''です。これで、完了したセットアップの修復が静かに開始されます。テストのために ''/qn''を非サイレントにするために削除する - [msiexec.exeコマンドライン情報](https://msdn.microsoft.com/en-us/library/windows/desktop/aa367988%28v) = vs.85%29.aspx) - ''/f''は指定された製品を修復し、 '' um''はユーザーとマシンのレジストリキーを書き換えます。 –

+0

OK、私は上記のコメントを削除する必要がありますが、私はそれらを今のところ残しておきます。この方法は実行されても動作しますが、UIシーケンスから実行する場合に限ります(つまり、セットアップがサイレントモードでインストールされている場合はまったく動作しません)。不適切な調整に関連する多くのリスクもあります。たとえば、アップグレード中にユーザーデータが予期せずレジストリにリセットされる可能性があります。まったくお勧めしません。代わりに以下の提案を読んで、より安定したソリューションをお試しください。 –

答えて

1

おそらく主な問題は、クロスコンテキストメジャーアップグレードということです...

をあなたは何をしているかの種類のアップグレード定義する必要があり、それはそれはあなたのメジャーアップグレード要素において配列決定されたメジャーアップグレードだ場合、もののWindowsインストーラではサポートされていないため、メジャーアップグレードを行っている場合は、両方の製品がインストールされた状態になります。これはアップグレードではなく、衝突の可能性が最も高いです。したがって、これらのうちの1つだけをこの末尾にインストールすることを前提とすると、古いマシン単位のインストールをアンインストールしてから、ユーザーごとにインストールする必要があります。マシンごとの製品をアンインストールしてもレジストリキーが削除されない理由については、MSIではなくアプリケーションによって作成されたもの、コンポーネントが永久にマークされたもの、コンポーネントに別のクライアントがあるものなど、システム上の製品 - アンインストールのログには、何が起こっているのかが表示されることがあります。

+0

非常に良い点ですが、これは別の方法で問題になったと思いましたか?私は本当に正しく覚えていない。ユーザー単位からマシン単位のインストールまでその後、メジャーアップグレードを実行するには、トリックを使用する必要があります。[**メジャーアップグレード中にユーザーごとからマシンごとにインストールする**](https://stackoverflow.com/questions/12110987)/windows-installer-uninstalling-former-versions-versions-different-in-in/12291807#12291807)。それはInstallshield用ですが、問題が非常に重要であればWiXでも同じことができると思います。 –

+0

質問に記載されている問題は、「perMachine」から「perUser」に切り替えることを指していますが、実際の問題はアンインストールプロセスの前に手動で削除しても古いバージョンをアンインストールすると元の状態に戻れることです。 – Andy

+0

アンインストールされた製品は自己修復することはできません。そのため、機能のすべてのコンポーネントのコンポーネントIDがわからないと状況が正確には推測できません(修復は機能レベルに移行するため)。 idsは永久にマークされていたか共有されているなど、十分な情報がありません。修復によってMsiInstallerエントリ(アプリケーションイベントログ)が作成され、MSIログポリシーを有効にするとログが作成され、修復中の製品とコンポーネントが正確に示されます。 – PhilDW

1

私は答えとしてこれをコメントとして追加する必要があります。

  • なぜユーザー単位のインストールに切り替えたいのですか? MSIの世界では、これは理想的な方法ではありません。アプリケーションは、マシンごとにインストールされていても使用できます。マシン単位のインストールでは、ユーザーが上書きしてはならない共有設定を書き込む機能を追加するだけです。また、アプリケーション全体のアップグレード、アンインストール、パッチ適用、管理が簡単です。

  • ここでは、ユーザーごとの設定に関するいくつかの問題を説明するためのリンクをいくつか追加しています。彼らは本当です、私は、彼らが最も可能性が高い(ほぼ確実に直面しようとして)直面しようとしているどのような問題の人々に警告しようとしています:

  • をあなたはHKCUを展開していますまたはHKLMキー?私はセットアップからのHKCU値を書くことをお勧めしません、彼らはアプリケーション自体によって書かれるべきです。セットアップは、HKLMや「権限の昇格」を必要とする他の場所への書き込み用です。これは決してユーザーの好みを書くのに使用すべきではありません。あなたがアップグレードを行うとき(経験したように)干渉があります。

  • 保存したレジストリデータはどこにありますか?単一のMSIコンポーネントまたはいくつかの?まだレジストリキーなしでインストールする必要があるコンポーネントはありますか?可能であれば、ソースWiXファイルを追加して、わかりやすく確認してください。

私たちのアドバイスに正確に従えば、これらの問題をすべて解決できると確信しています。あなたは非常に一般的なMSIの問題に直面しています。

は私がすべての情報を持たずに仮の答えをしようとしてみましょう:

  1. (できれば)、セットアップからすべてのHKCUレジストリ情報を削除します。
  2. これらのHKCU値自体を書き込むようにアプリケーションを更新し、理想的には古いものではなくレジストリの新しい場所に書き込みます。たとえば、HKCU\Software\MyCompany\MyAppの代わりにHKCU\Software\MyCompany\MyApp\5とします。これはあなたの古い状態と新しい状態を「切り離し」ます。あなたは物事を操作してクリーンアップする余裕があります。
  3. アプリケーションにHKCUキーを書き込ませることはハックではなく、正しいことです。それはあなたとあなたのチームのために、あなたのアプリケーションをはるかに堅牢にし、QAを簡単にします。テスト中に "スレートをきれいにする"ことができ、アプリケーションのテストに集中するために、再インストールすることなくやり直すことができます。
  4. 残りのHKLM設定を1つのWiXコンポーネントに置き、ユーザーや他のプロセスによって変更または削除されない適切なキーパスを設定します。例:HKLM\Software\MyCompany\MyApp\5\MyAppHKLMKeyPath = 1
  5. 各ユーザーの値を上書きする(つまり、HKCUのすべてのユーザーに対して何かを変更する)必要があることが判明した場合は、この方法でセットアップを実行します:http://forum.installsite.net/index.php?showtopic=21552(これが重要な場合は、リンクされたスレッド全体をお読みください)。
+0

プラグインであるため、アプリケーションにキーを書き込ませることはできません。スタンドアロンの実行可能ファイルではありません。モジュールをターゲットアプリケーションに登録するにはレジストリキーが必要です。私が望むのは、古いバージョンの登録を解除することだけです。関連するレジストリキーを再利用したり削除したりすることで、私はこれを行うことができます。どちらも動作しません... – Andy

+0

OK、わかりました。何が起きているのかを知るには、ソースまたは少なくともレジストリキーを見ることが非常に役に立ちます。これはMS Office用ですか?また、私が上で提供したリンクを読んで、ユーザーごとの設定の危険に慣れてください。彼らは悪夢になることがあります。 –

関連する問題