Automatisierte Paketierung von MSI Installern

Post Reply
uvonceumern
Posts: 4
Joined: 02. Dec 2022, 08:26
Contact:

Automatisierte Paketierung von MSI Installern

Post by uvonceumern » 02. Dec 2022, 10:26

Hallo,

ich habe den folgenden Use Case:

Wir erstellen für unsere internen Kunden Software, die über Empirum verteilt werden soll. Diese Software wird von einem Build System erstellt und sollte dann automatisiert als Paket in Empirum zur Verfügung stehen.

Was wäre der korrekte Ansatz?

Im Moment ist mein Ansatz:
- MSI Dateien werden von Build erstellt
- Setup.inf wird von einem Skript generiert
- Ordnerstruktur wird auf Zielserver kopiert

Jetzt ist mir allerdings aufgefallen, dass MSI Pakate über die Product Id (GUID) deinstalliert werden, wenn ich ein Paket mit dem Package Wizard erstelle. Diese ID wird allerdings erst beim Build erstellt und ist daher dynamisch. Das Auslesen der ID aus einem MSI Paket ist auch nicht trivial, wie ich festgestellt habe.

Hat jemand eine Idee, wie ich das besser lösen kann (ausser die Pakete jedes mal manuell mit dem Package Wizard zu erstellen?)

User avatar
r.wiegel
Posts: 896
Joined: 05. Feb 2010, 13:45
Location: Regensburg
Contact:

Re: Automatisierte Paketierung von MSI Installern

Post by r.wiegel » 02. Dec 2022, 15:10

Viele Grüße
Roman Wiegel
IT-Consultant

MR Datentechnik - Vertriebs- und Service GmbH

uvonceumern
Posts: 4
Joined: 02. Dec 2022, 08:26
Contact:

Re: Automatisierte Paketierung von MSI Installern

Post by uvonceumern » 02. Dec 2022, 15:28

Perfekt, danke. Damit sollte ich die Product ID automatisiert auslesen können.

uvonceumern
Posts: 4
Joined: 02. Dec 2022, 08:26
Contact:

Re: Automatisierte Paketierung von MSI Installern

Post by uvonceumern » 02. Dec 2022, 17:31

Für alle Interessierten, diese PowerShell Funktion liefert die Product Id aus einem MSI:

Code: Select all

function Get-MsiProductCode {
    param (
        [IO.FileInfo] $FilePath
    )

    try {
        $windowsInstaller = New-Object -com WindowsInstaller.Installer

        $database = $windowsInstaller.GetType().InvokeMember(
                “OpenDatabase”, “InvokeMethod”, $Null, 
                $windowsInstaller, @($FilePath.FullName, 0)
            )

        $q = "SELECT Value FROM Property WHERE Property = 'ProductCode'"
        $View = $database.GetType().InvokeMember(
                “OpenView”, “InvokeMethod”, $Null, $database, ($q)
            )

        $View.GetType().InvokeMember(“Execute”, “InvokeMethod”, $Null, $View, $Null)

        $record = $View.GetType().InvokeMember(
                “Fetch”, “InvokeMethod”, $Null, $View, $Null
            )

        $global:ProductCode = $record.GetType().InvokeMember(
                “StringData”, “GetProperty”, $Null, $record, 1
            )

    } catch {
        throw "Failed to get MSI file version the error was: {0}." -f $_
    }
}

Post Reply

Return to “Paketierung”

Who is online

Users browsing this forum: Bing [Bot] and 3 guests