MSI Praxisartikel

Was noch geht mit MSI, COM-Objekt und PowerShell?

Das COM-Objekt hilft nicht nur bei Properties. Du kannst auch Tabellen lesen, Features auswerten, Launch Conditions pruefen und so vor der Paketierung viele Risiken frueh erkennen.

Sinnvolle Tabellen fuer die Voranalyse

Property, Feature, FeatureComponents, CustomAction, LaunchCondition, Upgrade und Shortcut sind fuer Paketierer besonders aufschlussreich.

Was du damit bewerten kannst

Upgrade-Faehigkeit, Vorbedingungen, benutzerspezifische Installationsanteile, Custom-Action-Risiken und moegliche Detection-Artefakte.

PowerShell
function Get-MsiTable {
  param(
    [string]$Path,
    [string]$Table
  )

  $installer = New-Object -ComObject WindowsInstaller.Installer
  $database = $installer.GetType().InvokeMember('OpenDatabase','InvokeMethod',$null,$installer,@($Path,0))
  $view = $database.GetType().InvokeMember('OpenView','InvokeMethod',$null,$database,("SELECT * FROM `$Table`"))
  $view.GetType().InvokeMember('Execute','InvokeMethod',$null,$view,$null) | Out-Null

  while ($record = $view.GetType().InvokeMember('Fetch','InvokeMethod',$null,$view,$null)) {
    $values = for ($i = 1; $i -le $record.FieldCount; $i++) { $record.StringData($i) }
    [PSCustomObject]@{ Table = $Table; Values = ($values -join ' | ') }
  }
}

Get-MsiTable -Path 'C:\Temp\App.msi' -Table 'LaunchCondition'
Get-MsiTable -Path 'C:\Temp\App.msi' -Table 'CustomAction'

Konkrete Auswertungsideen

  • LaunchCondition auf .NET, VC++ oder OS-Pruefungen abklopfen
  • CustomAction auf Skript-, EXE- oder DLL-Abhaengigkeiten pruefen
  • Feature-Struktur fuer optionale Komponenten dokumentieren
  • Upgrade-Tabelle fuer Versionswechsel verstehen

Was das fuer die Paketierung bringt

  • Bessere Risikoanalyse vor dem ersten Test
  • Gezieltere Loganalyse bei 1603
  • Fruehe Hinweise auf Reboot- oder Prereq-Probleme
  • Stabilere Detection und Upgrade-Strategie