12

私はすでに経験しました:

アプリケーションが既にインストールされているかどうかを確認する

NSIS でプログラムが既にインストールされているかどうかを検出する

http://nsis.sourceforge.net/Add_uninstall_information_to_Add/Remove_Programs

私の質問はもう少し深く、もう少し一般的です。

それで、あなたが私の問題を理解しているように、「特定のアプリケーション」がユーザーのマシンに既にインストールされているかどうかを確認したいのですか? Advanced Installerを使用してインストーラーを生成しています。

最初のいくつかの質問:

  • とはUpgrade Code? 高度なインストーラーにはオプション、製品バージョンがあります (アップグレード コードで識別)
  • とはProduct Code? 高度なインストーラーの製品バージョン (製品コードで識別)
  • コンポーネントがインストールされています: GUID。GUID とは何ですか?

上記の 3 つすべてには、次のような値があります。

{49EB7A6A-1CEF-4A1E-9E89-B9A4993963E3} これらの値が何であるかはわかりませんが、コンピューターはこの種の奇妙な ID を使用してソフトウェアを認識しているようです。

私の必要なアプリケーションは

  1. MySQL データベース
  2. MySQL .NET コネクタ

私が発見した1つの事実は、アップグレードコードと製品コードが「msiインストーラー」から抽出できることです。したがって、これらの値をインストーラーとレジストリから抽出しました。

MySQL サーバー

Installer = mysql-5.1.43-win32.msi 
Upgrade Code = {49EB7A6A-1CEF-4A1E-9E89-B9A4993963E3}
Product Code = {0ECED7D8-FF53-4DC9-958E-C2177F528DE4}
GUID (for component Installed) = ????
Uninstall Path = HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\{0ECED7D8-FF53-4DC9-958E-C2177F528DE4}

Installer = mysql-5.1.46-win32.msi
Upgrade Code = {49EB7A6A-1CEF-4A1E-9E89-B9A4993963E3}
Product Code = {EA8FDE5A-2B33-4EDD-B7E7-8D179DF731A5}
GUID (for component Installed) = ????
Uninstall Path = HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\{EA8FDE5A-2B33-4EDD-B7E7-8D179DF731A5}

Installer = mysql-essential-5.1.46-win32.msi
Upgrade Code = {49EB7A6A-1CEF-4A1E-9E89-B9A4993963E3}
Product Code = {AD33AF2C-6485-4106-B012-1D9CDC88A454}
GUID (for component Installed) = ????
Uninstall Path = HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\{AD33AF2C-6485-4106-B012-1D9CDC88A454}

Installer = mysql-essential-5.0.89-win32.msi
Upgrade Code = {49EB7A6A-1CEF-4A1E-9E89-B9A4993963E3}
Product Code = {9A4DA7EF-A7B9-4282-90AD-10976AA24E69}
GUID (for component Installed) = ????
Uninstall Path = HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\{9A4DA7EF-A7B9-4282-90AD-10976AA24E69}

上記のデータからの観察:

  • UpgradeCodeソフトウェアのバージョンは一定であり、バージョンに関係ありません。しかし驚くべきことに、レジストリには次の値を持つ単一のエントリはありません。UpgradeCode
  • ProductCodeバージョン固有であり、MSI によって内部的に使用されているため、実際には合理的です。MSI では、異なるバージョンのアプリケーションを並べてインストールできます。
  • GUID の検索方法がわかりません。

MySQL ADO .NET ドライバー

Installer = mysql.data.5.2.5.msi
Upgrade Code = --- 
Product Code = {5FD88490-011C-4DF1-B886-F298D955171B}
GUID (for component Installed) = ????

Installer = mysql.data.6.2.2.msi
Upgrade Code = ---
Product Code = {5FD88490-011C-4DF1-B886-F298D955171B}
GUID (for component Installed) = ????
UninstallPath =HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\{5FD88490-011C-4DF1-B886-F298D955171B}
Installer =  mysql.data.6.2.3.msi
Upgrade Code = ---
Product Code = {5FD88490-011C-4DF1-B886-F298D955171B}
GUID (for component Installed) = ????

上記のデータからの観察:

  • 驚くべきことに、mysql.data.*.msi のインストーラーから UpgradeCode を見つけることができませんでした。なぜだろう?これは私の上記の観察と矛盾します。
  • ProductCodeここでは、すべての異なるバージョンで同じです。これもまた、私の上記の観察と矛盾します。
  • GUIDを見つける方法はまだわかりません。

今、

  • これらProductCode& UpgradeCode&は正確には何ですかGUID
  • どれが何を表している?
  • 上記の観察が矛盾しているのはなぜですか?
  • バージョンは気にしません。アプリケーション名に依存したくない場合は、MySQL ドライバーと MySQL ADO .NET を確認する方法を教えてください。
  • .NET アセンブリの場合、検出は簡単になりますか? ではどうすれば?展開したファイルと一緒にアセンブリを出荷したくありません。
4

2 に答える 2

18

UpgradeCode は、異なるバージョンの製品を示します。

ProductCode は、製品のバージョンを示します。

たとえば、理論的には、Microsoft Word 2003 には 1 つの ProductCode があり、Word 2007 には別の ProductCode があります。ただし、一方から他方にアップグレードできるため、Word 2003 と 2007 は同じ UpgradeCode を共有します。

GUID は、単にグローバル一意識別子を意味します。これは、地球上で一意であるはずの数字と文字の大きな文字列です。

UpgradeCodes と ProductCodes はレジストリに保持されますが、非表示で暗号化されているため、クエリを実行するにはツールを使用する必要があります。例えば:

MsiGetProductInfo(ProductCode, INSTALLPROPERTY_VERSIONSTRING, lpVerName, &cchVerName);
MsiEnumRelatedProducts(UpgradeCode, 0, 0, ProductCode);

製品がユーザーのマシンに既にインストールされているかどうかを確認するには、上記のように MsiEnumRelatedProducts() を使用できます。StackOverflowの回答で回答できる以上のことを求めていると思います。MSI についてさらに学習することを検討してください。

Windows インストーラーの MSDN セクション

于 2010-05-03T22:10:04.530 に答える
8

ProductCode および UpgradeCode GUID は、ソフトウェアを識別します。3 つ目のコードである PackageCode.

前述のクリーンな API の方法に加えて、もちろん、これらのコードをレジストリで検出することも可能です。一部の場所では少し「変更」されていますが、これは本当ですが、これは暗号化ではなく、番号の並べ替えのみです。たとえば、HKCR\Installerの下にあります。解読するのは非常に簡単で、ネットのどこにでもサンプル コードがあると思います。10ライナーくらい。

「暗号化されていない」方法では、インストールされているソフトウェアの ProductCode をここで見つけることができます。

HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall (ただし、ユーザー固有のキーと64 ビット マシン上の 32 ビット WOW ソフトウェア
用のキーが他に 2 つあります)。

コードを使用してアプリケーションを検出することはお勧めしません。これは、更新の際にコードが変更される可能性があるためです。これを使用する場合、UpgradeCode は変更が少ないため安全ですが、十分に安全ではありません。会社名とソフトウェアのバージョンを含むレジストリ パスを探してください。

追加情報:
ProductCode は、MSI セットアップの主要な ID です。セットアップ作成者向けのこれらのコード (ProductCode、UpgradeCode) の経験則は次のとおりです。

  1. パッチによる更新を行っている場合は、いずれも変更しないでください。

  2. すべてのファイルを含む完全な更新を行いたい場合は、いわゆるメジャー アップグレードを行います。
    (他にも可能性はありますが、特に初心者にとってはこれが最も快適です)。a) メジャー アップグレードの ProductCode を変更します。

  3. 新しいバージョンを古いバージョンと並行してインストールできるようにする場合を除いて、すべてのアップグレードの UpgradeCode を変更しないでください。MSI の「考え方」では、完全に新しい製品です (アップグレード パス/ツリーとして理解しやすい)。

  4. UpgradeCode を変更する場合は、必ず ProductCode を変更してください

  5. 通常、PackageCode は気にしません。優れたビルド ツールは、ビルドごとにランダムな新しい GUID に変更します。そのビルドでインストール テストを行うには、古いビルド バージョンを最初にアンインストールするか、MSI について詳しく知る必要がある場合があります (ここでは、小規模/マイナー アップグレード)。

于 2013-08-06T22:13:02.387 に答える