Поиск версии продукта с использованием кода обновления с помощью PowerShell - PullRequest
0 голосов
/ 10 декабря 2018

Я должен обновить некоторые продукты (MSI), используя их коды обновления , у меня есть список кодов обновления всех таких продуктов.Теперь, чтобы отправить обновления, мне нужно сравнить версию каждого продукта.

Как найти версию продукта в таких сценариях?

Как:

gwmi win32_product | Where-Object {$_.Name -like "name"}

Но здесь используется имяЯ хотел бы найти версию, используя только код обновления.

1 Ответ

0 голосов
/ 11 декабря 2018

Самый простой способ выполнить то, что вы ищете в PowerShell, - использовать следующий запрос WMI для захвата пакетов, принадлежащих к семейству UpgradeCode.

$UpgradeCode = '{AA783A14-A7A3-3D33-95F0-9A351D530011}'
$ProductGUIDs = @(Get-WmiObject -Class Win32_Property | Where-Object {$_.Property -eq 'UpgradeCode' -and $_.value -eq $UpgradeCode}).ProductCode

Get-WmiObject -Class Win32_Product | Where-Object {$ProductGUIDs -Contains $_.IdentifyingNumber}

Единственный недостаток этого метода -классы Win32_Property и Win32_Product работают медленно, если время не является значительным фактором, вы можете использовать это.Если вам нужна более высокая производительность, вы можете получить аналогичную информацию из реестра, например:

function Decode-GUID {
    param( [string]$GUID )
    $GUIDSections = @( 8, 4, 4, 2, 2, 2, 2, 2, 2, 2, 2 ) 
    $Position = 0
    $result = @()

    ForEach($GUIDSection In $GUIDSections)
    { $arr = $GUID.SubString($Position, $GUIDSection) -split ""; 
    [array]::Reverse($arr);
    $result = $result +($arr -join '').replace(' ',''); 
    $Position += $GUIDSection } 
    return "{$(($result -join '').Insert(8,'-').Insert(13, '-').Insert(18, '-').Insert(23, '-'))}"
}

function Encode-GUID {
    param( [string]$GUID )
    $GUID = $GUID -creplace '[^0-F]'
    $GUIDSections = @( 8, 4, 4, 2, 2, 2, 2, 2, 2, 2, 2 ) 

    $Position = 0
    $result = ""

    ForEach($GUIDSection In $GUIDSections)
    { $arr = $GUID.substring($Position, $GUIDSection) -split ""; 
    [array]::Reverse($arr);
    $result = $result + ($arr -join '').replace(' ',''); 
    $Position += $GUIDSection } 
    return $result
}

function Get-Bitness {
    param( [string]$Location )
    if([Environment]::Is64BitOperatingSystem){
        if($_.PSPath -match '\\SOFTWARE\\Wow6432Node'){
            return '32'
            }else{
            return '64'
            }
    } else {
        Return '32'
    }

}

#Enter the UpgradeCode here
$UpgradeCode = Encode-GUID "{AA783A14-A7A3-3D33-95F0-9A351D530011}"

$ProductGUIDs = (Get-Item HKLM:"SOFTWARE\Microsoft\Windows\CurrentVersion\Installer\UpgradeCodes\$UpgradeCode", HKLM:"SOFTWARE\Classes\Installer\UpgradeCodes\$UpgradeCode").Property |
    Select-Object -Unique |
    ForEach-Object {Decode-GUID $_}

Get-ChildItem HKLM:\SOFTWARE\WOW6432Node\Microsoft\Windows\CurrentVersion\Uninstall, HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall |
    Where-Object {$ProductGUIDs -contains $_.PSChildName} |
    Get-ItemProperty |
    Select-Object -Property @{Name='PackageCode';Expression={$_.PSChildName}}, DisplayName, Publisher, DisplayVersion, InstallDate, PSParentPath, @{Name='Bitness';Expression={Get-Bitness $_.PSPath}}

. В реестре GUID, используемые в разделах «Установщик», кодируются так, чтобы они соответствовали способу, которым C ++ их изначально использует.Функции декодирования и кодирования в приведенном выше примере основаны на методике, использованной в этом блоге Роджера Цандера .Пожалуйста, извините за беспорядок в некотором коде, если вам нужна какая-то часть этого объяснения, пожалуйста, дайте мне знать.Надеюсь, это поможет вам.

...