【问题标题】:What are ProductCode & UpgradeCode & GUID? How to detect if certain application/library is already installed on the user machine?什么是 ProductCode & UpgradeCode & GUID?如何检测用户机器上是否已经安装了某些应用程序/库?
【发布时间】:2011-02-15 04:38:58
【问题描述】:

我已经通过了:

Check if the application is already installed

Detecting if a program is already installed with NSIS

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

我的问题更深入一点,也更笼统一些。

所以,正如您所理解的,我的问题是我想检查“确定 应用程序”已经安装在用户的机器上?我正在使用Advanced Installer 生成安装程序。

前几个问题:

  • 什么是Upgrade Code?高级安装程序有选项,产品版本(由升级代码标识)
  • 什么是Product Code?高级安装程序产品版本(按产品代码标识)
  • 组件已安装:GUID。什么是 GUID?

以上三个都有这样的值:

{49EB7A6A-1CEF-4A1E-9E89-B9A4993963E3} 我不知道这些值是什么,但似乎计算机正在使用这种奇怪的 ID 识别软件。

我需要的应用程序是

  1. MySQL 数据库管理系统
  2. MySQL .NET 连接器

我发现的一个事实是升级代码和产品代码可以从它的“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 程序集,检测会变得简单吗?那怎么办?我不想将程序集与我部署的文件一起发送。

【问题讨论】:

    标签: .net installation windows-installer nsis advanced-installer


    【解决方案1】:

    ProductCode 和 UpgradeCode GUID 标识您的软件。连同第三个代码,PackageCode。

    除了上面提到的干净 API 方式,当然也可以在注册表中检测到这些代码。 在某些地方,它们有点“改变”,这是真的,但这不是加密,只是数字重新排序,例如在 HKCR\Installer 下。很容易破译,我认为网络中的任何地方都有示例代码。 10 班左右。

    以“未加密”的方式,您可以在此处找到已安装软件的 ProductCode:

    HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall
    (但请注意,对于用户特定和 64 位机器上的 32 位 WOW 软件,还有另外两个键。

    不建议使用其代码检测应用程序,因为这些代码可能会在更新时发生变化。如果使用一个,UpgradeCode 会更安全,因为它更改较少,但不够安全。查找包含公司名称和软件版本的注册表路径!

    更多知识:
    ProductCode 是 MSI 设置的主要标识。设置作者的这些代码(ProductCode、UpgradeCode)的拇指规则是:

    1. 如果您通过补丁进行更新,请不要更改其中任何一个。

    2. 如果要进行包含所有文件的完整更新,请进行所谓的重大升级。
      (还有其他可能,但这是最舒服的一种,尤其是对于初学者)。 a) 更改您的 ProductCode 以进行重大升级。

    3. 不要更改任何升级的 UpgradeCode,除非您希望新版本可以与旧版本并行安装。在微星“思考”中,它是一个全新的产品(更好理解为升级路径/树)。

    4. 如果您更改 UpgradeCode,请始终更改 ProductCode

    5. 通常不关心 PackageCode。一个好的构建工具会在构建时将其更改为随机的新 GUID。要对该版本进行安装测试,可能需要先卸载旧版本或了解有关 MSI 的更多信息(此处:小型/次要升级)。

    【讨论】:

      【解决方案2】:

      UpgradeCode 表示具有不同版本的产品。

      ProductCode 表示产品的版本。

      例如,理论上,Microsoft Word 2003 有一个 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 的信息:

      MSDN section on Windows Installer

      【讨论】:

        猜你喜欢
        • 2011-07-01
        • 1970-01-01
        • 2010-10-04
        • 1970-01-01
        • 2010-11-24
        • 1970-01-01
        • 2016-05-02
        • 2016-11-27
        • 1970-01-01
        相关资源
        最近更新 更多