什么是ProductCode和UpgradeCode&GUID?如何检测用户计算机上是否已安装某些应用程序/库?

cla*_*aws 9 .net installer windows-installer nsis advanced-installer

我已经经历过了:

检查应用程序是否已安装

检测程序是否已安装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 DBMS
  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}
Run Code Online (Sandbox Code Playgroud)

从以上数据观察:

  • 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) = ????
Run Code Online (Sandbox Code Playgroud)

上述数据的观察:

  • 令人惊讶的是,它无法从mysql.data.*.msi的安装程序中找到UpgradeCode.我想知道为什么?这与我上面的观察相矛盾.
  • ProductCode所有不同的版本在这里是相同的.这再次与我的上述观察相矛盾.
  • 我还是不知道如何找到GUID.

现在,

  • 究竟是这些ProductCode&UpgradeCode&GUID.
  • 哪个表示什么?
  • 为什么上面的观察结果是矛盾的?
  • 我不关心版本.我不想依赖于Application Name,那我该如何检查MySQL驱动程序和MySQL ADO .NET.
  • 如果它们是.NET程序集,检测会变得简单吗?那怎么办?我不想用我部署的文件发送程序集.

Wil*_*ara 13

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);
Run Code Online (Sandbox Code Playgroud)

要检查并查看用户计算机上是否已安装产品,您可以使用上述MsiEnumRelatedProducts().我认为你在StackOverflow的答案中提出的问题要多得多.考虑更多关于MSI的研究:

Windows Installer上的MSDN部分


Phi*_*ilm 6

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) 更改主要升级的产品代码。

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

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

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