11 Stimmen

Die einfachste Lösung, um eine kleine Datei in einem MSI zu ersetzen?

Viele unserer Kunden haben Zugang zu InstallShield, WISE oder AdminStudio. Diese sind kein Problem. Ich hoffe, dass es einen Weg gibt, wie ich unsere kleineren Kunden unterstützen kann. ohne Zugang zu kommerziellen Repackaging-Tools ein frei verfügbares Paket von Werkzeugen und Schritten, um die Dateien selbst zu ersetzen.

Es muss nur eine einzige Konfigurationsdatei in einer komprimierten MSI ersetzt werden. Es kann davon ausgegangen werden, dass der Zielbenutzer Orca bereits installiert hat, weiß, wie er die Eigenschaftstabelle anpassen kann (um Lizenzdetails für die GPO-Bereitstellung einzubetten) und eine MST-Datei erstellt hat.

Haftungsausschluss : dies ist sehr ähnlich zu weitere Frage aber sowohl die Fragen als auch die Antworten in diesem Thread sind nicht eindeutig.

9voto

saschabeaumont Punkte 21770

Okay, wieder diese Frage mit meiner eigenen Antwort bietet nette kleine VB-Skript, das alle schweren Heben tun wird. Wie in der ursprünglichen Frage erwähnt, war das Ziel eine einfache Lösung für Sysadmin-Benutzer, um die Updates/Änderungen selbst durchzuführen.

Im Folgenden finden Sie eine vereinfachte Version des Codes, den ich derzeit meinen Kunden zur Verfügung stelle

Option Explicit

Const MY_CONFIG = "MyConfigApp.xml"
Const CAB_FILE = "config.cab"
Const MSI = "MyApp.msi"

Dim filesys : Set filesys=CreateObject("Scripting.FileSystemObject")

If filesys.FileExists("temp.tmp") Then filesys.DeleteFile("temp.tmp")
filesys.CopyFile MSI, "temp.tmp"

Dim installer, database, database2, view
Set installer = CreateObject("WindowsInstaller.Installer")
Set database = installer.OpenDatabase ("temp.tmp", 1)
Set database2 = installer.OpenDatabase (MSI, 1)

If Not filesys.FileExists(MY_CONFIG) Then WScript.Quit 2 ' No config file, abort!

Dim objFile, size, result, seq, objCab

' MakeCab object has been depreciated so we fallback to makecab.exe for with Windows 7
On Error Resume Next ' Disable error handling, for a moment
Set objCab = CreateObject("MakeCab.MakeCab.1") 
On Error Goto 0  ' Turn error handling back on

If IsObject(objCab) Then ' Object creation successful - use XP method   
    objCab.CreateCab CAB_FILE, False, False, False
    objCab.AddFile MY_CONFIG, filesys.GetFileName(MY_CONFIG)
    objCab.CloseCab
    Set objCab = Nothing
Else ' object creation failed - try Windows 7 method
    Dim WshShell, oExec
    Set WshShell = CreateObject("WScript.Shell")
    Set oExec = WshShell.Exec("makecab " & filesys.GetFileName(MY_CONFIG) & " " & CAB_FILE)
End If

Set objFile = filesys.GetFile(MY_CONFIG)
size = objFile.Size

Set view = database.OpenView ("SELECT LastSequence FROM Media WHERE DiskId = 1")
view.Execute
Set result = view.Fetch
seq = result.StringData(1) + 1 ' Sequence for new configuration file

Set view = database.OpenView ("INSERT INTO Media (DiskId, LastSequence, Cabinet) VALUES ('2', '" & seq & "', '" & CAB_FILE & "')")
view.Execute

Set view = database.OpenView ("UPDATE File SET FileSize = " & size & ", Sequence = " & seq & ", FileName = 'MYC~2.CNF|MyConfigApp.xml' WHERE File = '" & MY_CONFIG & "'")
view.Execute

database.GenerateTransform database2, "CustomConfig.mst"
database.CreateTransformSummaryInfo database2, "CustomConfig.mst", 0, 0
filesys.DeleteFile("temp.tmp")

Set view = nothing
Set installer = nothing
Set database = nothing
Set database2 = nothing
Set filesys = Nothing
WScript.Quit 0

Aktualisierung: Die MakeCab.MakeCab.1 Objekt wurde abgeschrieben, der Code wurde aktualisiert und funktioniert jetzt mit Windows 7.

1 Stimmen

Können Sie das erklären? MY_CONFIG ist die Datei, die Sie ersetzen möchten, und CAB_FILE ist die Mediendatei innerhalb des MSI... korrekt?

3voto

Stein Åsmul Punkte 37291

IMHO deutet diese Art von Szenario auf eine fehlende Funktion in der zu installierenden Anwendung hin und ist leichter in der Anwendung zu beheben, als mit der MSI herumzuhacken.


Bild der Verwaltung

Zunächst möchte ich darauf hinweisen, dass eine einfache Möglichkeit, dieses Problem für Ihre Benutzer zu "lösen", darin besteht, sie anzuweisen, eine Admin-Installation Ihrer MSI auszuführen. Dies extrahiert im Wesentlichen alle Dateien aus den internen CABs und legt alle Dateien in dem angegebenen Ordner ab:

msiexec.exe /a meininstaller.msi TARGETDIR= C:\AdminImage

Ihre Benutzer können dann direkt in die extrahierte Ordnerstruktur gehen und die betreffende Datei aktualisieren und dann das Verzeichnis auf andere PCs übertragen und die MSI installieren. Dies könnte Nebenwirkungen haben, da die Datei einen Hash-Wert in der MSI hat (um Spoofing zu vermeiden), aber in den meisten Fällen funktioniert es gut.


XML XPath-Abfrage ausführen

Neue Versionen von Deployment-Tools wie Installshield und Wix bieten integrierte Unterstützung für die Ausführung von XPath-Abfragen während der Installation und schreiben somit Abschnitte dynamisch.


Aktualisierung der Anwendung

Das Einrichten einer Anwendung auf einem PC umfasst mehrere Schritte. Zunächst müssen die Inhalte auf dem Rechner bereitgestellt werden - dies sollte mit einer MSI erfolgen, keine Frage. Bei den meisten fortgeschrittenen Anwendungen sind jedoch mehrere "Konfigurationsaufgaben nach der Installation" erforderlich, die dieser "Aktualisierung der Konfigurationsdatei" ähneln.

Es ist fast immer besser, diese Konfigurationsaufgaben auf den Zeitpunkt zu verschieben, an dem die Anwendungsstart als zur Implementierung von Funktionen in der MSI. Dafür gibt es viele Gründe, aber der wichtigste ist, dass nur die Anwendungs-EXE garantiert im richtigen Benutzerkontext ausgeführt werden kann. MSI-Dateien können mit Systemrechten, einem anderen Benutzerkonto oder über einen anderen Mechanismus ausgeführt werden.

Wir empfehlen im Allgemeinen, die MSI zu verwenden, um alle erforderlichen Inhalte auf den PC zu bringen . Markieren Sie dann die Registrierung, um der Anwendung mitzuteilen, dass es sich um den ersten Start handelt (bei Aktualisierungen können Sie einen Zähler erhöhen oder die neue Versionsnummer in HKLM eintragen). Dann kann die Anwendung die letzten Konfigurationsschritte in ihrer Startroutine durchführen. Sie kann eine Standard-Config.xml-Datei von irgendwo in %ProgramFiles% kopieren und in das Benutzerprofil kopieren. Dann kann sie die erforderlichen Werte aus HKLM lesen, die von der MSI geschrieben wurden, und die config.xml-Datei mit diesen Werten aktualisieren.

Generell gilt: Vermeiden Sie Konfigurationsschritte, die von MSI oder einem anderen Setup-Mechanismus durchgeführt werden. Konzentrieren Sie sich darauf, die erforderlichen Dateien und Registrierungseinträge auf den Computer zu schreiben, und überlassen Sie es dann der Anwendung selbst, eine geeignete Laufzeitumgebung einzurichten. Dies ermöglicht eine viel bessere Kontrolle der Bereitstellung. Es handelt sich um eine bessere "Kapselung", wenn Sie so wollen. Die MSI sendet über die Registrierung eine "Nachricht" an die Anwendung, und die Anwendung weiß anhand der Nachrichten, wie sie sich richtig einrichten muss.

0 Stimmen

In meinem Fall aktualisiere ich die globale "Standardkonfiguration" im Ordner "AllUsers/AppData". Das Kopieren in den benutzerspezifischen Speicherort erfolgt beim ersten Start. Bei der Konfigurationsdatei handelt es sich um Binärdaten in einem proprietären Format, es ist überhaupt keine Nachinstallationskonfiguration, sondern eine Voreinstellung für die Erstkonfiguration nach der Installation (sobald eine Benutzerkonfiguration existiert, wird die Standardkonfiguration des Systems ignoriert). Die Frage wurde ursprünglich gestellt, weil dies in InstallShield einfach per Drag/Drop erledigt werden kann, aber wir sind auf WiX umgestiegen und mussten unseren Kunden eine einfache Möglichkeit bieten, dies zu tun.

2voto

wimh Punkte 14781

Ich gehe davon aus, dass Sie die msi-Datei selbst erstellen (?)

Wenn Sie Wix um Ihre msi zu generieren, kann der Kunde einfach die gesamte msi neu generieren, nachdem er die Datei ersetzt hat (wix ist kostenlos). Ansonsten sollte es möglich sein, eine unkomprimierte Datei zu verwenden, die nicht in die msi eingebettet ist. In wix müssen Sie eine Medienelement ohne ein Schrankattribut. Der Nachteil ist, dass Sie zwei Dateien verteilen müssen, anstatt einer einzigen msi.

1voto

Martin v. Löwis Punkte 120025

Sie müssen einen Eintrag in das Verzeichnis Medien und fügt einen weiteren Datenträger ohne CAB-Datei und eine LastSequence hinzu, die um eins größer ist als die letzte Sequenz der CAB-Datei. Sie müssen dann in der Tabelle Datei die Sequenz der Datei mit der neuen Datei, und aktualisieren Sie alle anderen Dateiattribute, die sich geändert haben könnten.

0 Stimmen

Das funktioniert nicht ganz, wenn ich einen Datenträger ohne Kabinettdatei hinzufüge, erhalte ich "Fehler 2920. Quellverzeichnis für Datei <Dateiname> nicht angegeben" Allerdings ist es tut funktionieren, wenn ich eine Schrankdatei verwende. Vorschläge?

1voto

Sehen Sie sich den folgenden Beitrag an: Wie ersetzt man eine Datei in einem msi-Installationsprogramm?

Wo wird erwähnt:

Dieser Befehl extrahiert die MSI-Dateien: msi2xml -c AusgabeVerzeichnis TestMSI.MSI

Öffnen Sie OutputDir und ändern Sie die Datei.

Um das MSI neu zu erstellen, führen Sie es aus: xml2msi.exe -m TestMSI.xml

Sie benötigen die Option -m, um den "MD5-Prüfsummentest" zu ignorieren, der fehlschlägt, wenn eine oder mehrere MSI-Dateien geändert werden.

Herunterladen: https://msi2xml.sourceforge.io/

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X