从注册表获取产品代码的升级代码

时间:2017-07-10 14:00:50

标签: powershell registry

我需要提示如何从已安装的MSI中获取升级代码。实际上我有产品代码,可以从HKLM:\Software\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall\检索。

现在我想从HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Installer\UpgradeCodes检索升级代码(基于产品代码)。

我的问题是产品代码用作值名称,这意味着我有一个REG_SZ,其中名称是产品代码guid,值为空。

检索产品代码的一种方法可能是:

PS HKLM:\SOFTW...Codes> Get-ItemProperty * | select -First 1 | gm

    TypeName: System.Management.Automation.PSCustomObject

Name                             MemberType   Definition
----                             ----------   ----------
Equals                           Method       bool Equals(System.Object obj)
GetHashCode                      Method       int GetHashCode()
GetType                          Method       type GetType()
ToString                         Method       string ToString()
42F79228D77BA4A4EB5150F3DC090CE3 NoteProperty System.String 42F79228D77BA4A4EB5150F3DC090CE3=
...

如何检查PSCustomObject是否包含属性42F79228D77BA4A4EB5150F3DC090CE3

有谁知道是否有更优雅的方式?

1 个答案:

答案 0 :(得分:1)

这是你可以检查的方法。致力于优雅的解决方案...

$properties = Get-ItemProperty * | select -first 1 | Get-Member | Where-object {$_.MemberType -eq "NoteProperty"}

if("42F79228D77BA4A4EB5150F3DC090CE3" -in $properties.Name){
    Write-Output "It's in there!"
}

修改

这更优雅一点。它转到HKLM路径,并检查与代码相同的PSChildName(注册表项)。

如果找到,它将返回Name和property。如果找不到,变量$codeExists将为$null

$code       = "42F79228D77BA4A4EB5150F3DC090CE3" 
$codeExists = Get-ChildItem "HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Installer\UpgradeCodes" | Where-Object {$_.PSChildName -eq $code}

if($codeExists){
     Write-Output "It's in there!"
}