Posts mit dem Label Update werden angezeigt. Alle Posts anzeigen
Posts mit dem Label Update werden angezeigt. Alle Posts anzeigen

Donnerstag, 17. August 2017

Mozilla Firefox - Installation, Migration und Update über Batch-Skript (x86 auf x64 und x64 auf x86)

Ich weiß, es gibt noch einige wenige tapfere Admins da draußen, die sich keine große Verteilungssoftware leisten können oder wollen und Software-Installationen und Updates per GPO verteilen. Windows macht es einem mit MSI-Paketen da sehr einfach. Möchte man EXE-Setups per GPO verteilen bleibt einem jedoch nur das Schreiben eines Skripts und das anschließende Einbinden in die Computerrichtlinie des Computerstartups.

Hier findet ihr ein Skript welches ich bereits länger zur Installation von Firefox verwende und nun erweitert habe, um auch eine Art "Migration" durchzuführen, ob man jetzt von einer x86-Installation von Firefox auf die x64 wechseln möchte (was wohl meistens der Fall sein dürfte) oder eben umgekehrt. Das Skript ist in Deutsch kommentiert, ich geh in diesem Artikel auf die einzelnen Punkte ein, falls jemand Bedarf hat, das Skript auch zu verstehen und nicht nur einzusetzen.


Was macht dieses Skript alles?
Es installiert sowohl die x86 als auch die x64-Variante des Browser ohne Userinteraktion (silent) und schafft es dabei auch, von einer Version zur anderen zu migrieren, ohne dass man am Ende beide Versionen installiert hat. Userdaten bleiben dabei bestehen, Altlasten werden deinstalliert und entfernt. Zudem werden alle nötigen Dateien erzeugt/kopiert, die nötig sind, um Firefox mit vordefinierten Einstellungen zu versorgen (das was man für Windows und Office mit Gruppenrichtlinien macht). Da wir Admin sind und unsere User in der Regel nicht, wollen wir selbst die Updates auslösen, das Skript unterbindet an mehreren Stellen das Auto-Update und entfernt den sog. Maintenance Service.

Was kann das Skript (noch?) nicht?
Das Skript deckt aktuell meine eigenen Bedürfnisse ab, jedoch gibt es natürlich mehrere Szenarien, die es in anderen Umgebungen abzufangen gilt. Geplant ist z. B. bei Fehlen der der helper.exe (wird zwingend benötigt um Firefox zu deinstallieren) einen Versuch über WMIC zu starten. Auch habe ich geplant einen Switch für das Erzwingen der Deinstallation einzubauen, damit bei jedem Update vorher deinstalliert wird. Ggf. könnte man ebenfalls noch einen Schalter einbauen, der zu setzen ist, wenn man auch die Userdaten zurückgesetzt haben möchte, aber so etwas kann auch schnell nach hinten losgehen und dann ist das Geschrei groß ;-)

Wofür ist das Skript gedacht?
Das Skript richtet sich in erster Linie an Admins, die per GPO-Startup-Skript Firefox auf Clients installieren möchten und dabei auch gewisse Konfigurationen im Voraus vornehmen möchten. Das Skript läuft dann als Startup-Skript, also das was der Computer macht, wenn er dem Benutzer anzeigt "Bitte warten", bevor dieser sich an Windows anmelden kann. Es ist keine Usereingabe nötig.


Hier der Stand meines Skripts vom 17.08.2017

:: Installationsskript für Mozilla Firefox CV (Current Version) als EXE
:: Inkl. Migration von FFx86 > FFx64 oder FFx64 > FFx86
:: Inkl. Migration von FF-MSI-Installation > FF-EXE-Installation
:: Firefox EXE-Download: https://www.mozilla.org/de/firefox/all/?q=German
:: (C) by Snaker @ https://snakerl.blogspot.de/


:: ============================================================================
:: Definiere Variablen (müssen/dürfen an eigene Umgebung angepasst werden)
:: ============================================================================

:: Pfad für Installationsdatei (Clients brauchen Leserechte)
set FirefoxDir=\\deinserver.dom.local\share$\firefox

:: Dateiname des Firefox-Setups
set SetupFF=FirefoxSetup_x64.exe

:: Definiere ob die Setup.exe Firefox x86 oder Firefox x64 beinhaltet
set SetupEnv=x64


:: ============================================================================
:: Definiere statische Variablen (sollten nicht geändert/umbenannt werden)
:: ============================================================================

:: Textdatei welche die aktuelle Firefox-Version beinhaltet
set CurVer=CurrentVersion.txt

:: Ini-Datei welche man als Antwortdatei für das Firefox-Setup hinterlegt
:: Ini MUSS vorhanden sein, wenn keine Parameter gewünscht, dann Inhalt auskommentieren
set INI=firefoxinstall.ini

:: Die Datei autoconfig.js legt fest, welche Konfigdatei für die FF-Benutzereinstellungen verwendet werden sollen
set ACJS=autoconfig.js

:: Die Datei mozilla.cfg behinhaltet die FF-Benutzereinstellungen
set CFG=mozilla.cfg


:: ============================================================================
:: Beginne Prüfroutine
:: ============================================================================

:: Prüfe ob Netzwerkverbindung erreichbar ist, wenn nicht, breche ab
if not exist "%FirefoxDir%" goto Ausgang

:: Wenn Setup x64 ist und Firefox.exe x86 beende das Skript
if %SetupEnv%==x64 if %PROCESSOR_ARCHITECTURE%==x86 goto Ausgang

:: Lese aktuelle Version aus TXT
for /f "usebackq delims=" %%i in (%FirefoxDir%\%CurVer%) do @set "CurrentfirefoxVersion=%%i"

:: Definiere Variable ProgFiles
if %SetupEnv%==x86 set ProgFiles=%ProgramFiles(x86)%
if %SetupEnv%==x64 set ProgFiles=%ProgramFiles%

:: Manchmal gibt es bei einer Migration Überreste (Mozilla Ordner, CurrentVersion.txt) die man evtl. bereinigen muss
if not exist "%ProgramFiles(x86)%\Mozilla Firefox\firefox.exe" if exist "%ProgramFiles(x86)%\Mozilla Firefox\%CurVer%" del /F /Q /S "%ProgramFiles(x86)%\Mozilla Firefox\%CurVer%"
if not exist "%ProgramFiles%\Mozilla Firefox\firefox.exe" if exist "%ProgramFiles%\Mozilla Firefox\%CurVer%" del /F /Q /S "%ProgramFiles%\Mozilla Firefox\%CurVer%"

:: Prüfe ob Programmordner vorhanden ist: wenn ja, lese Versionsdatei aus, wenn nicht, installiere
if not exist "%ProgFiles%\Mozilla Firefox" (
    goto Uninstall) else (
    for /f "usebackq delims=" %%i in ("%ProgFiles%\Mozilla Firefox\%CurVer%") do @set "InstalledfirefoxVersion=%%i"
    )

:: Vergleiche verfügbare mit installierter Version, wenn beide gleich, dann beende Skript
if "%InstalledfirefoxVersion%"=="%CurrentfirefoxVersion%" goto Ausgang


:: ==============================================================
:: Versuche System von alten Installationen zu bereinigen
:: ==============================================================

:Uninstall

:: Aktiv laufendes Programm beenden
:: TASKKILL /IM firefox.exe /F

:: MSI-Uninstall
:: Wird nur benötigt, falls Firefox mal per MSI installiert wurde (Userdaten bleiben bestehen)
:: WMIC /interactive:off product where "name like '%%Firefox%%'" call uninstall /nointeractive

:: EXE-Uninstall
:: Wenn %SetupEnv%=x86 dann deinstalliere Firefox x64 bzw. bei x64 deinstalliere Firefox x86 (Userdaten bleiben bestehen)
if %SetupEnv%==x86 if exist "%ProgramFiles%\Mozilla Firefox\uninstall\helper.exe" "%ProgramFiles%\Mozilla Firefox\uninstall\helper.exe" -ms
if %SetupEnv%==x86 if exist "%ProgramFiles%\Mozilla Firefox" Timeout 10
if %SetupEnv%==x86 if exist "%ProgramFiles%\Mozilla Firefox" rd /S /Q "%ProgramFiles%\Mozilla Firefox"

if %SetupEnv%==x64 if exist "%ProgramFiles(x86)%\Mozilla Firefox\uninstall\helper.exe" "%ProgramFiles(x86)%\Mozilla Firefox\uninstall\helper.exe" -ms
if %SetupEnv%==x64 if exist "%ProgramFiles(x86)%\Mozilla Firefox" Timeout 10
if %SetupEnv%==x64 if exist "%ProgramFiles(x86)%\Mozilla Firefox" rd /S /Q "%ProgramFiles(x86)%\Mozilla Firefox"

:: Updatedienst "Maintenance Service" in bestehender Firefox-Installation deinstallieren falls vorhanden
If exist "%ProgFiles%\Mozilla Maintenance Service\Uninstall.exe" "%ProgFiles%\Mozilla Maintenance Service\Uninstall.exe" /S
Timeout 2


:: ==============================================================
:: Installieren
:: ==============================================================

:: Silent Installation des Setups
:Install
"%FirefoxDir%\%SetupFF%" /INI="%FirefoxDir%\%INI%"
if errorlevel 0 if exist "%ProgFiles%\Mozilla Firefox" copy /Y "%FirefoxDir%\%CurVer%" "%ProgFiles%\Mozilla Firefox\%CurVer%"

:: Konfiguration verteilen
if exist "%ProgFiles%\Mozilla Firefox" copy /Y "%FirefoxDir%\%CFG%" "%ProgFiles%\Mozilla Firefox\%CFG%"
if exist "%ProgFiles%\Mozilla Firefox\defaults\pref" copy /Y "%FirefoxDir%\%ACJS%" "%ProgFiles%\Mozilla Firefox\defaults\pref\%ACJS%"

:: Sofern der Updaterdienst "Maintenance Service" mit installiert wurde, wieder entfernen
If exist "%ProgramFiles(x86)%\Mozilla Maintenance Service\Uninstall.exe" "%ProgramFiles(x86)%\Mozilla Maintenance Service\Uninstall.exe" /S
If exist "%ProgramFiles%\Mozilla Maintenance Service\Uninstall.exe" "%ProgramFiles%\Mozilla Maintenance Service\Uninstall.exe" /S

:Ausgang
exit



Ich habe eine ZIP bereitgestellt, die alle Konfigurationsdateien enthält. Die Datei kann hier heruntergeladen werden:

DOWNLOAD

 Der Link führt zu einer Google-Drive Seite, dort befindet sich die ZIP-Datei.

In dieser ZIP findet man Folgendes:
  • Ein Ordner namens "Verknüpfungen zu den Konfigdateien"
  • autoconfig.js > verweist auf eine mozilla.cfg
  • CurrentVersion.txt > Wichtig, das ist ein wichtiger Teil dieses Automatismuses. Hier muss die aktuell verteilte Version von Firefox händisch gepflegt werden. Es reicht (leider) nicht, nur die Setup.exe auszutauschen, sondern es muss auch diese Text-Datei angepasst werden. In der Praxis hat sich das bei mir in der Firma bewährt.
  • firefoxinstall.ini > wird als Antwortdatei für die Setup.exe von Firefox verwendet, ich habe darin nur eingestellt, dass der Maintenance-Dienst nicht mit installiert wird
  • InstallFirefox-x64.bat > das eigentliche Skript, welches ich aber auch hier oben in Klartext bereitgestellt habe
  • mozilla.cfg > hier werden die Einstellungen definiert, mit denen Firefox später starten soll, z. B. das Deaktivieren des autom. Updates. Die Einstellungen können erzwungen werden oder man überlässt dem User, ob er sie später selbst ändert. Mozilla erklärt den Inhalt seiner Konfigdatei hier. Diese Datei sollte jeder für sich durchlesen um zu entscheiden, ob er sie so verteilen möchte oder ggf. Einstellungen entfernen bzw. eigene hinzufügen möchte. 
 Das Skript kopiert die autoconfig.js und die mozilla.cfg automatisch an ihren Ort, man kann in der GPO ein zusätzliches Kopieren hinterlegen, um sicherzugehen, dass die Einstellungen auch wirklich greifen.

Ich erkläre kurz die Bereiche in der Batch, für diejenigen, die das interessiert:

"Definiere Variablen"
Hier könnt ihr als Admins euren Servershare hinterlegen, den Namen der Setup.exe und ob euer Firefox in x64 oder x86 installiert werden soll.

"Definiere statische Variablen"
Hier werden die Namen der Dateien definiert, nicht ändern!

"Beginne Prüfroutine"
 Das Skript überprüft ob bereits Firefox installiert ist, ob es die Version auslesen kann (anhand der CurrentVersion.txt, siehe oben). Sollte das Skript x64-Firefox installieren wollen, das System ist aber x86 wird abgebrochen. Wenn festgestellt wird, dass die aktuelle Firefoxversion bereits installiert ist, wird Skript ebenfalls beendet.

"Versuche System von alten Installationen zu bereinigen"
Sofern x64 installiert wird, wird geschaut, ob x86 installiert ist und dann deinstalliert und andersherum, denn wir wollen ja eine saubere Migration und nur eine Version auf dem Rechner.

"Installieren"
Unbeaufsichtigte Installation findet statt, die Konfigurationsdateien werden in ihre Ordner kopiert und am Ende wird geschaut, ob der Maintenance-Dienst auch wirklich nicht mit ins System gekommen ist, wenn doch wird er deinstalliert.


Zu guter Letzt: Was brauche ich damit das Skript als GPO im Unternehmen läuft?
Einen Testclient der einer AD-Gruppe zugeordnet ist, nennen wir die Gruppe "FirefoxTest-Installation". Im AD suchen wir die OU, in der sich der Testclient befindet und erstellenund verknüpfen gleichzeitig eine neue GPO, Namen eindeutig vergeben: Firefox-Testinstallation. GPO anklicken und im Tab Bereich unten bei der Sicherheitsfilterung die Authentifizierten Benutzer rausschmeißen, über hinzufügen unsere FirefoxTest-Installation-AD-Gruppe einfügen. Im Tab "Delegierung" rechts unten auf Erweitert > Authentifizierte Benutzer hinzufgen mit Lese-Rechten und mit OK abschließen.
Nun die GPO bearbeiten: Computerkonfiguration > Richtlinien > Windows-Einstellungen > Skripts > Starten > Doppeklick. Hier im Fenster auf "Dateien anzeigen". In das nun erscheinende Explorer-Fenster kopiert hier eure Batch-Datei rein und macht den Explrer zu. Im Fenster "Eigenschaften von Starten" wählt ihr Hinzufügen und wählt das nun dort erscheinende Skript aus und bestätigt alle Fenster mit OK.
Wer möchte, der kann auch noch unter "Computerkonfiguration> Einstellungen > Dateien" die Dateien autoconfig.js nach C:\Program Files\Mozilla Firefox\defaults\pref\ und die mozilla.cfg nach C:\Program Files\Mozilla Firefox\ (bzw. ProgramFiles(x86) bei der 32bit Installation von Firefox) kopieren lassen. Da empfehle ich noch die Zielgruppenadressierung auf Elementenebene: Dateiübereinstimmung, die Dateien also erst kopieren, wenn die Ordner dafür auch bestehen.

Ich hoffe das hilft dem Einen oder Anderen.

Beste Grüße

Snaker

Mittwoch, 15. Mai 2013

Verteilen von Adobe Reader Updates (MSP) mit Gruppenrichtlinien

Hallo Allerseits,

hier noch zunächst der Hinweis: dieser Artikel setzt das Wissen voraus, wie man via GPO MSI-Dateien verteilt, das werde ich also nicht detailiert erläutern. Viel mehr geht es darum, wie man einen Patch in Form einer MSP-Datei via GPO verteilt.

Die Schnellanleitung findet ihr am Ende des Postings.

Während Systeme wie SCCM die Verteilung von MSPs von Haus aus unterstützen, muss bei der Softwareverteilung über Gruppenrichtlinien getrickst werden. Das Stichwort heißt hier Slipstream, wir spielen die Patchdatei über die eigentlich MSI-Datei und erzeugen dabei eine neue MSI-Datei, die das ursprüngliche Installationspaket mit gepatchten Inhalten bereithält und verteilen kann.

Fangen wir aber von vorne an. Adobe bringt alle paar Jahre eine neue Hauptversion seiner Software auf den Markt, aktuell (Stand 15.05.2013) sind wir bei Adobe Reader 11 (bzw. Adobe Reader XI), seit gestern sogar bei Version 11.0.0.3.

Nun ist der Reader ein weit verbreitetes Produkt, relativ anfällig für das Einschleusen von Viren und sollte deswegen auch zügig gepatcht werden. Im Gegensatz zum Flash-Player von Adobe, zu dem jedes Mal eine neue MSI-Datei veröffentlicht wird, welche man einfach über die alte Version drüberinstallieren kann, veröffentlicht Adobe nur sogenannte MSP-Dateien (Patch-Dateien für den Microsoft Software Installer), welche aber, wie schon erwähnt, nicht per Gruppenrichtlinie verteilbar sind. Wie das geht, zeige ich hier.

Zunächst besuchen wir den FTP von Adobe und holen uns die aktuellste Reader-Version in Form einer EXE-Datei. Die EXE-Dateien sind kumulativ, wir benötigen also weder die 11.0.0.1, 11.0.0.2 und auch nicht die Basis-Installationsdatei 11.0.0.0, sondern nur die aktuellste Version, in meinem Fall die 11.0.0.3.
Jetzt extrahieren wir den Inhalt der AdbeRdr11003_de_DE.exe, oder wie auch immer sie bei euch heißt:
wir ziehen dazu die EXE in das Ausführenfeld (Aufruf Windowstaste + R) oder in ein CMD-Fenster (es erscheint der Pfad zur Datei + Dateiname, bei Pfaden mit Leerzeichen in ") und hängen anschließend -nos_ne an, also z. B.

"C:\Pfadbeispiel mit Leerzeichen\AdobeReader11.exe" -nos_ne



Mit Enter die Eingabe bestätigen. Es erscheint kurz das Setup-Fenster, ohne etwas abzufragen und extrahiert seine Daten und zwar in diesen Ordner:
C:\ProgramData\Adobe\Setup
Darin sollte sich ein Ordner mit aktuellem Zeitstempel befinden, der Name des Ordners beginnt und endet mit geschweiften Klammern. Wir öffnen ihn und finden den extrahierten Inhalt der EXE darin, u. a. das MSI und das MSP-Paket. Wir kopieren uns den gesamten Inhalt in einen lokalen Ordner (WICHTIG! wegen der Batchdatei), in welchem wir Schreibrechte haben. Es wird auch empfohlen, den Slipstream auf einem Computer auszuführen, der noch keinen Reader installiert hat. Bei mir hat das noch keinerlei Probleme bereitet, aber wer weiß schon, was passieren könnte, seid also hiermit gewarnt!

Nun kommen wir zum Slipstream. Nähere Informationen findet ihr auf dieser Seite hier. Am einfachsten tut man sich mit der auf der dort bereitgestellten ApplyMSP.bat es geht aber natürlich auch per Hand, ich erkläre es aber anhand des Skripts.
Die Batch legen wir in unseren besagten lokalen Ordner mit der MSI und MSP-Datei ab und führen die Batch aus und zwar mit Adminrechten (Vorsicht mit der Benutzerkontensteuerung, diese wird nicht abgefragt, also die Batchdatei mit gedrückter Shift-Taste rechtsklicken und mit "Als Administrator ausführen" anstarten). Die Batch findet zunächst die MSI und MSP und fragt nun nach dem Weg, wie der Slipstream ablaufen soll, wir haben die Wahl zwischen MSI, AIP (Administrativ Installation Point) oder Q (für Quit). Bei MSI wird die gepatchte MSI-Datei an einem anderen Ort abgelegt, bei AIP wird die aktuelle MSI überschrieben, bei Q verlasst ihr die Batch ohne Änderungen. Ich wähle hier immer AIP, anschließend wird mir "**Applying patch from MSP-file" und danach "**SUCCESS" zurückgegeben. Glückwunsch, die gepatchte MSI kann nun verteilt werden.


Um nun den Reader zu verteilen, steht es euch frei, vorher ein Transform zu definieren (würde ich euch sehr anraten, dort können so Dinge wie "alte Adobe Versionen entfernen" und dergleichen hinterlegt werden), den Wizard dafür findet ihr hier:
http://www.adobe.com/support/downloads/detail.jsp?ftpID=5515
Sollte der Link mal nicht mehr existieren, googelt einfach nach "Adobe Customization Wizard" + eurer Adobe-Versionsnummer und ihr werdet fündig.

Sollte das die Erstverteilung des Readers sein, könnt ihr gleich die neue MSI-Datei verwenden und habt für die Clients eine schöne 11.0.0.3er Version. Solltet ihr z. B. schon die 11.0.0.0 verteilt haben und wollt nun auf 11.0.0.3, müsst ihr die Zwischenstufen, wie bereits erwähnt, nicht installieren. Um die Anzahl der GPOs so gering wie möglich zu halten, empfehle ich, die bestehende GPO für den Reader zu öffnen und hier zum bestehenden Paket ein neues hinzuzufügen, wählt die neu erstellte MSI-Datei aus. Im Reiter "Allgemein" sollte die aktuelle Versionsnummer zu sehen sein, unter "Bereitstellung von Software" > Button "Erweitert" wähle ich immer "Sprache beim Bereitstellen dieses Pakets ignorieren". Nun zum Reiter "Aktualisieren", dort klicken wir auf "Hinzufügen", wählen aus dem "aktuellen Gruppenrichtlinienobjekt" und weiter unten "Paket kann über das vorhandene Paket aktualisieren" aktivieren. Wir sehen unten in der Liste bereits die verfügbaren Pakete aus dieser GPO und markieren die Aktuellste.

Persönliche Notiz: Ich halte es aktuell so, dass bei mir in dieser Liste die 11.0.0.0, 11.0.0.1 und 11.0.0.2 beibehalte; die jeweils neuere Version verweist also auf seinen jeweiligen Vorgänger beim Aktualisieren. Ich habe mich nie getraut, die Zwischenstufen zu entfernen, obwohl das eigentlich funktionieren sollte. Mein Weg klappt aber auf jeden Fall (never change a running system). Beim Entfernen von Einzelpaketen dagegen habe ich leider bereits erlebt, dass das komplette Softwarepaket deinstalliert, aber die neue Version nicht installiert wurde. Macht eure eigenen Erfahrungen, es ist ein Buch mit 7 Siegeln. Denkt auch immer daran, für jedes Aktualisierungspaket auch im Reiter "Änderungen" jeweils das MST anzugeben, sofern ihr das nutzt.




Hier das Schnellverfahren, für die "TMTR-Leute":

  • Download der aktuellen Version
  • Mit diesem Befehl die EXE entpacken:
    "C:\Pfad zur Datei\AdobeReader.exe" -nos_ne
  • "C:\ProgramData\Adobe\Setup" aufrufen, den darin aktuellsten Ordner an einen lokalen Pfad kopieren/verschieben
  • ApplyMSP.bat herunterladen und im Ordner der MSI und MSP-Dateien speichern
  • ApplyMSP.bat als Administrator ausführen (zu finden im Rechtsklick-Menü)
  • Eingabe im CMD-Feld "AIP", um die MSI zu überspielen (oder wenn gewünscht mit "MSI" antworten, um die neue MSI an einem seperaten Ort zu speichern).
  • Die neu-generierte MSI-Datei für die Verteilung verwenden, ggf. als "Aktualisierung" definieren, um vorangegangene Version zu aktualisieren, hier am besten "Aktuelles Gruppenrichtlinienobjekt" verwenden und unten den Punkt "Paket kann über das vorhandene Paket aktualisieren" aktivieren.
  • Bei Bedarf mit dem Adobe Customization Wizard ein Transform generieren, um bei der Installation alte Versionen zu entfernen und um diverse andere Einstellungen vorzudefinieren.


Hoffe, das hilft dem einen oder anderen weiter!

So far,

Snaker

Nachtrag: Sorry, die Bilder sind bei einem Serverumzug verloren gegangen. Ich hoffe, die Textversion reicht (: