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