如何在Windows 7中查找已安装应用程序的UpgradeCode和ProductCode
我的机器上安装了一个应用程序。 我也有它的源代码,但不知怎的,这个应用程序的ProductCode和UpgradeCode被改变了。
现在我想获得这个安装的应用程序的UpgradeCode和ProductCode。 我觉得必须有一些工具。
任何人都可以让我知道如何获得安装的应用程序的UpgradeCode和ProductCode?
重要提示 : 自从这个答案最初发布以来已经有一段时间了,聪明的人提出了更明智的答案。 检查如何find已安装的MSI文件的升级代码? 从@斯坦Åsmul如果你需要一个坚实和全面的方法。
这是另一种方式(你不需要任何工具):
- 打开系统registry并search
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall
键(如果它是64位机器上的32位安装程序,则可能位于HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall
代替)。 - 该密钥下列出的GUID是本机上安装的产品
- find你正在谈论的那个 – 只要一步一步,直到你在右边的窗格上看到它的名字
您停止的这个GUID是ProductCode。
现在,如果您确定重新安装此应用程序将会正常,您可以运行以下命令行:
msiexec / i {PRODUCT-CODE-GUID-HERE} REINSTALL = ALL REINSTALLMODE = omus / l * v log.txt
这将“修复”你的应用程序。 现在看看日志文件并search“UpgradeCode”。 这个值在那里倾倒。
注意:如果您确定重新安装stream程已正确实施并且不会损坏已安装的应用程序,则应该只执行此操作。
返回结果需要一些时间,很容易几十秒,但是wmic运作良好,可以编写脚本:
wmic product where "Name like '%Word%'" get Name, Version, IdentifyingNumber
结果:
IdentifyingNumber Name Version {90140000-001B-0409-0000-0000000FF1CE} Microsoft Office Word MUI (English) 2010 14.0.6029.1000
IdentifingNumber
是ProductCode。 我没有看到UpgradeCode的属性,但也许它可能被埋在别的东西之下。 有关其他许多示例,请参阅http://quux.wiki.zoho.com/WMIC-Snippets.html , 其中包括卸载 :
wmic path win32_product where "name = 'HP Software Update'" call Uninstall
给大家使用:
Get-WMIObject win32_product
您应该意识到,这将在PC上安装的每个MSI应用程序上自行修复。 如果你要检查eventvwr,它会说它已经完成重新configuration每个产品。
在这种情况下,我使用以下(燕Sklyarenko的方法的混合物):
$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>*" }
现在,如果你要input:
$WantedApp.PSChildName
你会得到以下几点:
PS D:\SCCM> $WantedApp.PSChildName {047904BA-C065-40D5-969A-C7D91CA93D62}
如果您的组织在安装应用程序时使用了大量MST,则您将希望避免运行自我修复套件,从而恢复一些关键的设置。
- 注 – 这会find你的产品代码,然后升级可以find严提到的。 不过,我通常使用“InstEd It!”。 或“Orca”,然后去MSI的属性表,它列在右上方。
如果你有MSI安装程序打开它与Orca(工具从微软),表属性(行升级代码,产品代码,产品版本等)或表升级列升级代码。
尝试通过registryfindinstller:HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ Windows \ CurrentVersion \ Uninstall查找所需的子项并观看值InstallSource。 也许一路上你将能够findMSI文件。
Powershell相当方便地处理这样的任务:
$productCode = (gwmi win32_product | ` ? { $_.Name -Like "<PRODUCT NAME HERE>*" } | ` % { $_.IdentifyingNumber } | ` Select-Object -First 1)
然后,您可以使用它来获取卸载信息:
$wow = "" $is32BitInstaller = $True # or $False if($is32BitInstaller -and [System.Environment]::Is64BitOperatingSystem) { $wow = "\Wow6432Node" } $regPath = "HKEY_LOCAL_MACHINE\SOFTWARE$wow\Microsoft\Windows\CurrentVersion\Uninstall" dir "HKLM:\SOFTWARE$wow\Microsoft\Windows\CurrentVersion\Uninstall" | ` ? { $_.Name -Like "$regPath\$productCode" }
在使用PowerShell 5进行 Windows 10预览版本构build时,我可以看到您可以执行以下操作:
$info = Get-Package -Name YourInstalledProduct $info.Metadata["ProductCode"]
甚至不知道是否所有的产品都有UpgradeCode,但是 根据这个职位 您需要从此registrypathsearchUpgradeCode:
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Installer\UpgradeCodes
不幸的是,registry键值是ProductCode,registry键是UpgradeCode。
您可以使用MsiEnumProductsEx和MsiGetProductInfoEx方法来枚举系统上的所有已安装的应用程序,并将数据匹配到您的应用程序
另一种方法 – 太复杂的解决方法,与不需要重新安装应用程序的好处,因为需要以前的解决方法。 这就要求你可以访问msi(或embedded了msi的setup.exe)。
如果您有Visual Studio 2012(或其他版本)并安装免费的“InstallShield LE”,那么您可以使用InstallShield创build一个新的安装项目。
“组织安装”步骤中的一个configuration选项称为“升级path”。 打开升级path的属性,在左侧窗格中右键单击“升级path”并select“新升级path”…现在浏览到msi(或包含msi的setup.exe),然后单击“打开”。 升级代码将在您现在应该看到的右侧窗格的设置页面中为您填充。
在看到Yan Sklyarenko的解决方法 (当前)之前,没有find从已安装的应用程序中findUpgradeCode的方法 。 但是,如果你/其他人会find一种方法(至less)从MSI中findUpgradeCode和ProductCode,请继续阅读。
从http://www.dwarfsoft.com/blog/2010/06/22/msi-package-code-fun/ ,修改为允许(当启动wscript.exe
)每个MSI信息一个popup框(Trilicated在1023由于wscript.echo
限制); 能够从GUI和CLIinputMSI; 一些基本的人类inputvalidation; 删除debugging代码('Set oDatabase')和1个错误修复(DB.OpenView)。
'Created by: Chris Bennett 'Created Date: 22/06/2010 'Description: ' Opens up MSI file(s) Passed as Arguments & returns ProductName, ProductCode, ' The HKCR key created from ProductCode (a Packed GUID of ProductCode), the ' PackageCode and the UpgradeCode of the MSI. Much quicker than getting these ' out of the MSI's the Manual Way.
参考文献:
http://msdn.microsoft.com/en-us/library/aa369794%28VS.85%29.aspx http://www.eggheadcafe.com/forumarchives/platformsdkmsi/Jan2006/post25948124.asp
if wscript.arguments.count = 0 then MSIs = inputbox("Enter in * delimited list of MSI's to query (Max 254 characters)", "MSI Product Details") MSIs = split(MSIs,"*") else set MSIs = wscript.arguments end if set objFS = createobject("scripting.filesystemobject") For Each MSIPath in MSIs if objFS.fileexists(MSIPath) then Set MSIDetails = EvaluateMSI(MSIPath) MSIDetails = MSIPath & ": " & vbcrlf & vbcrlf & "Product Name: " &_ MSIDetails("ProductName") & vbcrlf & "Product Code: " &_ MSIDetails("ProductCode") & vbcrlf & "Product Key : " &_ "HKCR\Installer\Products\" & PackGUID(MSIDetails("ProductCode")) &_ vbcrlf & "Package Code: " & MSIDetails("PackageCode") & vbcrlf &_ "Upgrade Code: " & MSIDetails("UpgradeCode") & vbcrlf WScript.Echo MSIDetails else wscript.echo "Inaccessible; Non-existant; or Error in Path for:" & vbcrlf & MSIPath & vbcrlf & "... skipping" end if Next Function EvaluateMSI(MSIPath) On Error Resume Next ' create installer object Set oInstaller = CreateObject("WindowsInstaller.Installer") ' open msi in read-only mode Set oDatabase = oInstaller.OpenDatabase(MSIPath, 0) Set objDictionary = CreateObject("Scripting.Dictionary") ' Get Package Code from Summary Information Stream Set streamobj = oDatabase.SummaryInformation(0) '0 = read only objDictionary("PackageCode") = streamobj.Property(9) ' Get Product Name from MSI Database Set View = oDatabase.OpenView("Select `Value` From Property WHERE `Property`='ProductName'") View.Execute Set ProductName = View.Fetch objDictionary("ProductName") = ProductName.StringData(1) ' Get Product Code from MSI Database Set View = oDatabase.OpenView("Select `Value` From Property WHERE `Property`='ProductCode'") View.Execute Set ProductCode = View.Fetch objDictionary("ProductCode") = ProductCode.StringData(1) ' Get Upgrade Code from MSI Database Set View = oDatabase.OpenView("Select `Value` From Property WHERE `Property`='UpgradeCode'") View.Execute Set UpgradeCode = View.Fetch objDictionary("UpgradeCode") = UpgradeCode.StringData(1) Set EvaluateMSI = objDictionary On Error Goto 0 End Function Function PackGUID(guid) PackGUID = "" '* Dim temp temp = Mid(guid,2,Len(guid)-2) Dim part part = Split(temp,"-") Dim pack pack = "" Dim i, j For i = LBound(part) To UBound(part) Select Case i Case LBound(part), LBound(part)+1, LBound(part)+2 For j = Len(part(i)) To 1 Step -1 pack = pack & Mid(part(i),j,1) Next Case Else For j = 1 To Len(part(i)) Step 2 pack = pack & Mid(part(i),j+1,1) & Mid(part(i),j,1) Next End Select Next '* PackGUID = pack End Function
如果需要在popupinputbox "","",MSIDetails
复制并粘贴任何GUID,我倾向于使用后续input框,比如inputbox "","",MSIDetails
如果你没有msi,你需要升级代码,而不是产品代码,那么答案在这里: 我怎样才能find在C#中安装的应用程序的升级代码?