Automation OpenView(“从属性中选择'Value',其中'Property`='ProductCode') 查看。执行 设置ProductCode=View.Fetch objDictionary(“ProductCode”)=ProductCode.StringData(1) '从MSI数据库获取升级代码 Set View=oDatabase.OpenView(“从属性中选择'Value',其中'Property`='UpgradeCode') 查看。执行 设置UpgradeCode=View.Fetch objDictionary(“UpgradeCode”)=UpgradeCode.StringData(1) 设置EvaluateMSI=objDictionary 错误转到0 端函数 函数包UID(guid) PackGUID=“” '* 暗温 temp=Mid(guid,2,Len(guid)-2) 暗部 零件=拆分(温度,“-”) 暗箱 pack=“” Dim i,j 对于i=LBound(部分)至UBound(部分) 选择案例一 箱包(部分),箱包(部分)+1,箱包(部分)+2 对于j=Len(第(i部分))至第1步-1 包装=包装和中间(第(i)部分,j,1) 下一个 其他情况 对于j=1到Len(第(i部分))步骤2 包装=包装和中间(第(i)部分,j+1,1)和中间(第(i)部分,j,1) 下一个 结束选择 下一个 '* PackGUID=pack 端函数

Automation OpenView(“从属性中选择'Value',其中'Property`='ProductCode') 查看。执行 设置ProductCode=View.Fetch objDictionary(“ProductCode”)=ProductCode.StringData(1) '从MSI数据库获取升级代码 Set View=oDatabase.OpenView(“从属性中选择'Value',其中'Property`='UpgradeCode') 查看。执行 设置UpgradeCode=View.Fetch objDictionary(“UpgradeCode”)=UpgradeCode.StringData(1) 设置EvaluateMSI=objDictionary 错误转到0 端函数 函数包UID(guid) PackGUID=“” '* 暗温 temp=Mid(guid,2,Len(guid)-2) 暗部 零件=拆分(温度,“-”) 暗箱 pack=“” Dim i,j 对于i=LBound(部分)至UBound(部分) 选择案例一 箱包(部分),箱包(部分)+1,箱包(部分)+2 对于j=Len(第(i部分))至第1步-1 包装=包装和中间(第(i)部分,j,1) 下一个 其他情况 对于j=1到Len(第(i部分))步骤2 包装=包装和中间(第(i)部分,j+1,1)和中间(第(i)部分,j,1) 下一个 结束选择 下一个 '* PackGUID=pack 端函数,automation,wix,installation,windows-installer,Automation,Wix,Installation,Windows Installer,如果需要在弹出窗口中复制和粘贴任何GUID,我倾向于使用后续的输入框,如“inputbox”“”,MSIDetails,这是一种非常复杂的解决方法,其好处是不必按照先前的解决方法重新安装应用程序。这要求您有权访问msi(或嵌入msi的setup.exe) 如果您有Visual Studio 2012(或其他版本)并安装了免费的“InstallShield LE”,则可以使用InstallShield创建新的安装项目 “组织设置”步骤中的一个配置选项称为“升级路径”。打开升级路径的属性,在左窗格中

如果需要在弹出窗口中复制和粘贴任何GUID,我倾向于使用后续的输入框,如“
inputbox”“”,MSIDetails

,这是一种非常复杂的解决方法,其好处是不必按照先前的解决方法重新安装应用程序。这要求您有权访问msi(或嵌入msi的setup.exe)

如果您有Visual Studio 2012(或其他版本)并安装了免费的“InstallShield LE”,则可以使用InstallShield创建新的安装项目

“组织设置”步骤中的一个配置选项称为“升级路径”。打开升级路径的属性,在左窗格中右键单击“升级路径”并选择“新建升级路径”。。。现在浏览到msi(或包含msi的setup.exe)并单击“打开”。升级代码将在右侧窗格的“设置”页面中为您填充,您现在可以看到该页面。

使用以下命令向所有人发送:

Get-WMIObject win32_product
您应该知道,这将在PC上安装的每个MSI应用程序上运行self-heal。如果您要检查eventvwr,它将说它已完成每个产品的重新配置

在这种情况下,我使用以下方法(Yan Sklyarenko方法的混合):

您将获得以下信息:

PS D:\SCCM> $WantedApp.PSChildName
{047904BA-C065-40D5-969A-C7D91CA93D62}
如果您的组织在安装应用程序时使用大量MST,您可能希望避免运行自愈包,因为它们会还原一些关键设置

  • 注意-这将找到您的产品代码,然后可以找到Yan提到的升级。不过,我通常只使用“InstEd It!”或者“Orca”,然后转到MSI的属性表,它会在顶部列出它们

如果您没有msi并且需要升级代码,而不是产品代码,那么答案如下:

在使用PowerShell 5的Windows 10预览版中,我可以看到您可以执行以下操作:

$info = Get-Package -Name YourInstalledProduct
$info.Metadata["ProductCode"]
不熟悉,甚至不确定是否所有产品都有升级码,但根据本文,您需要从以下注册表路径搜索升级码:

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Installer\UpgradeCodes

不幸的是,注册表项值是ProductCode,注册表项是UpgradeCode。

如果有人想要安装应用程序包代码,只需在命令提示符下使用您的应用程序名称执行下面的命令即可。您将获得产品代码和包装代码


wmic产品,其中“像“%YOUR_APPLICATION”\u Name%”这样的名称获取IdentificationNumber,PackageCode

您的应用程序是用什么语言开发的?+1用于查找给定产品的GUID的简单方法!谢谢虽然这是一个令人印象深刻的解决方法,可以解决缺少好工具的问题,但这听起来像是一个可怕的练习,充满了潜在错误的来源。有了Powershell,我们在没有任何第三方工具的情况下有了更好的方法。哎呀,这是一种麻烦且具有潜在破坏性和危险性的发现方法。我更喜欢下面@ssdi的非侵入式Orca方法。该PowerShell脚本也应该有帮助。使用PowerShell可以获得升级代码和产品代码以及软件包名称的完整列表:。这将为您提供真实的MSI数据库值,而无需任何手动注册表查找或黑客攻击。
此帖子
不是有效的URL。升级代码只能通过WMI进行如下检索:
SELECT*FROM Win32_属性,其中Property='UpgradeCode'和ProductCode='{YourProdGuid}'
。请参阅此答案:(底部的VBScript)。当访问Win32_产品时,将运行包完整性检查。除非在任何MSI包中找到损坏的组件密钥路径,否则不会触发自修复。但是,这种完整性检查确实会使数据的检索速度慢得令人痛苦。
$Reg = @( "HKLM:\Software\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall\*", "HKLM:\Software\Microsoft\Windows\CurrentVersion\Uninstall\*" )
$InstalledApps = Get-ItemProperty $Reg -EA 0
$WantedApp = $InstalledApps | Where { $_.DisplayName -like "*<part of product>*" }
$WantedApp.PSChildName
PS D:\SCCM> $WantedApp.PSChildName
{047904BA-C065-40D5-969A-C7D91CA93D62}
$info = Get-Package -Name YourInstalledProduct
$info.Metadata["ProductCode"]
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Installer\UpgradeCodes