Question

Comment extraire ProductCode du package MSI? Je veux l'utiliser plus tard pour désinstaller MSI via msiexec comme décrit ici

Était-ce utile?

La solution

Je peux penser à des dizaines de façons de le faire. Quels langages de programmation utilisez-vous et / ou à l'aise avec?

Jeter un coup d'œil à

Exécuter des instructions SQL

Vous pouvez utiliser wirunsql.vbs (fourni dans le SDK de la plate-forme) pour exécuter la commande:

cscript /nologo WiRunSQL.vbs FOO.msi "SELECT Value FROM Property WHERE Property = 'ProductCode'"

Autres conseils

Vous pouvez obtenir un effet similaire en effectuant ce qui suit dans PowerShell en fonction des programmes installés:

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

(Obv, plus la requête est serrée, plus elle fonctionnera rapidement - comme ci-dessus est très cher)

Ou vous pourriez postuler La technique générale ici sur votre pile.

J'ai écrit une fonction PowerShell que j'utilise lors de la génération de forfaits chocolatés basés sur MSI au travail, pour détecter si notre package interne installe un programme déjà installé par d'autres moyens:

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
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top