什么是产品代码& UpgradeCode&指南?如何检测用户计算机上是否已安装某些应用程序/库?

时间:2010-05-03 20:05:06

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

我已经经历过:

  

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 DBMS
  2. MySQL .NET Connector
  3. 我发现的一个事实是升级代码&产品代码可以从其“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程序集,检测会变得简单吗?那怎么办?我不想用我部署的文件发送程序集。

2 个答案:

答案 0 :(得分: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);

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

MSDN section on Windows Installer

答案 1 :(得分:3)

ProductCode和UpgradeCode GUID标识您的软件。与第三个代码一起使用PackageCode。

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

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

<强> HKLM \ SOFTWARE \微软\的Windows \ CurrentVersion \卸载
(但要注意,64位计算机上的用户专用和 32位WOW软件还有另外两个键。)

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

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

  1. 如果您通过修补程序进行更新,请不要更改其中的任何内容。

  2. 如果要进行包含所有文件的完整更新,请执行所谓的重大升级 (还有其他可能性,但这是最舒适的,特别是初学者)。 a)更改您的ProductCode进行主要升级。

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

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

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