Dieses Informationsfenster platziere ich freiwillig und unentgeldlich zur Unterstützung meiner Schwester bei ihrem Jobwechsel. Es wird nur für eine begrenzte Zeit angezeigt und kann ausgeblendet werden. Ich hoffe, dass die Aktion keinen meiner Leser zu sehr stört. Zum Ausblenden werden Cookies benutzt, diese müssen aktiviert und für diese Seite erlaubt werden. Werden die Cookies gelöscht oder die Seite auf einem anderen Gerät betrachtet, erscheint das Informationsfenster wieder und muss erneut geschlossen werden.

Information

Katja Schurig sucht neue berufliche Herausforderungen!

Liebe Leser, ich habe hier einen Geheimtipp für euch:
Katja Schurig
Katja Schurig, berufserfahren und kampferprobt in den Bereichen Veranstaltungsmanagement und -verkauf, Personalwesen, Sales & Marketing sowie Tourismus, will sich neuen beruflichen Herausforderungen stellen. Wer mit viel Energie umgehen kann und auf der Suche nach einer professionellen Fachkraft ist (oder jemanden kennt, der jemanden kennt), der findet ihr Profil nebst Kontaktdaten auf: Xing
Edit Comment
IT-Stuff, Tutorials, Software, Internet, Unterhaltung Willkommen auf IMA

Archive for the ‘IT’ Category

Im Windows Netzwerk Schriftarten zu verteilen war komplexer als gedacht. Daher möchte ich mal oberflächlich die möglichen Verteilungsmethoden erläutern und meine Empfehlung geben.
Ziel ist die Verteilung (also Installation zur Verwendung) von Schriftarten in Windows Netzwerken über Gruppenrichtlinien.

Dafür gibt es verschiedene Methoden: Batch, GPO, VBS.

Batch

REM alle Schriftarten aus dem fonts Unterordner in den Fonts Systemordner kopieren
xcopy fonts\*.* "%windir%\Fonts\" /v /c /l /y /i
REM jede Schriftart einzeln in der Registry anmelden
reg add "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Fonts" /v "OpenSans-Bold (True Type)" /t REG_SZ /d "OpenSans-Bold.ttf" /f
reg add "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Fonts" /v "OpenSans-BoldItalic (True Type)" /t REG_SZ /d "OpenSans-BoldItalic.ttf" /f
...

Der Registry Befehl muss für jede gewünschte Schriftart ausgeführt werden.

GPO

Wie schon GPO Meister Heitbrink erklärt hat:
In der Gruppenrichtlinie unter Computerkonfiguration\Einstellungen\Windows-Einstellungen\Dateien folgende Einstellung für jede Schriftart erstellen:
schriftarten-über-das-netzwerk-verteilen-mit-batch-gpo-vbs-register-font-file-gpo
In der Quelle bitte den korrekten \\server\pfad\ angeben. Dadurch werden die Schriften in den Windows Ordner kopiert.

Nun noch in Computerkonfiguration\Einstellungen\Windows-Einstellungen\Registry folgende Einstellungen, ebenfalls einmal pro Schriftart:
schriftarten-über-das-netzwerk-verteilen-mit-batch-gpo-vbs-copy-font-file-gpo
Den Registry Pfad so übernehmen wie auf dem Bild, „Name“ enthält den Anzeigenamen innerhalb von Programmen, bei der Fontdatei kein Pfad mehr davor packen, nur der Dateiname.

Nachteil

Beide Lösungen sind nicht sehr aufwändig, 2 Batch Befehle bzw. 2 GPO Einstellungen, simpel. Viel eher hat es den Nachteil, dass man bei einer größeren Menge an Schriftarten dann doch recht viel zu tun hat. 20 Schriftarten? Das bedeutet viel rumgetippe.
Besser ist in diesem Fall folgende Lösung:

VBS

Dieses VBS installiert alle Fontdateien, die sich im selben Ordner befinden.

' gebastelt mit Hilfe von:
' http://superuser.com/questions/201896/how-do-i-install-a-font-from-the-windows-command-prompt
' http://forum.chip.de/c-visual-basic-net/vbs-if-file-exists-then-starts-program-1550358.html

Set ofso = CreateObject("Scripting.FileSystemObject")
Set shell = CreateObject("WScript.Shell")
SourceFolder = ofso.GetParentFolderName(Wscript.ScriptFullName)

Const FONTS = &H14&

Set objShell  = CreateObject("Shell.Application")
Set oSource   = objShell.Namespace(SourceFolder)
Set oWinFonts = objShell.Namespace(FONTS)
sFontFolder   = shell.ExpandEnvironmentStrings("%windir%") & "\Fonts\"

' Lame VBscript needs 4 f*ing lines instead of "if (/\.ttf$/i) " ...
Set rxTTF = New RegExp
rxTTF.IgnoreCase = True
rxTTF.Pattern = "\.ttf$"

FOR EACH FontFile IN oSource.Items()
    IF rxTTF.Test(FontFile.Path) THEN
		IF NOT ofso.FileExists(sFontFolder & FontFile) THEN
			oWinFonts.CopyHere FontFile.Path
		END IF
    END IF
NEXT

Die Einbindung in das Netzwerk könnte direkt als Startscript erfolgen. Wenn man jedoch einen leichten Überblick haben möchte, welche Computer die Schriften schon installiert haben, empfiehlt sich dieses Script:

@echo on & color 9f & setlocal
set wd=\\server\Deployment\Sonstiges\fonts
set log=%wd%\fonts.log

echo %date% %time:~0,8% - %computername% startet die Fontinstallation >> %log%

start /wait "" cmd /c cscript //nologo "%wd%\fonts\install-all-fonts.vbs"

REM eine Schriftart als Test überprüfen
if exist "%windir%\fonts\OpenSans-SemiboldItalic.ttf" echo %date% %time:~0,8% - %computername% hat die Schriften installiert >> %log%

:end
endlocal

Das Script loggt Start und Ende der Schriftinstallation und prüft die erfolgreiche Installation mit 1 beliebigen Schriftart.

Ein Neustart muss aber auch bei dieser Methode sein.


Dieser Artikel soll nochmal als eine Kurzfassung meines kürzlich veröffentlichten Reader Deployment Guides, inklusive einer Anleitung für das Update der Verteilung auf Version 11.0.05, die kürzlich veröffentlicht wurde.

Die Schritte bleiben sehr ähnlich:

Schritt 1: Installer laden

Beachtet, dass das Update 11.0.04 als Grundlage braucht. Also holt euch 11.0.0, 11.0.04 und 11.0.05.
you know how…

Schritt 2: AIP lokal erstellen

msiexec /a AcroRead.msi
und einen lokalen Pfad angeben (z.B. „C:\Reader11.0.0mui“)

Schritt 3: Patchen

Erst 11.0.04 integrieren, dann 11.0.05:

X:\Software\Reader\installer>cd 11.0.04.63-mui
X:\Software\Reader\installer\11.0.04.63-mui>msiexec /a "C:\Reader11.0.0mui\AcroRead.msi" /p "AdbeRdrUpd11004_MUI.msp"
X:\Software\Reader\installer\11.0.04.63-mui>cd..
X:\Software\Reader\installer>cd 11.0.05-all
X:\Software\Reader\installer\11.0.05-all>msiexec /a "C:\Reader11.0.0mui\AcroRead.msi" /p "AdbeRdrSecUpd11005.msp"

adobe-reader-11-0-05-update-deployment-install

Schritt 4: Customization Wizard

Mit dem Customization Wizard die .msi bearbeiten und speichern. Wenn dabei ein setup.ini Fehler kommt, einfach eine leere setup.ini im selben Ordner wie die Installation erstellen, der Wizard füllt die dann.
adobe-reader-11-0-05-update-deployment-customization-wizard

Schritt 5: MST Eigenschaften überprüfen

Wie schon im letzten Artikel erwähnt, kann es sein, dass trotz Customization Wizard Anpassung einige Einstellungen der MST nicht ganz stimmen und dadurch z.B. die Sprache nicht korrekt auf Deutsch gestellt wird.
Öffnet also die Installationsdatei .msi und ladet die angepasste .mst Datei mit Orca über Transform -> “Apply Transform” ein.
Überprüft in der Property Tabelle folgende Wertepaare:

Property alter Wert neuer Wert
ProductLanguage 1033 1031
ISLANGFLAG ENU DEU
ProductCode {AC76BA86-7AD7-FFFF-7B44-AB0000000001} {AC76BA86-7AD7-1031-7B44-AB0000000001}
AgreeToLicense No Yes
ENABLE_CACHE_FILES Yes No
EULA_ACCEPT No Yes
RebootYesNo Yes No

Schritt 6: Deployment

Nun könnt ihr dieses fertig geschnürte Paket in den deploy/[version] Ordner ablegen und das Verteilungsscript (siehe Deployment Artikel) anpassen, damit die neue Version verteilt wird. Dazu reicht es, die neue Version (muss dem Ordnernamen im deploy Ordner entsprechen) in Zeile 11 einzutragen.

Fertig!
Dieser Prozess, inklusive Tests auf einigen Rechnern, dauerte bei mir weniger als 30 Minuten. Ein Update ist also relativ schnell eingespielt.


Es gibt bestimmte Zeichen, die im Zeichensatz der Schriftart der Windows Konsole nicht vorhanden sind. Beispielsweise das Copyright Zeichen ©.
Auch Umlaute sind so eine Sache, das habe ich aber damals schon in einem Beitrag aufgeklärt.

Nach ersten Recherchen meinerseite kurz gefasst: nur mit Fummelei ist das Copyright Symbol in der deutschen Konsole möglich. Die Darstellung des Symbols inklusive Umlaute ist aber vom System, von der Konsole, der Schriftart der Konsole und anderen Faktoren abhängig. Eine 100% zuverlässige Lösung gibt es nicht. Für gewöhnlich arbeitet man, wenn nötig, mit (C)opyright oder (C)Copyright stattdessen.

Aber ich hätte keinen Blog, wenn ich nicht bis zum Erbrechen recherchieren und testen würde, bis mir eine Lösung gut genug gefällt.

Ich habe mir die Windows Standards angesehen und 1, 2 Stunden rumprobiert.
Das Copyright Zeichen und Umlaute gleichzeitig sind möglich, jedoch nur mit ein wenig Fummelei.

Wer einfach nur schnell wissen will wie es geht kann hier das Video dazu sehen, der letzte Code unten im Artikel ist die finale Version. Alle ITler sollten zum eigenen Verständnis weiterlesen.
YouTube Preview Image

Wie funktioniert das alles und warum?

Basteln wir uns eine neue Batch im Notepad++, echo rein, schauen was passiert:

echo ©
pause

Simpel, oder? Funktioniert nicht, was ein Wunder.
copyright-symbol-in-batch-simple-try-2

Codepages (mehr dazu) sagen der CMD, mit welchem Zeichensatz die Batch Ausgaben dargestellt werden sollen. Über einen Trick, in dem das ® Zeichen aus der Codepage 1252 abgespeichert wird, lässt sich das © Zeichen in der deutschen Konsole (850 ist die normale westeuropäische Codepage) darstellen:

chcp 1252
set c=©
chcp 850
echo %c%

copyright-symbol-in-batch-codepage-try-2
copyright-symbol-in-batch-codepage-try-1Erläuterung: Der selbe Hexadezimalcode, der in der Codepage 1252 also hinter ® steht, steht in der Codepage 850 hinter ©, was mit diesem Trick ausgenutzt wird.
Trick via

Das heißt, um jederzeit ein Copyright Symbol darstellen zu lassen genügt es die aktuelle Codepage zu wechseln, in der Codepage 1252 das Copyright Symbol in eine Variable zu speichern und wieder auf die deutsche Codepage zurückzuwechseln.
Dazu bietet sich folgender Code an:

for /f "tokens=2 delims=:." %%x in ('chcp') do set cp=%%x
chcp 1252
set c=©
chcp %cp%
echo %c%

copyright-symbol-in-batch-codepage-try-3

Für die Umlaute müsst ihr nun meinen alten Trick anwenden und hinnehmen, dass im Code das Copyright Symbol durch ein anderes Symbol ersetzt wird. Aber mit %c% kann es weiterhin gesetzt werden.
copyright-symbol-in-batch-codepage-final-symbol-und-umlaute


Wer viel mit E-Mails zu tun hat, also nicht 10 am Tag sondern eher Dutzende oder Hunderte, wird immer öfter auf E-Mail Fehlermeldungen stoßen, die vom Mailserver zurückgeschickt werden. Oder vielleicht möchte man die Herkunft seltsamer E-Mail Adressen prüfen. Ich habe mal ein paar Dienste und Fälle zusammengetragen.

Wie erkenne ich E-Mail Fehler, wo sehe ich die Fehlermeldung?

Beispiel Szenario:
e-mail-adressen-verifizieren-fehler-analysieren-server-errorIch bekomme eine E-Mail von einer fremden Person und schicke eine Antwort darauf. Einen kurzen Moment später kommt eine neue E-Mail im Postfach an, eine Fehlermeldung vom „MAILER-DAEMON“. („Daemon“ sind in der IT für gewöhnlich Programme oder Dienste, die dauerhaft im Hintergrund aktiv sind und bestimmte Aufgaben ausführen.) Der Mailserver hat also eine automatische E-Mail geschickt, der Inhalt könnte beispielsweise so aussehen:
In dem Text sind eigentlich nur 3 Stellen interessant:
mail system at host mail.special-host.de – hier steht, nur so als zusätzliche Info, der Name meines eigenen E-Mail Servers.
message could not be delivered – tja, das dachte ich mir schon fast.
Und jetzt wird es spannend, die Fehlermeldung:
: host mx00.kundenserver.de[212.227.17.175] said: 550
: invalid address (in reply to RCPT TO command)

Diese Fehlermeldung möchte mir etwas sagen. Und bevor man direkt abwinkt, nach dem Motto „das verstehe ich eh nicht“, empfiehlt es sich doch diese Nachricht einfach mal zu lesen und zu übersetzen. Sie sind oftmals verständlich genug formuliert, um grobe Rückschlüsse ziehen zu können. Wie in diesem Beispiel, in dem „invalid address“ vermuten lässt, dass an der E-Mail Adresse etwas nicht stimmt.

Es gibt aber viele andere Fehlermeldungen, manchmal weniger verständlich:

: host mail.*******.de[**.13.128.154] said: 550 5.7.1
: Recipient address rejected: Mail appeared to be SPAM
or forged. Ask your Mail/DNS-Administrator to correct HELO and DNS MX
settings or to get removed from DNSBLs

--

: host ****.*******.de[**.211.115.6] said: 553
Your IP is BLACKLISTED at UCEPROTECT-LEVEL 1 - See http://www.uceprotect.net/rblcheck.php?ipr=***.83.112.87

--

: delivery temporarily suspended: host
mx-eu.mail.****.net[**.125.69.79] refused to talk to me: 421 4.7.1
[TS03] All messages from ***.75.110.146 will be permanently deferred;
Retrying will NOT succeed. See http://postmaster.yahoo.com/421-ts03.html

--

: host *******.de[**.38.231.10] said: 554 5.7.1
: Relay access denied

Was tun bei Fehlern? Wo liegt das Problem?

e-mail-adressen-verifizieren-fehler-analysieren-host-whoisIn der Fehlermeldung steht eigentlich immer der Host, ob nun mit Name oder nur mit IP, der diese Fehlermeldung zurückgab. Also der Mailserver der Gegenseite. Über diesen lassen sich per WHOIS Abfrage weitere Informationen zursammentragen, hier im Beispiel von kundenserver.de:
Hier wird also schnell ersichtlich, dass der E-Mail Server der betroffenen Adresse zu 1und1 gehört. Manchmal kann das schon helfen Anbieter zu identifizieren, die unseriös oder gar nicht mehr existent sind.

Jetzt wo der Fehler bekannt ist, stellt sich die Frage: was kann ich tun?! Und liegt der Fehler an mir oder auf der anderen Seite?
Beide Fragen lassen sich oftmals leider nur durch Lesen und Verstehen der Fehlermeldung beantworten, da gibt es natürlich keine generelle Antwort.
Es kann sicher auch schonmal helfen, den Fehler weiter zu analysieren und sich mehr Informationen zu holen. Dazu habe ich mal 4 verschiedene E-Mail Validation Dienste gesucht und mir die Fehlermeldungen des oben gezeigten Falles angesehen und verglichen:

verify-email.org – kurz und knackig

e-mail-adressen-verifizieren-fehler-analysieren-verify-email-org
Die Seite verify-email.org erkennt den DNS MX Eintrag, den Mailserver und testet die eingegebene E-Mail Adresse via Helo-From-To Konversation mit dem SMTP. Das Ergebnis wird kurz und knackig ausgegeben und farblich hervorgehoben. Ein guter Start um die vom Mailer-Daemon erhaltene Fehlermeldung zu überprüfen. Vermutlich wird die Ausgabe aber die gleiche sein.

verifyemailaddress.org – kurz und knackig #2

e-mail-adressen-verifizieren-fehler-analysieren-verifyemailadress-org
verifyemailaddress.org liefert ein klein wenig mehr Informationen als verify-email.org, beispielsweise MX Prioritäten und SMTP Server Ping vor der Konversation. Dies kann helfen, falls der Fehler noch vor/während der Kommunikation mit dem Server auftritt.

email-unlimited.com – mehr Infos und EHLO Command

email-unlimited.com bietet noch mehr Informationen, da die Informationen des 250er Reply Codes angezeigt werden. Außerdem nutzt der Dienst den erweiterten EHLO Befehl zur Kommunikation, wodurch eventuell andere Ergebnisse erzielt werden können. Auf der Webseite gibt es übrigens auch eine Software namens EMail Verifier Lite, mit der ihr diesen Prozess für viele Adressen gleichzeitig anstoßen könnt. Lohnt sich, wenn man das oft oder in Massen machen muss.
e-mail-adressen-verifizieren-fehler-analysieren-desktop-software

email-checker.com – eine andere Fehlermeldung

Den Dienst tools.emai-checker.com nehme ich in die Liste mit auf, da er interessante zusätzliche Features bietet (Suche nach dem Besitzer der E-Mail Adresse, geografische Lage des Mailservers und mehr) und weil es als einzige Seite eine andere Fehlermeldung hervorbrachte:
MailboxTemporarilyUnavailable – Grey listing is in operation.
e-mail-adressen-verifizieren-fehler-analysieren-tools-email-checker-com
Das hat mein Interesse geweckt. Denn wie anfangs erwähnt, bekam ich eine E-Mail von einer Adresse, auf die ich antwortete. Der Fehler „invaled address“ ist also schon komisch, schließlich bekam ich schon einmal etwas von der Adresse. Diese erste Mail kann natürlich von einem Fake/PHP-Mailer stammen, es kann aber natürlich auch sein, dass der Mailserver oder die Domain von irgendeiner Art Blacklisting betroffen ist.
Dieser Dienst ist leider auf 3 Anfragen pro Tag begrenzt. Sonst hätte ich jetzt noch ein paar weitere Tests damit gemacht.

Letztendlich bleibt die Interpretation des E-Mail Fehlers eure Aufgabe, ich hoffe aber euch ein paar Analyseansätze gezeigt zu haben.


Java, ein Grundpfeiler von Windows PCs, der schnell bröckelt und regelmäßig aktualisiert werden muss. Fast immer installiert und leider oftmals nicht auf dem neuesten Stand, wodurch sehr schnell sehr große Sicherheitslücken entstehen können; denn Java wird gerne von Exploits ausgenutzt.

Ein flexible, schnell konfigurierte und scriptbasierte Java Verteilung soll dieses Problem und den damit verbundenen Aufwand auf ein Minimum reduzieren.
Bei dieser wird ein Startscript im AD auf den Zielcomputern, die vom Clientfilter akzeptiert werden, Java sowohl in der 32bit als auch in der 64bit Version installieren.
Die Installation beider Bit-Varianten ist notwendig, da die meisten Browser immernoch ausschließlich als 32bit Fassung existieren. Ein 32bit Browser würde selbst auf einem 64bit System mit installiertem 64bit Java keine existierende Java Installation finden.

Der Aufbau

java-deployment-working-dir-neu
Bei einem neuen Java Update werden die beiden .exe Installer benötigt, diese müssen entsprechend dem Muster im Bild umbenannt werden. Abschließend müssen noch 2 Zeilen im Script angepasst werden. Das ist der komplette „Aufwand“, wenn ein neues Java Update veröffentlicht wird.

Das Script

Stand: 13.3.2015 (Java 8u31), working

@echo on & Color 9f & setlocal
 
set wd=\\lea\Deployment\Software\Flash
set log=%wd%\flash-log.txt
REM --- Version hier ändern ---
set version=16.0.0.305
REM ---------------------------
set tools=\\lea\Deployment\Sonstiges\tools
set flashieEL=999
set flashplEL=999
set combinedEL=999
set versionEL=999
set instversion=000
set retry=0
 
REM Clientfilter: nur die Computer aus der allowedPCs.txt dürfen installieren
::for /f %%f in (%wd%\allowedPCs.txt) do if "%computername%"=="%%f" goto check
::goto end
 
REM Clientfilter: die Computer aus der deniedPCs.txt dürfen nicht installieren
for /f %%f in (%wd%\deniedPCs.txt) do if "%computername%"=="%%f" goto end
 
:check
REM check installed version
for /f "tokens=1,2,3 delims= " %%a in ('reg query "HKEY_LOCAL_MACHINE\SOFTWARE\Macromedia\FlashPlayerPlugin" /v "Version"^|findstr "Version"') do set instversion=%%c
if "%instversion%"=="000" goto install
%tools%\VersionCompare.exe %instversion% %version%
set versionEL=%errorlevel%
if "%versionEL%"=="-1" goto install
if "%versionEL%"=="0" echo %date% %time:~0,8% - %computername% hat bereits %instversion% installiert >> %log% & goto end
if "%versionEL%"=="1" echo %date% %time:~0,8% - %computername% hat bereits %instversion% (neu) installiert >> %log% & goto end
 
:install
echo %date% %time:~0,8% - %computername% (%instversion%) startet die Installation... >> %log%
start /w %wd%\flash-%version%_IE.exe -install
set flashieEL=%errorlevel%
start /w %wd%\flash-%version%_OTHER.exe -install
set flashplEL=%errorlevel%
 
if %flashieEL%==1618 goto retry REM msiexec process in use, installation already in progress
if %flashieEL%==1602 goto retry REM user canceled installation
if %flashieEL%==1603 goto retry REM fatal error, some use it for "already installed" (eg. java)
if %flashplEL%==1618 goto retry REM msiexec process in use, installation already in progress
if %flashplEL%==1602 goto retry REM user canceled installation
if %flashplEL%==1603 goto retry REM fatal error, some use it for "already installed" (eg. java)
if %flashieEL%==1041 echo %date% %time:~0,8% - %computername% strange 1041 open browser fail, end >> %log% & goto end
if %flashplEL%==1041 echo %date% %time:~0,8% - %computername% strange 1041 open browser fail, end >> %log% & goto end
 
set combinedEL=%flashieEL%%flashplEL%
echo %date% %time:~0,8% - %computername% hat die Installation von %version% abgeschlossen, errorlevel: %combinedEL% >> %log%
goto finish
 
:retry
if %retry%==1 goto retryfailed
echo %date% %time:~0,8% - %computername% hat nicht Errorlevel 00 erreicht, retry in 200Sek... >> %log%
set retry=1
ping localhost -n 200 > nul
goto install
 
:retryfailed
echo _!_ %date% %time:~0,8% - %computername% hat die Installation abgebrochen, RETRY FAILED! EL: %flashieEL% %flashplEL% >> %log%
goto end
 
:finish
REM copy flash config file for silent background updates
if "%processor_architecture%"=="x86" xcopy "%wd%\mms.cfg" "%systemroot%\System32\Macromed\Flash" /y & goto end
xcopy "%wd%\mms.cfg" "%systemroot%\SysWOW64\Macromed\Flash" /y
xcopy "%wd%\mms.cfg" "%systemroot%\System32\Macromed\Flash" /y
goto end
 
:end
endlocal
exit

Ziel ist es, die aktuellste Version Adobe Reader auf allen Computern eines AD Netzwerks zu verteilen. Es handelt sich um die Version 11.0.10 (Update 13.3.2015), die speziell angepasst (deutsche Sprache, keine EULA, paar Features deaktiviert) installiert werden soll. Da ich bei diesem Prozess auf verschiedenste Fehler und Probleme stieß, werde ich die Verteilung hier detailliert erläutern.

Seit 2010/2011 gibt es ja den Hintergrundupdater in Adobe Produkten. Eigentlich gehören Verteilungen dieser Art also der Geschichte an. Jedoch kann es trotzdem notwendig werden, wenn erstmal eine Basis geschaffen werden muss, weil beispielsweise kein einheitlicher Standard des Produkts installiert ist. Einige haben Version X, andere Version Y, einige PCs haben die Software nicht einmal installiert. In diesem Fall ist ein komplettes Rollup inklusive Cleaning, also Deinstallation aller Versionen vor der Verteilung, sinnvoll und empfehlenswert.

Wie üblich gibt es mehrere Herangehensweisen, bei Adobe habe ich im Laufe der Jahre folgende Methode als sicherste empfunden:
Installer laden -> AIP lokal erstellen -> Patches slipstreamen -> mit Customization Wizard anpassen -> mit Orca optimieren -> Verteilen,
wobei der Verteilen-Punkt je nach Produkt und Situation natürlich zwischen Script oder GPO Installation unterschieden wird.
Das hier sagt Adobe zu den „Best Practices“.

Schritt 1: Installer laden

Adobe bietet für ihre Produkte teilsweise 2 verschiedene Downloadseiten an. Die typisch einfache Seite und die Seite für Administratoren, hier am Beispiel vom Reader (bei Acrobat ist das ebenfalls so).
adobe-reader-scriptbased-deployment-mst-changes-cleaning-logging-installerIhr braucht natürlich das komplette Paket: 11.0.0 Basis plus aktuellstes Update, am besten in der MUI Variante.
Für die Pro’s auch ohne viel Schickschnack via FTP.

Schritt 2: AIP erstellen

Falls die Grundversion (z.B. 11.0.0) eine .zip Datei war, entpackt diese. Geht per CMD in diesen Ordner und führt den Befehl
msiexec /a "AcroRead.msi"
Der Installer startet, installiert am besten lokal, C:/Reader11/ oder so. AIP fertig!

Schritt 3: Patches integrieren

Geht per CMD in den Ordner des Updates und führt den Befehl aus:
msiexec /a "C:\Reader11\AcroRead.msi" /p "AdbeRdrUpd11004_MUI.msp"
(ihr müsst natürlich Pfade und Dateinamen entsprechend anpassen…)
Der grafische Installer für den Patch erscheint, durchklicken, fertig. Verfahrt so mit allen Patches, wenn ihr mehrere habt. Für gewöhnlich lässt sich aber das aktuellste Update auf die Basisversion anwenden, mehr dazu steht auf der Detailseite des Updates bei den „Installation Instructions“ („This update requires that Adobe Reader 11.0 MUI or later is installed on your system.“).
adobe-reader-scriptbased-deployment-mst-changes-cleaning-logging-update-slipstream

Schritt 4: mit dem Customization Wizard anpassen

Wie bei Acrobat kann man auch den Reader mit dem Adobe Customization Wizard anpassen:
adobe-reader-scriptbased-deployment-mst-changes-cleaning-logging-customization-wizard
EULA deaktivieren, Sprache wählen, Deinstallation alter Versionen aktivieren, paar Online Features deaktivieren, Shortcuts anpassen, tobt euch aus und speichert das Ergebnis als MST Anpassungsdatei ab.

Fertig, ihr habt jetzt eine geupdatete AIP Installation, C:/Reader11. Die könnt ihr auf das Netzlaufwerk schieben. Dazu die gerade erstellte MST. Beides zusammen könnt ihr nun Verteilen. Entweder via GPO Softwareinstallation oder per Script. Letzteres bevorzuge ich aus Gründen der Funktionalität.
Kommen wir also zum letzten Schritt.

Schritt 5: Verteilung via Script

Hier wird es nochmal spannend.
Das Installer-Script
– hat einen Clientfilter, kann also einzelne Rechner zulassen oder ignorieren
– räumt alte Reader Installationen auf (Version 9 und 10) – siehe Acrobat & Reader Cleaner Tools
– besitzt umfangreiche Logging-Möglichkeiten
reagiert auf die Fehlercodes 1618 (Installer Prozess wird gerade verwendet), 1602 (Installation vom Nutzer abgebrochen) und 1603 (Installationsfehler) mit einem Retry nach 5 Minuten

Update: 28.07.2015 Version 11.0.12, getestet und läuft.

@echo on & Color 9f & setlocal
set wd=\\server\Deployment\Software\Reader
set log=%wd%\reader-log.txt
set readerEL=999
set retry=0
set forcecleanup=yes
REM:: ******************
set version=11.0.12
REM:: ******************

REM:: Clientfilter: nur die Computer aus der allowedPCs.txt dürfen installieren
::for /f %%f in (%wd%\allowedPCs.txt) do if "%computername%"=="%%f" goto start
::goto end

REM:: Clientfilter: die Computer aus der deniedPCs.txt dürfen nicht installieren
for /f %%f in (%wd%\deniedPCs.txt) do if "%computername%"=="%%f" goto end

:start
if not exist %wd%\deploy\%version%\complete md %wd%\deploy\%version%\complete
if exist %wd%\deploy\%version%\complete\%computername% goto end

if "%forcecleanup%"=="yes" goto cleanup
goto install

:cleanup
echo %date% %time:~0,8% - %computername% deinstalliert alle Reader Versionen... >> %log%
REM:: uninstall all reader versions
start /w %wd%\cleaner\reader-cleaner-9.exe /silent /product=1
start /w %wd%\cleaner\reader-cleaner-10-above.exe /silent /product=1
echo %date% %time:~0,8% - %computername% hat alle Reader Versionen deinstalliert... >> %log%
goto install

:install
echo %date% %time:~0,8% - %computername% startet die Installation... >> %log%
start /w msiexec /i "%wd%\deploy\%version%\AcroRead.msi" /qn TRANSFORMS="%wd%\deploy\%version%\AcroRead.mst"
set readerEL=%errorlevel%

if %readerEL%==1618 goto retry REM:: msiexec process in use, installation already in progress
if %readerEL%==1602 goto retry REM:: user canceled installation
if %readerEL%==1603 goto retry REM:: fatal error, some use it for "already installed" (eg. java)
echo %date% %time:~0,8% - %computername% hat die Installation abgeschlossen, Errorlevel: %readerEL%... >> %log%
if %readerEL%==0 md %wd%\deploy\%version%\complete\%computername%
goto end

:retry
if %retry%==1 goto retryfailed
echo %date% %time:~0,8% - %computername% hat die Installation abgeschlossen, Errorlevel: %readerEL%, retry in 5min... >> %log%
set retry=1
ping localhost -n 300 > nul
goto install

:retryfailed
echo %date% %time:~0,8% - %computername% hat die Installation abgeschlossen, Errorlevel: %readerEL%, retry failed, end >> %log%
goto end

:end
endlocal
exit

Damit das Script funktioniert, braucht ihr allerdings eine spezielle Ordnerstruktur. Ich skizziere sie mal eben schriftlich, ggf. mit Dateien:
Reader\cleaner\reader-cleaner-10-above.exe (Cleanup Tools, umbenannt)
Reader\cleaner\reader-cleaner-9.exe (Cleanup Tools, umbenannt)
Reader\deploy\[version](die in der Batch als Variable gesetzt wird)\[Dateien: AIP,.mst,usw]
Reader\deploy\[version]\complete\

Wenn ihr also in der Batch beispielsweise die Version 11.0.04.63 verteilen wollt, tragt die Version in Zeile 11 so ein und der Ordner lautet:
Reader\deploy\11.0.04.63\
adobe-reader-scriptbased-deployment-mst-changes-cleaning-logging-deploy-dir

Hier ein Beispielausschnitt der Logdatei:
adobe-reader-scriptbased-deployment-mst-changes-cleaning-logging-logfile

Probleme mit der Sprache?

acrobat-multilanguage-testsIst das Produkt trotz Anpassung nicht auf Deutsch? Das Problem hatte ich auch und habe einige Stunden mit verschiedensten Tests an der MST, der setup.ini und den MSI Parametern verbracht. So richtig klar wurde mir das alles nicht, ich habe nun aber einige Anpassungstipps, die das Sprachproblem beheben sollten. Lest vorher nochmal die paar Infos des Admin Guides zu den Sprachen, das erleichtert das Verständnis der folgenden Punkte.

Also, MSI in Orca laden, über Transform -> „Apply Transform“ die angepasste MST des Customization Wizards laden und ab in die Property Tabelle.
(Das ginge übrigens auch über den Customization Wizard -> Direct Editor)
Schaut hier nach folgenden Schlüsseln und passt diese ggf. an, um die deutsche Sprache einzustellen:

Property alter Wert neuer Wert
ProductLanguage 1033 1031
ISLANGFLAG en_US de_DE
ProductCode {AC76BA86-7AD7-FFFF-7B44-AB0000000001} {AC76BA86-7AD7-1031-7B44-AB0000000001}

(zum Product Code lest bitte den Admin Guide)
Speichert diese Anpassungen über Transform -> Generate Transform am besten in einer seperaten MST.

Editiert dann die setup.ini vorsichthalber, sodass sie nur noch die deutsche Sprache und die neue Transorm enthält:
adobe-reader-scriptbased-deployment-mst-changes-cleaning-logging-setup-ini
[Product]
msi=AcroRead.msi
Languages=1031
1031=German (Germany)
CmdLine=TRANSFORMS="AcroRead-deu.mst"

Installiert dann den Reader entsprechend dem oben gezeigten Script, dann sollte die Installation die Anpassungen der MST beinhalten und auf deutsch sein.

Kürzer, schneller, härter

Die richtigen Pro’s werden bei den ersten Schritten den Kopf schütteln, „das geht ja alles viel einfacher, schneller, in weniger Schritten“ usw.
Ja, man kann die Anpassungen, AIP und Patches mit viel weniger Schritten abarbeiten. Der Admin Guide hat an vielen Stellen diese komplizierteren Schritte beschrieben.
2 Beispiele:
Gleich am Anfang nach dem Download per Customization Wizard die Version angepasst und dann direkt diesen Befehl genutzt:

msiexec /i AcroRead.msi PATCH="AdbeRdrUpd11001.msp; AdbeRdrSecUpd11002.msp" TRANSFORMS="AcroRead.mst"

Damit wird der angepasste Reader installiert und daraufhin mit den Patches versehen. Mehrere Patches lassen sich wie gezeigt aneinanderreihen, die Pfade sollte man lieber noch ergänzen; habe ich der Übersicht wegen weggelassen.
Oder: alternativ kann man ohne Anpassung auch die wichtigsten Eigenschaften direkt bei der Installation mit den Property-Parametern setzen:

msiexec /i AcroRead.msi PATCH="AdbeRdrUpd11004_MUI.msp" LANG_LIST=de_DE SUPPRESSLANGSELECTION=1 REMOVE_PREVIOUS=YES EULA_ACCEPT=YES SYNCHRONIZER=NO

Die CMD Möglichkeiten beim Erstellen des AIP und der Installation sind vielfältig, aber benötigen auch weit mehr Expertise.
Außerdem machen sie die Fehlersuche viel komplizierter, sollte es während eines 1-Liner zu einem Fehler kommen.
Ich war deswegen immer der Freund von ausführlichen Schritt-für-Schritt Herangehensweisen. Entscheidet selbst.


MST Änderungen einer MSI mit Orca anzeigen

Viele komplexere Windows Installationen werden von .msi Installern durchgeführt. Diese MSI Datenpakete sind oftmals datenbankähnliche Datenstrukturen, die Informationen und Dateien für eine Installation bereithalten. Der Vorteil dieser Installer ist, dass sie sich, im Gegensatz zu .exe Dateien, einsehen und anpassen lassen. Änderungen an MSI Daten können direkt in der MSI, oder als extra Datei in Form einer .mst Datei, abgespeichert werden. So kann eine Grundinstallation in verschiedenen Formen, also eine .msi mit verschiedenen .mst Anpassungen, ausgeliefert werden.

Mit dem kleinen (retired) Microsoft Tool Orca (Parameter) lassen sich nicht nur .msi Dateien anpassen, sondern auch bestehende .mst Dateien anwenden und analysieren.

orca-msi-editor-standard

Über den Menüpunkt Transform kann man nun neue Änderungsdateien erstellen und speichern oder bestehende laden. Das ist besonders praktisch wenn man eine .mst nicht selber erstellt hat und nachsehen möchte, was konkret verändert wurde.
Beispiel: Adobe Produkte, wie z.B. der Reader oder Acrobat Professional, werden für gewöhnlich vor der Verteilung im Unternehmen mit dem Tool „Adobe Customization Wizard“ angepasst. Dieses Tool erstellt mit den gewünschten Anpassungen (Sprache, Pfad, Serial usw.) eine fertige .mst Datei, mit der man die Verteilung starten kann. Mit Orca kann man nun vorher diese .mst Datei laden und nachsehen, ob soweit alles stimmt.

orca-msi-editor-mst-transform-file-view

Im Fenstertitel sind die verknüpften .msi und .mst Dateien vermerkt, in der Oberfläche sind angepasste, hinzugefügte und entfernte Daten grün markiert. Nützlich, was?

Ich komme später nochmal darauf zurück, in welchen Fällen das besonders sinnvoll sein kann 😉


Admin

Sie möchten hier werben oder Sponsor auf längere Zeit werden? Ich garantiere Ihnen unschlagbare Preise bei meinen Besucherzahlen. Egal ob Banner, Textlinks oder andere Werbeformen. Informieren Sie sich bei mir unter werbung@hannes-schurig.de