web-dev-qa-db-ja.com

別のインストールが進行中であることをWindowsインストーラーサービスに通知するものは何ですか?

Error screenshot

このエラーの通常の修正は、マシンを再起動することです。これにより、実際には通常、問題が修正されます。特に頑固な場合のその他のソリューションには、インストーラーサービスを無効にしてから再起動することが含まれます。

ただし、この質問のために、このエラーはサーバーまたはダウンタイムが許容できない他のシステムで発生していると仮定します。再起動せずにこれを行います。

明らかに、どこかに、インストーラがこのエラーメッセージをスローする前にチェックしているデータが保存されています。別のインストールが進行中であることをインストーラーサービスに通知するいくつかのフラグが存在します。

私が興味を持っているのは、このデータが保存されている場所です

別のインストールが既に進行中であることを正確にインストーラサービスに通知しますか?

14
Mikey T.K.

Windowsインストーラランタイムは、(アン)インストールの特定の段階で、_MSIExecuteという名前のグローバルミューテックスを取得します。 mutexは一度に1つのスレッドのみが所有できます。グローバルmutexの場合、これはシステム全体の1つのスレッドです。ミューテックスの所有権を取得する後続の試みは、現在の所有者が解放するまで失敗します。

ミューテックスは、Windowsカーネルの一時的なオブジェクトです。どの時点でもディスク上のファイルではありません。現在所有しているスレッドが明示的に解放せずに終了すると、ミューテックスは自動的に解放されます。

これは、プログラムの複数のインスタンスが実行されないようにするために一部のプログラムが使用するメカニズムと同じです。


whichプロセスがそのミューテックスを保持しているという他の暗黙の質問に答えるには、Microsoft/Sysinternalsなどのツールを使用できます Process Explorer =または ハンドル ミューテックスを検索します。プロセスエクスプローラーでは、ハンドル検索(Ctrl + F)で表示されます。

プロセスを見つけたら、それをどうするかを決める必要があります。 safestオプションは通常、待機することですが、(アン)インストール手順で何らかの理由で動かなくなった場合は、それを強制終了するしかありません。 。もちろん、それを殺すことは結果をもたらす可能性があります。インストールされていない半分のプログラムをそのままにしておく-MSIはロールバックを保証するはずですが、それらを実行するプロセスが強制終了されると、ロールバックは困難になります。また、一部の手順は完了するまでに非常に長い時間がかかる場合があるため、実際にスタックしているかどうかを判断することも困難です。


以下も参照してください。

22
Bob