Posts mit dem Label Domäne werden angezeigt. Alle Posts anzeigen
Posts mit dem Label Domäne 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, 18. April 2012

Outlook-Signatur aus AD-Informationen erstellen (LDIFDE)

Was soll erreicht werden:
Der User soll ein Skript ausführen, welches ihm eine Outlook-Signatur (firmeneinheitlich) erstellt. Dabei soll (im Gegensatz zu meinem alten Skript) keine User-Aktion notwendig sein, jede Information kann dynamisch aus dem Active Directory bzw. dem LDAP geholt werden (Name, Telefon, Standort, Position usw.). Vorausgesetzt ist selbstverständlich, dass sämtliche benötigten Felder im AD auch für den Benutzer gepflegt sind. Für das Auslesen der Daten verwende ich LDIFDE, ein Tool, welches bei den Windows-Server-Versionen seit geraumer Zeit mitgeliefert wird. Einem Client steht diese Datei aber i. d. R. nicht zur Verfügung, man muss hier also einen zentralen Share einrichten und hinterlegen, über den LDIFDE.exe angesprochen werden kann. Beim Schreiben dieses Skripts fiel mir aber auf, das LDIFDE seit Windows Server 2008 und höher keine Unicode-Dateien mehr erzeugen kann, was das Verwenden von Umlauten unmöglich macht. Der Parameter "-u" sollte diese Funktion eigentlich erbringen, jedoch sorgt dieser (ab WS2K8) dafür, dass die erzeugte TXT-Datei gänzlich codiert wird (also das Gegenteil von dem, was man eigentlich möchte). Glücklicherweise lässt sich die LDIFDE-Version von Windows Server 2003 noch sehr gut verwenden, diese beherrscht die Unicode-Ausgabe noch. Ich habe die Datei zusammen mit dem Skript hier zum Download bereitgestellt.

Funktionsumfang des Skriptes:
- Prüfung, ob Outlook läuft > vor dem Schließen wird Skript nicht weitergeführt
- Definieren sämtlicher Pfade
- Dynamisch den Domaincontroller ermitteln, der befragt werden soll
- Textbausteine für Klartext und HTML hinterlegbar
- LDAP auslesen inkl. Umlaute via LDIFDE
- Fehlerrückgabe, welche Felder im AD nicht gepflegt sind (nur bei Muss-Feldern)
- Ordnerstruktur für Signatur wird erstellt, wenn nicht vorhanden
- Backup vorhandener Signaturen
- Generierung von HTML und TXT-Signaturen
- Bereinigung von temporär generierten Dateien

ToDo für folgende Versionen:
- Dynamisch bezogene Inhalte mit Umlauten HTML-tauglich bereitstellen
- RTF-Signatur

Hier klicken, um Skript und LDIFDE.EXE herunterzuladen.

So far

Snaker

Montag, 21. Februar 2011

Synchronisieren der Uhrzeit in einer Domäne

Ausgangslage:
Ich habe eine Domäne mit min. einem DC und möchte, dass jeder Rechner und jeder untergeordnete Server im Netz die gleiche Zeit hinterlegt hat.
Ein Server (am besten ein DC) soll aus dem Internet die aktuelle Zeit beziehen und  alle anderen Server und Clients sollen sich diese Zeit in regelmäßigen Abständen beziehen!

Was benötige ich?
Einen Domänen-Controller ab Windows Server 2003 und Clients ab Windows XP, darunter kann es zwar funktionieren, aber meines Wissens sollte man schon min. Windows 2000 SP4 besitzen!

Was ist zu tun?
Das Kommandozeilentool "w32tm" hat alles was man braucht, um die gewünschte Konstellation ohne viel Aufwand zu betreiben. Der Server mit Internetzugriff, welcher als Zeitserver in der eigenen Domäne dienen soll, führt nun folgende Commands aus:

w32tm /config /syncfromflags:manual /manualpeerlist:ptbtime1.ptb.de,ptbtime2.ptb.de
w32tm /config /update
w32tm /resync
net stop w32time && net start w32time
 

Damit sagt man dem Server: verwende ptbtime1.ptb.de und ptbtime2.ptb.de als Zeitserver, update jetzt, synchronisiere und starte den Zeitgeberdienst neu. Änderungen werden also sofort angenommen.

Standardmäßig hat jeder Server und jeder Client die Einstellungen von Haus aus (sobald man ihn in die Domäne gehoben hat), dass er automatisch mit dem DC kommuniziert, um die Zeit von selbigen zu beziehen. Man kann diese Einstellung aber auch forcieren (bei bestehenden Servern, vor allem alten, sekundären DCs zu empfehlen, da kann ja durchaus die Einstellung mal verbogen sein).


w32tm /config /syncfromflags:domhier
w32tm /config /update
w32tm /resync
net stop w32time && net start w32time


"domhier" steht in diesem Falle für einen DC in der Domänenhierachie!

Das Tool w32tm.exe ist sehr umfangreich und man sollte sich auf alle Fälle mal über "w32tm /?" die Hilfe anzeigen lassen, denn es gibt noch viele Möglicheiten, wie z. B. die Synchronisierungsintervalle, Debuging, Monitoring, Querys usw.

Die Basisfunktion ist jedoch mit diesem Blogeintrag hier erklärt.

So far

Snaker