MSI Praxisartikel

Mit PowerShell und COM-Objekt ein MSI sauber auslesen.

Dieser Artikel zeigt, wie du ProductCode, Version, Hersteller und weitere Kerninformationen direkt aus der MSI-Datenbank liest, statt dich auf Dateieigenschaften oder Herstellertexte zu verlassen.

Warum COM?

Das COM-Objekt WindowsInstaller.Installer liest die MSI direkt. Damit bekommst du belastbare Werte aus der Datenbank und nicht nur Oberflaecheninformationen.

Was du zuerst holen solltest

ProductCode, ProductVersion, ProductName, Hersteller, UpgradeCode und Architektur-Hinweise sind die Basis fuer Dokumentation, Detection und Upgrade-Logik.

PowerShell
$installer = New-Object -ComObject WindowsInstaller.Installer
$database = $installer.GetType().InvokeMember(
  'OpenDatabase',
  'InvokeMethod',
  $null,
  $installer,
  @('C:\Temp\App.msi', 0)
)

$query = "SELECT `Property`,`Value` FROM `Property`"
$view = $database.GetType().InvokeMember('OpenView','InvokeMethod',$null,$database,($query))
$view.GetType().InvokeMember('Execute','InvokeMethod',$null,$view,$null) | Out-Null

while ($record = $view.GetType().InvokeMember('Fetch','InvokeMethod',$null,$view,$null)) {
  $name = $record.StringData(1)
  $value = $record.StringData(2)
  [PSCustomObject]@{ Property = $name; Value = $value }
}

Welche Properties in die Paketdoku gehoeren

  • ProductCode
  • UpgradeCode
  • ProductVersion
  • Manufacturer
  • ProductLanguage
  • ALLUSERS / MSIINSTALLPERUSER

Praxisnutzen

  • Detection frueh planen
  • Upgradefaehigkeit besser bewerten
  • Herstellerangaben gegen reale MSI-Daten pruefen
  • Falsche Annahmen ueber Benutzerkontext vermeiden