首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >ProductCode & UpgradeCode & GUID是什么?如何检测用户计算机上是否已经安装了某些应用程序/库?

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

Stack Overflow用户
提问于 2010-05-03 20:05:05
回答 2查看 12.9K关注 0票数 12

我已经经历过:

检查应用程序是否已经安装。 检测程序是否已与NSIS一起安装 程序

我的问题不够深入,也不够笼统。

因此,正如您所理解的,我的问题是我想检查“某些应用程序”是否已经安装在用户的计算机上?我正在使用高级安装程序生成安装程序。

前几个问题:

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

上述三种方法都有这样的值:

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

我需要的应用程序是

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

我发现的一个事实是升级代码&产品代码可以从它的"msi安装程序“中提取出来。因此,我从安装程序和注册表中提取了这些值。

MySQL服务器

代码语言:javascript
运行
复制
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允许并行安装不同版本的应用程序。
  • 我不知道怎么找到吉德。

MySQL ADO .NET驱动程序

代码语言:javascript
运行
复制
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) = ????

来自上述数据的意见:

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

现在,

  • 这些ProductCode & UpgradeCode & GUID到底是什么?
  • 这表示什么?
  • 为什么上述观察结果与此相矛盾?
  • 我不在乎版本。我不想依赖于应用程序名称,那么如何检查MySQL驱动程序& MySQL ADO .NET。
  • 如果它们是.NET程序集,检测会变得简单吗?那怎么办呢?我不想将程序集与我已部署的文件一起传送。
EN

回答 2

Stack Overflow用户

发布于 2010-05-03 22:10:04

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

ProductCode表示产品的一个版本。

例如,理论上Microsoft 2003有一个ProductCode,Word 2007有一个不同的。但是,Word 2003和2007将共享相同的UpgradeCode,因为您可以从一个升级到另一个。

GUID简单地表示全局唯一标识符。这是一大串数字和字母,在这个星球上应该是独一无二的。

UpgradeCodes和ProductCodes保存在注册表中,但是它们是隐藏和加密的,您需要使用工具来查询它们。例如:

代码语言:javascript
运行
复制
MsiGetProductInfo(ProductCode, INSTALLPROPERTY_VERSIONSTRING, lpVerName, &cchVerName);
MsiEnumRelatedProducts(UpgradeCode, 0, 0, ProductCode);

要检查和查看产品是否已经安装在用户的计算机上,您可以使用上面提到的MsiEnumRelatedProducts()。我认为你要求的不仅仅是在StackOverflow回答中所能回答的问题。考虑更多地研究MSI:

Windows安装程序上的MSDN部分

票数 18
EN

Stack Overflow用户

发布于 2013-08-06 22:13:02

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,除非您希望新版本可以与旧版本并行安装。在MSI“思考”中,这是一个全新的产品(更好地理解为升级路径/树)。
  4. 如果您更改了UpgradeCode,请始终更改ProductCode
  5. 通常不关心PackageCode。一个好的构建工具在每次构建时都会将其更改为一个随机的新GUID。要使用该版本进行安装测试,可能需要先卸载旧版本,或者了解更多有关MSI的信息(此处:小/小升级)。
票数 9
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2760849

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档