Posts mit dem Label Script werden angezeigt. Alle Posts anzeigen
Posts mit dem Label Script 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, 25. Mai 2016

Verteilen von Microsoft Office 2016 MAK über Gruppenrichtlinien

Bevor es losgeht

Nicht jeder hat eine professionelle Softwareverteilung im Einsatz, manche müssen sich noch auf altem Wege behelfen und Software über Gruppenrichtlinien verteilen. Auch wenn ich schon lange nichts mehr gepostet habe, habe ich mir doch gedacht, dass ich das Stück Arbeit und meine Erkenntnisse doch mal wieder teilen könnte. Was ich so gesehen habe, gibt es noch nicht allzuviele Dokumentationen, die sich mit dem Thema befassen, Office 2016 per GPO-Script zu installieren.

Dabei gibt es doch einige Stolpersteine, die man erkennen muss, damit Office korrekt installiert. Um diese Stolpersteine für mich auszumachen, musste ich einige Testläufe durchgehen. Hier nun das Ergebnis. Sammeln wir ersteinmal eine Bestandliste, was haben wir und was brauchen wir?



Was natürlich ebenfalls vorhanden sein muss, ist eine Windows-Domäne, in der die erfolgreich Gruppenrichtlinien verarbeitet werden und eine Netzwerkfreigabe, in der das Setup abgelegt wird und somit vom Computerkonto erreichbar sein muss. Ein paar Fähigkeiten im Schreiben oder wenigstens im Verstehen von Batch-Scripten wäre hilfreich um ggf. Anpassungen vorzunehmen.



Setup vorbereiten

Wir legen das 32-Bit-Setup für Office 2016 in unserem Share ab, z. B.
\\Server\Share$\Office2016\32bit

Darin enthalten  sein sollte die "Setup.exe", viele Ordner die im deutschen z. B. "outlook.de-de" und "word.de-de" heißen und zudem ein anderer wichtiger Ordner namens "admin".

Anschließend entpacken wir die x86-EXE vom OCT (s. oben) in einen temporären Ordner. Darin enthalten sind die aktuellsten ADMX-Dateien (meine haben das Bearbeitungsdatum 12.05.2016, also wirklich relativ aktuell), die man auf dem DC platzieren kann, um später in den GPOs Office 2016 zu konfigurieren. Zudem befindest sich wieder ein Ordner namens "admin" darin.
Diesen Ordner "admin" kopieren wir und ersetzen den Ordner \\Server\Share$\Office2016\32bit\admin und dessen Inhalte".


Somit haben wir die neueste Version des Office-Anpassungstools (OCT) hinterlegt.
Dieses rufen wir nun auch auf, um eine .MSP-Datei zu erzeugen, die die jeweiligen Einstellungen, Keys usw. im Setup mit einpflegt. Das geht so:

Wir starten ein CMD mit erweiterten Adminrechten. Im Explorerfenster unter \\Server\Share$\Office2016\32bit klicken wir "Shift + Rechte Maustaste" auf die "Setup.exe" und wählen im Kontextmenü "als Pfad kopieren" und fügen diesen in der Admin-CMD ein. Wir erweitern den Pfad um den Schalter "/admin", so dass es in der CMD in etwa so aussieht:

"\\Server\Share$\Office2016\32bit\setup.exe" /admin
 Mit Enter Bestätigen und es sollte das OCT aufgehen und man kann eine neue "Setupanpassungsdatei" erstellen.


Die meisten Seiten sind selbsterklärend. Ich gehe die wichtigen Optionenim Schnelldurchgang durch:
  • Standarddateitypen > Würde ich auf Office Open XML-Formate stellen, dieses Setting kann man im Nachhinein nicht per GPO verteilen/ändern, soweit ich das weiß, d. h. jeder User würde beim ersten Start gefragt werden, was er da möchte
  • Name der Organisation und Programmpfade erklären sich von selbst.
  • Nächste interessante Seite ist die Lizenzierung. Hier geben wir unseren MAK ein, stimmen den Lizenzbedingungen zu und stellen die Anzeigeebene auf "Keine".
  • Frühere Installationen entfernen  > das will man als Admin in der Regel eigentlich. Im Netz habe ich gelesen, man sollte hier nicht das "Standardinstallationsverhalten" auswählen, sondern manuell jedes Programm einzeln auf Entfernen setzen. Ich warne hier bereits vor, dass jedoch auch diese Routine nicht sehr zuverlässig arbeitet!
  • In den Setup-Eigenschaften fügen wir folgende Werte hinzu "HIDEUPDATEUI" mit dem Wert "True" und "SETUP_REBOOT" mit dem Wert "NEVER". Wir steuern den Reboot später selber
  • Den Rest könnt Ihr machen wie ihr wollt, speichert nach Abschluss die MSP im Hauptverzeichnis der Installation unter dem Namen "setup32bit.MSP", also da wo auch die Setup.exe liegt ab.




Hinweis, wer später die Antwortdatei ändern möchte, kann das Setup wieder mit "/admin" starten und danach einfach die vorhandene MSP-Datei auswählen und die Einstellungen verändern.

Damit könnten wir theoretisch schon das Setup "silent" durchlaufen lassen, d. h. ohne Userinteraktion. Leider gibt es wie erwähnt Stolperstellen:
  • Früher konnte man mit der MSP auch die Aktivierung der Office Installation durchführen. Das klappt in Office 2016 leider nicht mehr. Viele andere Wege führen aber zum selben Ergebnis, ich habe mich nach mehreren Fehlversuchen dazu entschieden, es manuell im Installationsscript zu starten. Das funktioniert garantiert und zwar durch den Aufruf der Datei "OSPP.VBS", die Microsoft von Hause aus mit ausliefert. In der Theorie sollte man dieses Script auch innerhalb der MSP aufrufen können, hat aber bei mir ebenfalls nicht funktionieren wollen. Deswegen der händische Aufruf und den kann ich nur jedem ans Herz legen!
  • Die Deinstallation alter Office-Versionen hat in meinen Tests nicht zuverlässig geklappt, manchmal blieben Dateileichen übrig, ich wollte aber eine saubere Bereinigung, ohne dabei die Einstellungen der User zu verlieren

Deinstallation alter Versionen vorbereiten

Bei mir ist der interne Entfernungsautomatismus für alte Office-Versionen einige Male auf die Nase gefallen, deswegen habe ich ihn manuell im Script angestoßen. Dafür gibt es, wie oben bereits angesprochen diese Seite von Microsoft:
https://support.office.com/en-us/article/Uninstall-Office-2016-Office-2013-or-Office-365-from-a-PC-9dd49b83-264a-477a-8fcc-2fdf5dbf61d8?ui=en-US&rs=en-US&ad=US&fromAR=1

Dazu muss man aber abschätzen können: von welchem Betriebssystem möchte ich welche Version von Office deinstallieren. Je nachdem unterscheiden sich die Scripte. Bei uns gab es im Haus bislang nur die Office 2010 Home and Business Versionen (ein Key pro Computer), sowie die Home and Business von Office 2013, welche sich aber extrem von ihrem Vorgänger unterscheidet.

Ab 2013 liefen diese Installationen nämlich als sog. "Click-to-Run"-Setups. Man hatte als Admin keine Möglichkeit die Updates für diese Versionen zu steuern, das machte das System im Hintergrund automatisch per "Stream". Für kleine Unternehmen ganz toll, für mich als Admin nicht. Das war einer von vielen Gründen zu den teueren Volumenlizenzen zu welchseln.

Diese beiden Versionen muss ich nun also bei meiner Deinstallationsroutine beachten. Für Office 2010 kann man die Deinstallationsroutine hier beziehen bzw. hier der Direktlink: http://go.microsoft.com/?linkid=9824112. Für Office 2013 bitte das "Easy fix tool" beziehen, sollte auch direkt hier gehen: http://aka.ms/diag_officeuninstall. In beiden Fällen sollte dabei eine sog. .Diagcab herauskommen. Diese Diagcab kann man entweder doppelklicken oder mit einem Zip-Programm entpacken. Dann sieht man auch, dass das eigentlich eine Art Scriptsammlung ist, die man wiederum hervorragend in einem Installations/Deinstallationsscript einbinden kann.


Wir erzeugen im Hauptordner mit der Setup.exe einen neuen Ordner namens "remove-auto" und packen den Inhalt dort hinein. Für Office 2013 in der Click-to-run-Ausführung ist das das Script "OffScrubc2r.vbs" zuständig, für die "normale" MSI-Installation ist es "OffScrub_O15msi.vbs".

Welche Version ihr habt, seht ihr daran, dass Click-to-run z. B. seine EXE-Dateien unter "C:\Program Files\Microsoft Office 15\root\office15\" (bzw. im Program Files (x86)) liegen hat, während eine normale Installation den Pfad "C:\Program Files\Microsoft Office\Office15\" (bzw. Program Files (x86)) nutzt.


Wer Office 2010 auch entfernen will, sollte sich im Ordner "remove-auto" einen Unterordner erzeugen, bei mir heißt er einfach "2010". Dort kommen die Scripte aus der entzippten Diagcab von 2010 (s. Link oben) rein. Das verwendete Script lautet hier "OffScrub10.vbs". Dieses Script auf dem PC nach ggf. vorhandenen Verknüpfungen zum alten Office 2010 zu suchen und diese zu entfernen. Das dauert aber ewig und ich habe deswegen folgende Zeilen entfernt:
Zeile 1571 (If NOT fSkipSD Then) bis inkl.
Zeile 1615 (Err.Clear).  Ihr findet das überarbeitete Script im Download unter "remove-auto".


Verteilung über das Installationsscript (Erklärung)

Das Script seht ihr hier, ihr könnt es natürlich auch downloaden. Kopiert es in eine leere Text-Datei, speichert diese als "InstallOffice2016silent.bat" ab und öffnet sie am besten mit Notepad++, damit ihr eine Syntax-Hilfe habt. Ich gehe die Punkte Schritt für Schritt durch und halte mich an die Zeilennummerierung.

1:  :: Installationsscript für Microsoft Office 2016 32Bit inkl. Aktivierung  
2:  :: (C) by Snakerl (https://snakerl.blogspot.com)  
3:    
4:  :: ==============================================================  
5:  :: Folgende Variablen müssen in der Regel NICHT verändert werden  
6:  :: ==============================================================  
7:  :: Pfad zum Setup  
8:  set OfficeDir=\\Server\Share$\Office2016\32bit  
9:    
10:  :: Setup für x86 oder x64 (entscheidet auch, welches Programmverzeichnis verwendet wird)  
11:  set SetupEnv=x86  
12:    
13:  :: ==============================================================  
14:  :: Beginne Prüfroutine  
15:  :: ==============================================================  
16:    
17:  :: Prüfe ob Netzwerkverbindung erreichbar ist, wenn nicht, breche ab  
18:  if not exist "%OfficeDir%" goto Ausgang  
19:    
20:  :: Wenn Setup x64 ist, soll es auf Nicht-64bit-Rechnern nicht angestoßen werden  
21:  if %SetupEnv%==x64 if %PROCESSOR_ARCHITECTURE%==x86 goto Ausgang  
22:    
23:  :: Finde heraus, welches Verzeichnis relevant ist ("Programme" oder "Programme (x86)")  
24:  if %PROCESSOR_ARCHITECTURE%==x86 if %SetupEnv%==x86 (set "ProgFiles=%ProgramFiles%")  
25:  if %PROCESSOR_ARCHITECTURE% NEQ x86 if %SetupEnv%==x86 (set "ProgFiles=%ProgramFiles(x86)%")  
26:  if %PROCESSOR_ARCHITECTURE% NEQ x86 if %SetupEnv%==x64 (set "ProgFiles=%ProgramFiles%")  
27:    
28:  :: Skippe das Script, sofern bereits Office aktiviert ist  
29:  if exist "%ProgFiles%\Microsoft Office\Office16\Lizenzstatus.txt" goto Ausgang  
30:    
31:  :: Prüfe ob Microsoft Office 2016 bereits installiert ist (Word, Excel, Powerpoint ODER Outlook)  
32:  :Precheck  
33:  if exist "%ProgFiles%\Microsoft Office\Office16\WINWORD.EXE" goto Aktivierung  
34:  if exist "%ProgFiles%\Microsoft Office\Office16\EXCEL.EXE" goto Aktivierung  
35:  if exist "%ProgFiles%\Microsoft Office\Office16\POWERPNT.EXE" goto Aktivierung  
36:  if exist "%ProgFiles%\Microsoft Office\Office16\OUTLOOK.EXE" goto Aktivierung  
37:    
38:  :: Entferne Office 2013 Click-to-run silent  
39:  if exist "%ProgramFiles%\Microsoft Office 15\root\office15\WINWORD.EXE" ("%SystemRoot%\System32\cscript.exe" "%OfficeDir%\remove-auto\OffScrubc2r.vbs" ALL)  
40:  if exist "%ProgramFiles(x86)%\Microsoft Office 15\root\office15\WINWORD.EXE" ("%SystemRoot%\System32\cscript.exe" "%OfficeDir%\remove-auto\OffScrubc2r.vbs" ALL)  
41:    
42:  :: Entferne Office 2010 MSI silent  
43:  if exist "%ProgFiles%\Microsoft Office\Office14" ("%SystemRoot%\System32\cscript.exe" "%OfficeDir%\remove-auto\2010\OffScrub10.vbs" ALL)  
44:    
45:  :Install  
46:  "%OfficeDir%\setup.exe" /adminfile "%OfficeDir%\setup32bit.MSP"  
47:  Timeout 5  
48:  shutdown /r /t 10 /c "Neustart zum Abschluss der Installation von Microsoft Office 2016 (32 Bit)" /d P:4:2  
49:  timeout 60  
50:    
51:  :Aktivierung  
52:  :: Prüfen ob Aktivierungs-Datei vorhanden ist  
53:  if exist "%ProgFiles%\Microsoft Office\Office16\Lizenzstatus.txt" goto Ausgang  
54:  if not exist "%ProgFiles%\Microsoft Office\Office16" goto Ausgang  
55:    
56:  :: Aktivierung über VBS  
57:  "%SystemRoot%\System32\cscript.exe" "%ProgFiles%\Microsoft Office\Office16\OSPP.VBS" /ACT  
58:  timeout 5  
59:    
60:  :: Lese Lizenzstatus aus und schreibe in Temp die lic.txt  
61:  "%SystemRoot%\System32\cscript.exe" "%ProgFiles%\Microsoft Office\Office16\OSPP.VBS" /dstatus > "%temp%\lic.txt"  
62:  for /f "tokens=3" %%f in ('find "---LICENSED---" "%temp%\lic.txt"') do set lic=%%f  
63:  if %lic%==---LICENSED--- echo AKTIVIERT > "%ProgFiles%\Microsoft Office\Office16\Lizenzstatus.txt"  
64:  DEL /F /Q "%temp%\lic.txt"  
65:    
66:  :Ausgang  
67:  exit  



Zeile 8: Hier wird die Variable für den Setuppfad gesetzt, gebt hier den Pfad zur Setup.exe an, ohne abschließendes "\".

Zeile 11: definiert ob es eine 32-Bit-Installation oder eine "x64" also 64-Bit-Installation von Office ist.

Zeile 17 - 26: das Setup versucht herauszufinden, welche Pfade die jeweilige Installation und das aktuelle Betriebssystem das Richtige ist. Da gibt es viel zu beachten, ich habe aber hoffentlich den Großteil aller Varianten abgedeckt (x64 OS und 64 Bit Office, x64 OS und 32 Bit Office und x86 OS mit 32 Bit Office)

Zeile 29: Später im Script, wenn Office korrekt aktiviert wurde, wird im Programmverzeichnis eine Lizenzstatus.txt geschrieben. Das ist auch der Indikator, ob das Setupscript überhaupt weiter ausgeführt werden soll oder gleich beendet werden kann.

Zeile 33 - 36: Etwas schwammig, aber leider fällt mir im Moment keine besser Möglichkeit ein: Sofern das Setup durchgelaufen ist und seine EXE-Dateien abgelegt hat, gehe ich davon aus, dass es erfolgreich war. Nur die Aktivierung muss noch erledigt werden, also springt das Script bei Erfüllung der Kriterien zur Sprungmarke "Aktivierung".

Zeile 38 - 40: Office 2013 Click-to-run Uninstall-VBS-Script wird aufgerufen. Ich habe hier für mich diese Pfade hinterlegt, wer z. B. keine Office 2013 Click-to-run hat, muss das ggf. anpassen, z. B. bei einer normalen MSI-Installation von Office 2013 wäre das wie folgt:
"C:\Program Files\Microsoft Office\Office15\" (wenn OS und Office mit x64 oder OS und Office mit x86) und "C:\Program Files (x86)\Microsoft Office\Office15\" (wenn OS mit x64 und Office unter 32 Bit). Etwas tricky, ich weiß, ich hoffe ihr wisst was gemeint ist.

Zeile 43: Office 2010 MSI-Uninstall-VBS-Script wird aufgerufen

Zeile 45 - 49: Der Schlüsselmoment: die Installation wird gestartet, indem die Setup.exe mit dem Schalter /adminfile setup32bit.MSP aufgerufen wird. Die Installtion läuft, die Timeouts sind nur zur Sicherheit da. Anschließend kommt hier der Neustart, den ich in der MSP noch unterdrückt habe. Ein Neustart ist für die volle Funktionalität von erforderlich. Der Shutdown meldet sich korrekt im Eventviewer mit einem geplanten Neustart wegen der Installation einer Anwendung.

Zeile 51 - 58: Nach dem Neustart steigt man sofort wieder an dieser Sprungmarke "Aktivierung" bei Zeile 51 ein (s. Zeile 33 - 36). Es wird nochmal überprüft ob die benötigte "Lizenzstatus.txt" schon vorhanden ist und sicherheitshalber auch nochmal ob überhaupt das Verzeichnis für Office 2016 existiert. Anschließend wird mit cscript.exe das von Microsoft mitgelieferte Aktivierungsscript "OSPP.VBS" aufgerufen.

Zeile 60 - 64: Noch einmal rufen wir OSPP.VBS auf, diesmal mit /dstatus um zu gucken, ob Office aktiviert wurde. Dafür wird der Status in die Datei "%Temp%\lic.txt" geschrieben und anschließend darin nach "---LICENSED---" gesucht. Wenn das erfolgreich war, wird die Lizenzstatus.txt in das Office 2016 Verzeichnis kopiert.

Leider ist das ebenfalls eine sehr schwammige Geschichte. Es könnte sein, dass Altlasten wie Visio noch auf dem Rechner verbleiben müssen

Um einen erfolgreichen Durchlauf des Scripts zu überprüfen, gucke ich deswegen immer, ob die Lizenzstatus.txt vorhanden ist und alte Office-Pfade gelöscht wurden.


Einrichten der GPO


Am Ende, wenn man das Ganze erst einmal händisch getestet hat, kann man es per GPO auf seine Test-Clients loslassen. Das geht z. B. so:
  • Gruppenrichtlinienverwaltung in der MMC öffnen
  • Neues Gruppenrichtlinienobjekt erzeugen z. B. mit dem Namen "InstallMSOffice2016"
  • Die GPO bearbeiten, unter "Computerkonfiguration > Richtlinien > Windows-Einstellungen > Skripts (Start/Herunterfahren)" den "Start" auswählen, im Reiter "Skripts"auf "Hinzufügen", Skriptname auf "Durchsuchen" und im nun erscheinenden Explorerfenster "\\domain.local\SysVol\domain.local\Policies\{GPO-ID}\Machine\Scripts\Startup" das Script hinverschieben und anschließend Doppelklicken. Nun ist es als Startup-Script hinterlegt.
  • WICHTIG: Im Gegensatz zu anderen kleinen Installationen dauert die Deinstallation und Installation von Office relativ lange. Deswegen bitte unbedingt die Wartezeit für Gruppenrichtlinienskripts erweitern. Das geht unter "Computerkonfiguration > Richtlinien > Administrative Vorlagen > Maximale Wartezeit für die Gruppenrichtlinienskripts angeben". Für unsere PCs sind hier 20 Minuten ausreichend, also der Wert "1200". Ggf. muss dieser aber noch hochgesetzt werden, bitte testen!
  • GPO auf die OU mit meinen Test-Rechnern verlinken
  • Unter "Bereich" der Install-GPO würde ich eine neue AD-Gruppe hinterlegen, mit Clients, die Office 2016 installiert bekommen sollen.
  • Neue GPO für die User-Einstellungen (falls benötigt und gewünscht, die Konfiguration für die Benutzer werde ich hier aber nicht beschreiben).

Das wars auch schon, ging doch schnell oder? ;) Und hier noch das Ganze als Download:






























Donnerstag, 14. Juni 2012

Scriptbasierte Auswertung der aktuellen Flash-Version

Folgende Herausforderung stellte sich mir:

Ich verteile via GPO in der Domäne die akutellsten Versionen der Flash ActiveX-Komponente und der Pluginversion in MSI-Form. Beide finden sich hier zum Download.
Von Zeit zu Zeit bemerke ich aber Clients, die aus diversen Gründen keine aktuellen Versionen mehr beziehen, die Installation schlägt meist fehl, was man im Eventlog ("Error 1603 - Schwerwiegender Fehler bei der Installation", na vielen Dank Microsoft) nachlesen kann. Dies erfordert oft eine komplette Deinstallation, teilweise sogar mit dem FixIt-Tool von Microsoft.

Wie finde ich aber heraus, welche Clients Probleme mit der Flashinstallation haben?

Lösung:
Seit ein paar Versionen (welche genau kann ich leider nicht beantworten, einfach mal prüfen) wird in der Registry folgender Wert angelegt:
HKEY_LOCAL_MACHINE\SOFTWARE\Macromedia\FlashPlayerActiveX
bzw.
HKEY_LOCAL_MACHINE\SOFTWARE\Macromedia\FlashPlayerPlugin
Hierin enthalten ist der REG_SZ mit dem Namen "Version" welcher die gesuchte Information enthält.

Dieser ist auszulesen, bei Nichtbestehen ist dies zu ignorieren. Bewertet werden müssen beide Versionen, da diese auch getrennt installiert werden müssen/können.

Ich habe jetzt im NETLOGON-Ordner der Domäne eine Batch abgelegt, welche im Anmeldescript mit "start /wait CheckFlashVersion.bat" aufgerufen wird. Benötigt wird folgendes:

  • eine Domäne mit einem SYSVOL-Ordner, in welchem die Anmeldescripts liegen und das Prüfscript ebenfalls abgelegt werden kann
  • GPOs die die Software bereitstellen und somit einen Share, den die User lesen dürfen und der die Installationsdateien bereithält
  • darin eine Datei namens "CurrentVersion.txt", welche die aktuell verteilte Version enthält (zum jetzigen Zeitpunkt z. B. "11.3.300.257", dies muss manuell gepflegt werden!)
  • und zuletzt noch einen Ordner/Share, auf dem die Domänenbenutzer Schreibzugriff haben, um ihre Log-Dateien abzulegen.

Nachdem mit "start /wait" beim ursprünglichen Anmeldescript der Flashchecker aufgerufen wurde, vergleicht dieser nun anhand der "CurrentVersion.txt", ob diese mit den Inhalten aus der Registry übereinstimmt. Sollte eine Variante (ActiveX oder Plugin), so ignoriert der Flashchecker dies. Tritt eine Unregelmässigkeit auf, so wird eine Textdatei mit den Versionen in den öffentlichen Share geschrieben und als "Computername.txt" betitelt, wem dies nicht reicht, der aus den %computername%.txt gerne noch etwas wie %userdnsdomain%-%computername%.txt machen. Das Script wird anschließend bei jeder Anmeldung des Benutzers am Client aufgerufen. Die Installation der Software geschieht i. d. R. davor, zumindest bei computerabhängigen Zuweisungen, nämlich wenn der Computer noch nicht in der Anmeldemaske steht und "Computereinstellungen werden geladen" ausgibt. Unter XP konnte man die Installation sogar noch live mitverfolgen.

Läuft das Script ohne Fehler durch, prüft es noch, ob es ggf. vom letzten Mal noch eine Textdatei im Share liegen hat und löscht diese. Gibt es Probleme mit den Versionen, entfällt dieser Schritt selbstveständlich.

Fazit: Viel Geschreibe, wenig Sinn. Das Script läuft bei jeder Anmeldung und vergleicht die Registrywerte mit denen vom Admin und schreibt im Problemfall eine Textdatei.

Intelligenter ist das Script leider noch nicht. Denkbar wäre, eine Deinstallation der alten Version zu versuchen, was jedoch die GUID des Uninstallers erfordert, welche man unter "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall" finden kann. Eine praktikable Lösung, dort den richtigen Wert auszulesen, ist mir jedoch noch nicht eingefallen, außer dass man ggf. eine CSV erstellt, in der zu jeder veröffentlichten Version auch die entsprechende GUID mitliefert und anschließend mit "msiexec.exe /qn /x{GUID}" die vorhandene Version entfernt. Erfahrungsgemäß hilft in den Problemfällen, in denen das einfache Überspielen der Flash-Version fehlschlägt jedoch dieser Uninstall nicht weiter, sondern nur noch oben erwähntes FixIt-Tool, manchmal aber auch die Uninstaller von Adobe.

(Zip-Datei enthält Batch)

So far

Snaker