Wie an anderer Stelle bereits erläutert geht es mir darum, dass man keine „Angst“ davor hat Software-Pakete zu erstellen und nach und nach durch mehr Erfahrung oder Anspruch die Software-Pakete zu verbessern. Im ersten Schritt ist man glücklich, dass die Installation ohne Eingriff durch den Benutzer funktioniert. Wie man ein einfaches Software-Paket auf der Grundlage einer MSI Datei erstellt, erfahrt ihr in einem meiner ersten Video Tutorials.
Die Empirum Setup.inf Skriptsprache ermöglicht einem jedoch weitere Möglichkeiten.
- Vornehmen von benutzerspezifischen Einstellungen
- Kopieren von Dateien pro Benutzer
- Abfragen von Werten auf dem Zielcomputer und „reagieren“ im Software-Paket, wie z.B. Prozessor-Architektur, Registrierungseinträge, Dateien, Dateiversionen, offene Prozesse, uvm.
- Nutzen von Variablen aus der EMC und steuern der Installation
- uvm.
Um Veränderungen an den vorhandenen Software-Paketen vorzunehmen, muss man zuerst verstehen, an welcher Stelle man die Veränderung vornehmen kann und welche Befehle und somit Möglichkeiten einem zur Verfügung stehen.
Gehen wir zuerst auf die Abfolge in der Setup.inf ein.
Die meisten Software-Pakete bzw. Vorlagen enthalten die unten stehenden Zeilen (am Ende dieses Blogeintrages), die für die Erläuterung der Abfolge herangezogen werden. Für die Erläuterungen habe ich jedoch ein paar Befehle bereits in die Vorlage eingebaut, um die Funktionsweise besser zu verdeutlichen.
Das Semikolon (;) sagt aus, dass diese Zeile nicht verarbeitet wird und ein Kommentar darstellt.
Das Hash Zeichen (#) oder von manchem auch Lattenzaun genannt, ist gleichzusetzen mit einem GOSUB aus Basic oder einem Prozedur Aufruf aus anderen Sprachen. Das bedeutet die entsprechende Sektion wird aufgerufen und nach der Beendigung springt die Verarbeitung wieder zurück und geht eine Zeile weiter.
Installationsabfolge
Es wird die Sektion [Product] als „Hauptprogramm“ ausgeführt und die dort angegebenen Sektionen der Reihe nach (von oben nach unten) angesprungen bzw. verarbeitet.
- Die erste Zeile ohne Kommentar ist der Aufruf der #Set:Product Zeile. Hiermit wird die [Set:Product] Sektion angesprungen.
- Es wird „Es geht los“ ausgegeben.
- Die Datei Datei.exe wird in das Verzeichnis „%ProgramFiles%\Hersteller Software\“ kopiert. Ist kein Ziel nach der Datei.exe angegeben, dann enspricht das Ziel dem Wert von ApplicationDir=.
- Jetzt ist die Sektion [Set:Product] fertig und es wird die Zeile
- #Reg:OnUninstallProduct, DELETE angesprungen. Diese wird jedoch nicht verarbeitet, da diese das Flag „DELETE“ besitzt, was aussagt, dass die Sektion nur bei der Deinstallation ausgeführt wird.
- Jetzt wird die Zeile #Reg:Product, DONTDELETE angesprungen. Diese wird ausgeführt, und das nur bei der Installation, da die Sektion das Flag „DONTDELETE“ besitzt.
- Es wird der Registry Eintrag Version = 2 unter HKLM\Software\Hersteller\Software vom Typ REG_SZ gesetzt.
- Anschließend wird die Sektion [INI:Product] und danach
- [Security:Product] angesprungen. In beiden Fällen gibt es nichts zu tun.
- Als letztes, obwohl es nicht unter [Product] aufgeführt ist, wird die Sektion [Shell:Product] ausgeführt.
Die Installation ist fertig, es gibt eine Verknüpfung auf dem Desktop, dass das Programm „Datei.exe“ startet.
Deinstallationsabfolge
Die Deinstallation wird in umgekehrter Reihenfolge verarbeitet und startet somit von unten in der [Product] Sektion.
- Ähnlich wie die Ausnahme, dass [Shell:Product] beim Installieren als letztes aufgerufen wird, wird diese Zeile beim Deinstallieren zuerst ausgeführt. Die Verknüpfung wird entfernt.
- Nun werden die Sektionen in der Reihenfolge von unten nach oben angesprungen, und dann ausgeführt wenn die Sektion kein FLAG (nach einem Komma) besitzen, oder das Flag „DELETE“ gesetzt haben.
- So wird bei der Deinstallation der Registry Eintrag Version = 1 unter HKLM\Software\Hersteller\Software vom Typ REG_SZ gesetzt, da die Sektion [Reg:OnUninstallProduct] verarbeitet wird.
- Nun wird als letztes die Sektion [Set:Product] verarbeitet.
- Hier wird nun der Kopiervorgang „1:…“ rückgängig gemacht und die Datei gelöscht. Bestimmten Befehlen muss ein „-“ vorangestellt werden, damit diese bei der Deinstallation ausgeführt werden.
Die Deinstallation ist nun abgeschlossen.
Wenn man sich das selbst einmal anschauen möchte, so kann man den Empirum Package Editor starten, in die „Erweiterte Ansicht“ wechseln und die Setup.inf im Einzelschrittmodus durchlaufen.
Auszug aus einer Setup.inf
... [Product] ;#FileCheckMachine, MACHINE ;#FileCheckClient, CLIENT ;ReplaceEnv <Variable> #Set:Product #Reg:OnUninstallProduct, DELETE #Reg:Product, DONTDELETE #Ini:Product, DONTDELETE #Security:Product [Set:Product] ECHO "Es geht los" 1:Datei.exe,%ProgramFiles%\Hersteller Software\, NORMAL, 12345 [Reg:OnUninstallProduct] HKLM,"Software\Hersteller\Software","Version",0x00000000,1 [Reg:Product] HKLM,"Software\Hersteller\Software","Version",0x00000000,2 [Ini:Product] [Security:Product] ;Hier könnten Veränderungen an den Berechtigungen im Dateisystem, der Registry, etc. stattfinden [Shell:Product] %Desktop%\Dateiaufruf, Datei.exe
Tolle Zusammenfassung – vielen Dank!
Ist es auch möglich den Empirum Package Editor im Einzelschrittmodus für die Deinstallation zu starten ?
Hallo,
ja, das ist machbar. Dazu beim abgefragten Setup Befehl den Parameter /U mit auswählen.
Grüße
Jochen
Eine gute kurze Zusammenfassung über die einzelnen schritte. Aber mir fehlt etwas über die Abfrage der Variablen aus der EMC die der User angelegt hat z.B.: Lizenz -Key etc. die beim Aktivieren eines Clients mitgegeben werden kann.
Hallo Yilmaz,
dann nehme ich das als Anlass demnächst etwas darüber zu schreiben.
Danke und bis bald
Jochen
Hallo Jochen.
Vielleicht kannst du in dem Artikel noch auf die Bedeutung der Einstellung ‚ShellLinks=[0|1]‘ im Abschnitt ‚[Application]‘ eingehen. Dieser beeinflust den Zeitpunkt, wann die Verknüpfungen erstellt werden. Ist der Wert auf ‚1‘ so werden ShellLinks am Ende erstellt. Ist er auf ‚0‘ werden ShellLinks direkt beim Aufruf von #Shell: erstellt.
Hallo Heiko,
danke für die Ergänzung, die so gut ist, dass ich nichts dazu sagen muss.
Ggf. kann ich es in einem Beitrag erwähnen, den ich bzgl. der Shell: Sektion noch erstellen wollte mit:
Shell:xxx, ShellLinks, CommonShellLinks, CreateUnresolvableShellLinks
Danke und Grüße
Jochen