Wer wie wir viel mit Powershell und der Windows Installer Technologie arbeitet, kommt zwangsläufig in die Situation, wo es darum geht die beiden Technologien miteinander zu kombinieren.

Hier möchte ich euch ein wirklich interessantes Powershell Modul (psmsi) vorstellen, welches genau das macht. Dieses Modul stellt folgende hilfreichen Funktionen zur Bearbeitung von Windows Installer MSI zur Verfügung.

  • Edit-MSIPackage
  • Export-MSIPatchXml
  • Get-MSIComponentInfo
  • Get-MSIComponentState
  • Get-MSIFeatureInfo
  • Get-MSIFileHash
  • Get-MSIFileType
  • Get-MSIPatchInfo
  • Get-MSIPatchSequence
  • Get-MSIProductInfo
  • Get-MSIRelatedProductInfo
  • Get-MSISharedComponentInfo
  • Get-MSISummaryInfo
  • Get-MSITable
  • Install-MSIPatch
  • Install-MSIProduct
  • Repair-MSIProduct
  • Test-MSIProduct
  • Uninstall-MSIPatch
  • Uninstall-MSIProduct

Ein paar davon möchte ich kurz erklären.

Product Infos auslesen

Im ersten Beispiel werden der ProductName, die Version und das Installationsdatum von Silverlight in die Variable $ProdInfo geschrieben und mittels des Befehls „write-host“ angezeigt.

$ProdInfo = Get-MSIProductInfo | where {$_.ProductCode -match '{89F4137D-6C26-4A84-BDB8-2E5A4BB71E00}'}
write-host "The Application $($ProdInfo.ProductName), version $($ProdInfo.ProductVersion) was installed $($ProdInfo.InstallDate)"

Hiermit werden sämtliche Product Infos aller MSI, welche „silver“ im Produktnamen haben, angezeigt.

Get-MSIProductInfo | where { $_.ProductName -like '*silver*' }

Property Tabelle auslesen

In diesem Beispiel geht es darum die Property SecureCustomProperties zu überprüfen. Im Idealfall sollte diese alle sog. Public Properties eines MSI enthalten. Hier wird eine Meldung angezeigt falls dies nicht so ist.

#open msi and read all properties
$msiName = "c:\temp\test.msi"
$allProperties = Get-MSITable $msiName -table Property | select-object Property | Sort-Object -property Property | %{$_.Property}
#read secureCustomProperties value
$secureCustomProperty = Get-MSITable $msiName -query "SELECT Value FROM Property WHERE Property = 'SecureCustomProperties'" | select-object Value | %{$_.Value}
#loop through all properties found and check if uppercase
foreach ($element in $allProperties) {
 if ($element -cmatch "(^[A-Z_ \d\W]+$)") {
 #if uppercase check if it occurs in securecustomproperties - if not output it
 if ( -not $secureCustomProperty.Contains($element) ) {
 write-host $element
 }
 }
}

MSI Summary Info auslesen

Mit folgendem Befehl werden die Summary Infos eines MSI ausgelesen und übersichtlich dargestellt.

get-msisummaryinfo c:\temp\test.msi

In diesem Beispiel werden alle Summary Infos von Silverlight angezeigt.

Get-MSIProductInfo | where { $_.ProductCode -match '{89F4137D-6C26-4A84-BDB8-2E5A4BB71E00}' } | get-msisummaryinfo -includetransforms

MSI validieren

Für die Validierung wird nebst dem MSI auch ein sogenanntes ein .cub File benötigt. CUB Files werden auch bei einer Validierung mit ORCA verwendet. Die Standard Validierungsdatei heisst darice.cub. Diese .cub Dateien können auch selbst erstellt werden um spezifische Einstellungen zu überprüfen. Dazu gibt’s hier Infos dazu.
In diesem Beispiel wird ein MSI mit der Darice.cub validiert, alle ICE03 Meldungen werden ausgeschlossen und das Resultat wird anschliessend nach dem Validierungstyp sortiert. Somit erscheinen die Errors zuoberst.

test-msiproduct .\altova.msi -add .\darice.cub -exclude ICE03 -v | Sort-Object Type

MSI mit Transform validieren

test-msiproduct .\altova.msi -Transform .\altova.mst -add .\darice.cub -exclude ICE03 -v | Sort-Object Type

MSI mit Patch validieren

test-msiproduct .\altova.msi -Patch .\altova.msp -add .\darice.cub -exclude ICE03 -v | Sort-Object Type

This Area is Widget-Ready

You can place here any widget you want!

You can also display any layout saved in Divi Library.

Let’s try with contact form: