Как извлечь ProductCode из пакета MSI? - PullRequest
9 голосов
/ 15 февраля 2011

Как извлечь ProductCode из MSI-пакета? Я хочу использовать его позже, чтобы удалить MSI через msiexec, как описано здесь

Ответы [ 3 ]

4 голосов
/ 15 февраля 2011

Я могу придумать десятки способов сделать это. Какие языки программирования вы используете и / или используете в настоящее время?

Взгляните на

Выполнение операторов SQL

Вы можете использовать WiRunSQL.vbs (предоставляется в SDK платформы) для запуска команды:

cscript /nologo WiRunSQL.vbs FOO.msi "SELECT Value FROM Property WHERE Property = 'ProductCode'"
0 голосов
/ 12 июня 2019

Я написал функцию Powershell, которую я использую при создании пакетов Chocolatey на основе MSI, чтобы определить, устанавливает ли наш внутренний пакет программу, которая уже была установлена ​​другими способами:

function Get-MsiProductCode {
    [CmdletBinding()]
    param (
        [Parameter(Mandatory=$true)]
        [ValidateScript({$_ | Test-Path -PathType Leaf})]
        [string]$Path
    )

    function Get-Property ( $Object, $PropertyName, [object[]]$ArgumentList ) {
        return $Object.GetType().InvokeMember($PropertyName, 'Public, Instance, GetProperty', $null, $Object, $ArgumentList)
    }

    function Invoke-Method ( $Object, $MethodName, $ArgumentList ) {
        return $Object.GetType().InvokeMember( $MethodName, 'Public, Instance, InvokeMethod', $null, $Object, $ArgumentList )
    }

    $ErrorActionPreference = 'Stop'
    Set-StrictMode -Version Latest

    #http://msdn.microsoft.com/en-us/library/aa369432(v=vs.85).aspx
    $msiOpenDatabaseModeReadOnly = 0
    $Installer = New-Object -ComObject WindowsInstaller.Installer

    $Database = Invoke-Method $Installer OpenDatabase $Path, $msiOpenDatabaseModeReadOnly

    $View = Invoke-Method $Database OpenView "SELECT Value FROM Property WHERE Property='ProductCode'"

    [void]( Invoke-Method $View Execute )

    $Record = Invoke-Method $View Fetch
    if ( $Record ) {
        Get-Property $Record StringData 1
    }

    [void]( Invoke-Method $View Close @() )
    Remove-Variable -Name Record, View, Database, Installer
}
0 голосов
/ 11 апреля 2012

Вы можете добиться аналогичного эффекта, выполнив в PowerShell следующие действия на основе установленных программ:

Get-WmiObject -Class Win32_Product -Filter "Vendor LIKE 'The Company%' AND Name LIKE '%The Product%'" | %{ 
    Write-Host "Uninstalling $($_.IdentifyingNumber)"
    $_.Uninstall() 
}

(чем быстрее запрос, тем быстрее он будет выполнен - ​​как выше, как очень дорого)

Или вы можете применить общую технику здесь к вашему стеку.

...