Meine letzten Posts zum Firefox Script Deployment sind schon etwas älter: 17.0.2, 9.0, 8.0.1.
Sie beschreiben die zugrundeliegende Technik, mit der Firefox verteilt werden kann.

Update 19.09.2016: aktualisiertes Script beachtet jetzt die beiden verfügbaren 32/64bit-Architekturen von Firefox und updatet die installierte Architektur passend. Dafür müssen beide Installer in dem Format „Firefox48.0.2-32.exe“ und „Firefox48.0.2-64.exe“ vorliegen.
Info: Das im Skript verwendete Programm VersionCompare ist eine Eigenprogrammierung und hier als Download verfügbar.

Firefox 47.0.1

Das Installationsscript:

@echo off & Color 9f & setlocal
set wd=\\lea\Deployment\Software\Firefox
set log=%wd%\firefox.log
set tools=\\lea\Deployment\Sonstiges\tools
set instversion=0.0
set updateretry=0
set retry=0
set versionEL=9
set instEL=999
REM:: ######## EDIT THIS ####
set newversion=48.0.2
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 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:: prüfe ob eine 32bit Version von Firefox schon installiert ist
for /f "tokens=1,2,3 delims= " %%a in ('reg query "HKEY_LOCAL_MACHINE\SOFTWARE\Mozilla\Mozilla Firefox" /v "CurrentVersion"^|findstr "CurrentVersion"') do set instversion=%%c
REM:: falls keine 32bit Version von Firefox gefunden wurde, prüfe 64bit
if "%instversion%"=="0.0" for /f "tokens=1,2,3 delims= " %%a in ('reg query "HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Mozilla\Mozilla Firefox" /v "CurrentVersion"^|findstr "CurrentVersion"') do set instversion=%%c

REM:: Wenn Version nicht gleich: vergleiche Versionen mit dem Versionchecker
%tools%\VersionCompare.exe %instversion% %newversion%
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% (neuer) installiert >> %log% & goto end

:install
if "%processor_architecture%"=="AMD64" goto inst64

echo %date% %time% - %computername% (%instversion%) installiert %newversion% (32bit)... >> %log%
taskkill /F /IM firefox.exe
ping localhost -n 4
"%wd%\Firefox%newversion%-32.exe" -ms
goto cont

:inst64
echo %date% %time% - %computername% (%instversion%) installiert %newversion% (64bit)... >> %log%
taskkill /F /IM firefox.exe
ping localhost -n 4
"%wd%\Firefox%newversion%-64.exe" -ms
goto cont

:cont
set instEL=%errorlevel%
if %instEL%==1618 goto retry REM:: msiexec process in use, installation already in progress (eg. windows updates running)
if %instEL%==1602 goto retry REM:: user canceled installation (eg. taskkill)
if %instEL%==1603 goto retry REM:: fatal error, some use it for "already installed" (eg. java)
::if %instEL%==1638 goto uninstall REM:: another product is already installed, denies an update

echo %date% %time% - %computername% Installation abgeschlossen, Errorlevel %instEL% >> %log%
goto settings

:settings
REM:: Install 32-bit customisations
if exist "%programfiles%\Mozilla Firefox\" copy /Y "%wd%\override.ini" "%programfiles%\Mozilla Firefox\"
if exist "%programfiles%\Mozilla Firefox\" copy /Y "%wd%\mozilla.cfg" "%programfiles%\Mozilla Firefox\"
if exist "%programfiles%\Mozilla Firefox\" copy /Y "%wd%\local-settings.js" "%programfiles%\Mozilla Firefox\defaults\preferences"

REM:: Install 64-bit customisations
if exist "%ProgramFiles(x86)%\Mozilla Firefox\" copy /Y "%wd%\override.ini" "%ProgramFiles(x86)%\Mozilla Firefox\"
if exist "%ProgramFiles(x86)%\Mozilla Firefox\" copy /Y "%wd%\mozilla.cfg" "%ProgramFiles(x86)%\Mozilla Firefox\"
if exist "%ProgramFiles(x86)%\Mozilla Firefox\" copy /Y "%wd%\local-settings.js" "%ProgramFiles(x86)%\Mozilla Firefox\defaults\preferences"

goto end

:retry
if %retry%==1 goto retryfailed
echo %date% %time:~0,8% - %computername% hatte den Fehler %instEL%, retry in 5min... >> %log%
set retry=1
REM:: 5 Minuten warten
ping localhost -n 300 > nul
goto install

:retryfailed
echo _!_ %date% %time:~0,8% - %computername% hat die Installation abgebrochen, %instEL%, RETRY FAILED! >> %log%
goto end

:uninstall
if %retry%==1 goto retryfailed
echo %date% %time:~0,8% - %computername% deinstalliert Version %instversion% aufgrund EL 1638 Fehler... >> %log%
taskkill /F /IM firefox.exe
start /w "%programfiles%\Mozilla Firefox\uninstall\helper.exe" -ms
start /w "%programfiles(x86)%\Mozilla Firefox\uninstall\helper.exe" -ms
echo %date% %time:~0,8% - %computername% - %instversion% fertig deinstalliert, retry... >> %log%
set retry=1
goto install

REM:: Removes Firefox Desktop Icon - Windows XP
::if exist "%allusersprofile%\Desktop\Mozilla Firefox.lnk" del "%allusersprofile%\Desktop\Mozilla Firefox.lnk" /S

REM:: Removes Firefox Desktop Icon - Windows 7
::if exist "C:\Users\Public\Desktop\Mozilla Firefox.lnk" del "C:\Users\Public\Desktop\Mozilla Firefox.lnk"

:end
endlocal
exit

Datei install.ini hatte ich in den letzten Posts immer noch mit drin. Ich glaube jedoch, dass die Datei gar nicht mehr benutzt wird und habe sie mittlerweile aus meiner Verteilung entfernt.

Die Verteilung läuft bereits seit Langem ohne Probleme.
script-based-firefox-26-deployment-log

Flash ist eine weitere Standardsoftware auf den meisten Windows PCs, die regelmäßig aktualisiert werden muss. Also wieder ein Fall für eine Verteilung im Netzwerk. Nach den letzten Deployments [Skype, Java, Reader (Update), Firefox/Thunderbird (Update)] ist die Verteilung von Flash fast ein Kinderspiel.

Anmerkungen

Wie üblich wird zuerst die Version aus der Registry gelesen, überprüft und schlussendlich erfolgt die Installation .exe Dateien:

start /w flash-%version%_IE.exe -install
start /w flash-%version%_OTHER.exe -install

Achtung: Flash muss in 2 verschiedenen Ausführungen installiert werden. Auf der Downloadseite ist die Rede vom Internet Explorer und „Plug-In basierten Browsern“; also praktisch allen anderen Browsern. Daher 2 aufeinanderfolgende Installationen.
In 99% der Fälle bereitet die Installation keine Probleme. Für die restlichen 1% habe ich auch in diese Verteilung Fehlererkennung und ein Retry eingebaut. Die Fehler 1618, 1602 und 1603 resultieren in einem erneuten Installationsversuch 5 Minuten später.

Konfiguration

Nach der Installation wird noch eine Konfigdatei kopiert, die Flash mit einigen wenigen Einstellungen versieht.
mms.cfg:

AutoUpdateDisable=1
SilentAutoUpdateEnable=0
SilentAutoUpdateVerboseLogging=0

flash-deployment-working-dir-mms-config-file
Die Datei könnt ihr natürlich so anpassen, wie ihr die Einstellungen wollt.

Deployment

Update 19.09.2016: Version 23.0 getestet und läuft.
Info: Das im Skript verwendete Programm VersionCompare ist eine Eigenprogrammierung und hier als Download verfügbar.

flash-installer.bat:

@echo off & Color 9f & setlocal
set wd=\\server\Deployment\Software\Flash
set log=%wd%\flash-log.txt
REM:: --- Version hier ändern ---
set version=23.0
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

Anpassungen

In dem Script tragt ihr in Zeile 8 immer die gewünschte Version ein und benennt die Installationsdateien nach folgendem Schema um:
flash-[Version]_IE.exe (z.B. flash-21.0_IE.exe)
flash-[Version]_OTHER.exe (z.B. flash-21.0_OTHER.exe)
Die Verteilung besteht wie üblich aus den üblichen Verteilungsdateien, eurer angepassten Konfigurationsdatei mms.cfg und den umbenannten Installationsdateien.

Fertig!
script-based-flash-deployment-ad-gpo-files-log

Weiterführende Links:
Flash Downloads for Deployment
Ivan Dretvic’s Guide zu Flash 11 Deployment via GPO / 11.2 with auto-update
Adobe Flash Player Administration Guide

Letzte Woche hatte ich das skriptbasierte Skype Deployment im AD gezeigt. Dieser Beitrag soll zeigen, wie die Vorbereitung und Verteilung des Updates im Schnelldurchlauf aussieht.

Schritt 1: Download

Auf skype.com/go/getskype-msi gibt es wieder die aktuellste MSI.

Schritt 2: AIP erstellen

msiexec /a SkypeSetup.msi TARGETDIR=c:\skype

Wenige Sekunden nach dem Befehl sollten alle Daten entpackt worden sein:
skype-script-deployment-update-install

Schritt 3: MST erstellen/überprüfen (optional)

Anmerkung: Dieser Schritt ist optional, die Installation ist auch ohne MST möglich. Dabei wird dann eine Standardinstallation durchgeführt. Mit msiexec Parametern wie „FEATURE_IEPLUGIN=0 FEATURE_FFPLUGIN=0“ lassen sich bestimmte Einstellungen auch ohne MST anpassen. Mehr Links dazu im originalen Artikel.
MSI mit Orca öffnen, die bereits von der vorherigen Version existierende MST (Download) anwenden und nachschauen ob alle Änderungen noch stimmen:
skype-script-deployment-update-orca-msi-mst

Schritt 4: Kopieren

Damit die Skriptverteilung mit meinem Deployment Skript (siehe unten) funktioniert, müssen die in Schritt 2 entpackten AIP Installationsdateien sowie die MST aus Schritt 3 in einem bestimmten Ordner liegen.
Und zwar, relativ vom Skype Deployment Ordner gesehen, in einem Unterordner \deploy\[Version]\, also in diesem Fall:
\\server\Software\Skype\deploy\6.11.32.102\*AIP-Daten*
skype-script-deployment-update-dir

Schritt 5: Deployment

Holt euch das Installationsskript aus meinem Skype Deployment Post, es wurde seit dem nicht verändert.
Dann muss nur noch in Zeile 13 die neue Version eingetragen werden.
Und los gehts!
skype-script-deployment-update-log

Thema heute: Skype Deployment im Active Directory via GPO Startscript.

Ziemlich straight forward eigentlich:

Schritt 1: Download

Es gibt immer die aktuellste MSI unter dieser statischen URL.

Schritt 2: AIP erstellen

Damit könnt ihr dann direkt mit folgendem CMD Befehl in einem temporären Ordner ein AIP erstellen:

msiexec /a SkypeSetup.msi TARGETDIR=c:\skype\

Schritt 3: MST erstellen

Ihr könnt eure eigene MST erstellen (MSI mit Orca öffnet, Transform -> New Transform) oder meine MST hier herunterladen. Meine MST enthält die folgenden Änderungen:
Property -> ProductLanguage: 1031
Property -> ProductLanguageCode: de
Registry -> „Software\Microsoft\Windows\CurrentVersion\Run“ gelöscht
Shortcut -> „SkypeDesktopShortcut“ gelöscht

Mehr Hinweise zur MSI, MST und den Parametern hier, hier und hier.

Schritt 4: Skript

Nachdem ihr die fertigen AIP Daten auf ein Netzlaufwerk geschoben habt, kann es eigentlich auch schon losgehen mit der Skriptverteilung.
Ein Skript überprüft die Version der installierten Skype Version und patcht dann auf die neue Version falls nötig.
Hier also das install Script:
Update 17.03.2016: – Version 7.21 getestet und läuft.
Das im Skript verwendete Programm VersionCompare ist eine Eigenprogrammierung und hier als Download verfügbar.

@echo off && color 9f && setlocal
set wd=\\lea\Deployment\Software\Skype
set log=%wd%\skype.log
set tools=\\lea\Deployment\Sonstiges\tools
set skypedir=none
set skypeEL=999
set instversion=0.0
set versionEL=9
set regEL=999
set exepath=none
set retry=0
REM:: ######## EDIT THIS ####
set newversion=7.21
REM:: #######################

REM:: insert all sysinternals eula accepts
start /wait "" cmd /c \\lea\Deployment\Sonstiges\sysinternals\sysinternalseulaaccept.bat

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
if exist "c:\Program Files\Skype\Phone\skype.exe" set exepath="c:\Program Files\Skype\Phone\skype.exe"
if exist "c:\Program Files (x86)\Skype\Phone\skype.exe" set exepath="c:\Program Files (x86)\Skype\Phone\skype.exe"
if %exepath%==none goto taskkill
goto checkversion

:checkversion
for /f "tokens=1-3" %%i in ('%tools%\sigcheck %exepath%') do ( if "%%i %%j"=="File version:" set instversion=%%k )
%tools%\VersionCompare.exe %instversion% %newversion%
set versionEL=%errorlevel%
if "%versionEL%"=="-1" goto taskkill
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% (neuer) installiert >> %log% & goto end

:taskkill
start /wait "" cmd /c  %exepath% /shutdown
taskkill /F /IM Skype.exe
taskkill /F /IM SkypePM.exe
goto install

:install
echo %date% %time:~0,8% - %computername% installiert... >> %log%
::msiexec.exe /i %wd%\deploy\%newversion%\SkypeSetup.msi /qn /norestart FEATURE_IEPLUGIN=0 FEATURE_FFPLUGIN=0
msiexec.exe /i %wd%\deploy\%newversion%\SkypeSetup.msi /qn /norestart
set skypeEL=%errorlevel%
if %skypeEL%==1618 goto retry REM:: msiexec process in use, installation already in progress (eg. windows updates running)
if %skypeEL%==1602 goto retry REM:: user canceled installation (eg. taskkill)
if %skypeEL%==1603 goto retry REM:: fatal error, some use it for "already installed" (eg. java)
if %skypeEL%==1638 goto uninstall REM:: another product is already installed, denies an update
if %skypeEL%==1625 goto uninstall REM:: skype installer sometimes threw this one, don't know why
echo %date% %time:~0,8% - %computername% hat Version %newversion% mit EL %skypeEL% abgeschlossen >> %log%
if %processor_architecture%==x86 goto reg32
if %processor_architecture%==AMD64 goto reg64
goto end

:retry
if %retry%==1 goto retryfailed
echo %date% %time:~0,8% - %computername% hatte den Fehler %skypeEL%, retry in 500Sek... >> %log%
set retry=1
REM:: 5 Minuten warten
ping localhost -n 500 > nul
goto taskkill

:retryfailed
echo _!_ %date% %time:~0,8% - %computername% hat die Installation abgebrochen, RETRY FAILED! >> %log%
goto end

:uninstall
if %retry%==1 goto retryfailed
start /wait "" cmd /c  %exepath% /shutdown
taskkill /F /IM Skype.exe
taskkill /F /IM SkypePM.exe
echo %date% %time:~0,8% - %computername% deinstalliert Version %instversion% aufgrund EL 1638/1625 Fehler... >> %log%
msiexec /qn /norestart /X{1845470B-EB14-4ABC-835B-E36C693DC07D}
msiexec /qn /norestart /X{744A328E-3CC5-4008-BC6E-97C8FB3EAAF8}
msiexec /qn /norestart /X{E633D396-5188-4E9D-8F6B-BFB8BF3467E8}
wmic product where "name like 'Skype%%'" call uninstall /nointeractive
wmic product where "name like 'Skype(tm)%%'" call uninstall /nointeractive
echo %date% %time:~0,8% - %computername% - %instversion% deinstalliert, retry... >> %log%
set retry=1
goto taskkill

:reg32
%COMSPEC% /C reg add "HKLM\Software\Policies\Skype\Phone" /v "DisableVersionCheck" /d "1" /t REG_DWORD /f
set regEL=%errorlevel%
%COMSPEC% /C reg add "HKLM\Software\Policies\Skype\Phone" /v "DisableSupernode" /d "1" /t REG_DWORD /f
set regEL=%regEL%%errorlevel%
echo %date% %time:~0,8% - %computername% hat die (32bit) Reg Keys mit EL %regEL% importiert >> %log%
goto end

:reg64
%COMSPEC% /C reg add "HKLM\Software\Wow6432Node\Policies\Skype\Phone" /v "DisableVersionCheck" /d "1" /t REG_DWORD /f
set regEL=%errorlevel%
%COMSPEC% /C reg add "HKLM\Software\Wow6432Node\Policies\Skype\Phone" /v "DisableSupernode" /d "1" /t REG_DWORD /f
set regEL=%regEL%%errorlevel%
echo %date% %time:~0,8% - %computername% hat die (64bit) Reg Keys mit EL %regEL% importiert >> %log%
goto end

:end
endlocal
exit

Hm ja, wurschtelt euch durch, hier die Key-Features kurz gefasst:
Sysinternals EULA Accept (siehe unten)
Clientfilter
– Versionsüberprüfung anhand der .exe (32bit/64bit angepasst) mit Sigcheck statt per Registry. Ich bin mir noch unsicher ob ich in Zukunft auf die .exe oder Registry setze
skype-script-deployment-version
– Versionsvergleich mit versioncompare.exe
– Installation per MSI mit einer MST Anpassung für: Allusers, kein Desktop Shortcut, kein Autorun, deutsche Sprache.
– Fehlermanagement für typische Fehler: 1618, 1602 und 1603 mit 5 Minuten warten Retry und 1638 mit Uninstall und Retry. Der Uninstall Product Code müsste für Skype 5.9 und aufwärts stimmen
– Registry Key Imports für no-Autoupdate und „DisableSupernode“, was auch immer das ist, sieht man aber sehr häufig, 32bit/64bit angepasst
– alles wird gut in einer Logdatei festgehalten (siehe unten)

Die in Zeile 17 verwendete sysinternalseulaaccept.bat gebe ich euch auch noch. Sie bewirkt, dass die Sysinternals Tools benutzt werden können, ohne, dass das „EULA akzeptieren“ Popup erscheint. Denn ich glaube, dass die Tools sich per Kommandozeile nicht verwenden lassen, solange man nicht diese EULA einmal händisch akzeptiert hat. Nach dem Ausführen dieser Batch Datei sollte das keine Probleme mehr machen.

REM  Thanks: Peter Hahndorf
REM  URL: http://peter.hahndorf.eu/blog/2010/03/07/WorkAroundSysinternalsLicensePopups.aspx

reg.exe ADD "HKCU\Software\Sysinternals\AccessChk" /v EulaAccepted /t REG_DWORD /d 1 /f
reg.exe ADD "HKCU\Software\Sysinternals\AccessEnum" /v EulaAccepted /t REG_DWORD /d 1 /f
reg.exe ADD "HKCU\Software\Sysinternals\AdExplorer" /v EulaAccepted /t REG_DWORD /d 1 /f
reg.exe ADD "HKCU\Software\Sysinternals\AdInsight" /v EulaAccepted /t REG_DWORD /d 1 /f
reg.exe ADD "HKCU\Software\Sysinternals\AdRestore" /v EulaAccepted /t REG_DWORD /d 1 /f
reg.exe ADD "HKCU\Software\Sysinternals\Autologon" /v EulaAccepted /t REG_DWORD /d 1 /f
reg.exe ADD "HKCU\Software\Sysinternals\Autoruns" /v EulaAccepted /t REG_DWORD /d 1 /f
reg.exe ADD "HKCU\Software\Sysinternals\BgInfo" /v EulaAccepted /t REG_DWORD /d 1 /f
reg.exe ADD "HKCU\Software\Sysinternals\BlueScreen" /v EulaAccepted /t REG_DWORD /d 1 /f
reg.exe ADD "HKCU\Software\Sysinternals\CacheSet" /v EulaAccepted /t REG_DWORD /d 1 /f
reg.exe ADD "HKCU\Software\Sysinternals\ClockRes" /v EulaAccepted /t REG_DWORD /d 1 /f
reg.exe ADD "HKCU\Software\Sysinternals\Contig" /v EulaAccepted /t REG_DWORD /d 1 /f
reg.exe ADD "HKCU\Software\Sysinternals\Coreinfo" /v EulaAccepted /t REG_DWORD /d 1 /f
reg.exe ADD "HKCU\Software\Sysinternals\Ctrl2cap" /v EulaAccepted /t REG_DWORD /d 1 /f
reg.exe ADD "HKCU\Software\Sysinternals\DebugView" /v EulaAccepted /t REG_DWORD /d 1 /f
reg.exe ADD "HKCU\Software\Sysinternals\Desktops" /v EulaAccepted /t REG_DWORD /d 1 /f
reg.exe ADD "HKCU\Software\Sysinternals\Disk Usage" /v EulaAccepted /t REG_DWORD /d 1 /f
reg.exe ADD "HKCU\Software\Sysinternals\Disk2vhd" /v EulaAccepted /t REG_DWORD /d 1 /f
reg.exe ADD "HKCU\Software\Sysinternals\DiskExt" /v EulaAccepted /t REG_DWORD /d 1 /f
reg.exe ADD "HKCU\Software\Sysinternals\Diskmon" /v EulaAccepted /t REG_DWORD /d 1 /f
reg.exe ADD "HKCU\Software\Sysinternals\DiskView" /v EulaAccepted /t REG_DWORD /d 1 /f
reg.exe ADD "HKCU\Software\Sysinternals\EFSDump" /v EulaAccepted /t REG_DWORD /d 1 /f
reg.exe ADD "HKCU\Software\Sysinternals\Handle" /v EulaAccepted /t REG_DWORD /d 1 /f
reg.exe ADD "HKCU\Software\Sysinternals\Hex2dec" /v EulaAccepted /t REG_DWORD /d 1 /f
reg.exe ADD "HKCU\Software\Sysinternals\Junction" /v EulaAccepted /t REG_DWORD /d 1 /f
reg.exe ADD "HKCU\Software\Sysinternals\LDMDump" /v EulaAccepted /t REG_DWORD /d 1 /f
reg.exe ADD "HKCU\Software\Sysinternals\ListDLLs" /v EulaAccepted /t REG_DWORD /d 1 /f
reg.exe ADD "HKCU\Software\Sysinternals\LiveKd" /v EulaAccepted /t REG_DWORD /d 1 /f
reg.exe ADD "HKCU\Software\Sysinternals\LoadOrder" /v EulaAccepted /t REG_DWORD /d 1 /f
reg.exe ADD "HKCU\Software\Sysinternals\LogonSessions" /v EulaAccepted /t REG_DWORD /d 1 /f
reg.exe ADD "HKCU\Software\Sysinternals\MoveFile" /v EulaAccepted /t REG_DWORD /d 1 /f
reg.exe ADD "HKCU\Software\Sysinternals\NTFSInfo" /v EulaAccepted /t REG_DWORD /d 1 /f
reg.exe ADD "HKCU\Software\Sysinternals\PageDefrag" /v EulaAccepted /t REG_DWORD /d 1 /f
reg.exe ADD "HKCU\Software\Sysinternals\PendMoves" /v EulaAccepted /t REG_DWORD /d 1 /f
reg.exe ADD "HKCU\Software\Sysinternals\PipeList" /v EulaAccepted /t REG_DWORD /d 1 /f
reg.exe ADD "HKCU\Software\Sysinternals\PortMon" /v EulaAccepted /t REG_DWORD /d 1 /f
reg.exe ADD "HKCU\Software\Sysinternals\ProcDump" /v EulaAccepted /t REG_DWORD /d 1 /f
reg.exe ADD "HKCU\Software\Sysinternals\Process Explorer" /v EulaAccepted /t REG_DWORD /d 1 /f
reg.exe ADD "HKCU\Software\Sysinternals\Process Monitor" /v EulaAccepted /t REG_DWORD /d 1 /f
reg.exe ADD "HKCU\Software\Sysinternals\ProcFeatures" /v EulaAccepted /t REG_DWORD /d 1 /f
reg.exe ADD "HKCU\Software\Sysinternals\PsExec" /v EulaAccepted /t REG_DWORD /d 1 /f
reg.exe ADD "HKCU\Software\Sysinternals\PsFile" /v EulaAccepted /t REG_DWORD /d 1 /f
reg.exe ADD "HKCU\Software\Sysinternals\PsGetSid" /v EulaAccepted /t REG_DWORD /d 1 /f
reg.exe ADD "HKCU\Software\Sysinternals\PsInfo" /v EulaAccepted /t REG_DWORD /d 1 /f
reg.exe ADD "HKCU\Software\Sysinternals\PsKill" /v EulaAccepted /t REG_DWORD /d 1 /f
reg.exe ADD "HKCU\Software\Sysinternals\PsList" /v EulaAccepted /t REG_DWORD /d 1 /f
reg.exe ADD "HKCU\Software\Sysinternals\PsLoggedOn" /v EulaAccepted /t REG_DWORD /d 1 /f
reg.exe ADD "HKCU\Software\Sysinternals\PsLogList" /v EulaAccepted /t REG_DWORD /d 1 /f
reg.exe ADD "HKCU\Software\Sysinternals\PsPasswd" /v EulaAccepted /t REG_DWORD /d 1 /f
reg.exe ADD "HKCU\Software\Sysinternals\PsService" /v EulaAccepted /t REG_DWORD /d 1 /f
reg.exe ADD "HKCU\Software\Sysinternals\PsShutdown" /v EulaAccepted /t REG_DWORD /d 1 /f
reg.exe ADD "HKCU\Software\Sysinternals\PsSuspend" /v EulaAccepted /t REG_DWORD /d 1 /f
reg.exe ADD "HKCU\Software\Sysinternals\PsTools" /v EulaAccepted /t REG_DWORD /d 1 /f
reg.exe ADD "HKCU\Software\Sysinternals\RAMMap" /v EulaAccepted /t REG_DWORD /d 1 /f
reg.exe ADD "HKCU\Software\Sysinternals\RegDelNull" /v EulaAccepted /t REG_DWORD /d 1 /f
reg.exe ADD "HKCU\Software\Sysinternals\RegJump" /v EulaAccepted /t REG_DWORD /d 1 /f
reg.exe ADD "HKCU\Software\Sysinternals\RootkitRevealer" /v EulaAccepted /t REG_DWORD /d 1 /f
reg.exe ADD "HKCU\Software\Sysinternals\SDelete" /v EulaAccepted /t REG_DWORD /d 1 /f
reg.exe ADD "HKCU\Software\Sysinternals\ShareEnum" /v EulaAccepted /t REG_DWORD /d 1 /f
reg.exe ADD "HKCU\Software\Sysinternals\ShellRunas" /v EulaAccepted /t REG_DWORD /d 1 /f
reg.exe ADD "HKCU\Software\Sysinternals\Sigcheck" /v EulaAccepted /t REG_DWORD /d 1 /f
reg.exe ADD "HKCU\Software\Sysinternals\Streams" /v EulaAccepted /t REG_DWORD /d 1 /f
reg.exe ADD "HKCU\Software\Sysinternals\Strings" /v EulaAccepted /t REG_DWORD /d 1 /f
reg.exe ADD "HKCU\Software\Sysinternals\Sync" /v EulaAccepted /t REG_DWORD /d 1 /f
reg.exe ADD "HKCU\Software\Sysinternals\TCPView" /v EulaAccepted /t REG_DWORD /d 1 /f
reg.exe ADD "HKCU\Software\Sysinternals\VMMap" /v EulaAccepted /t REG_DWORD /d 1 /f
reg.exe ADD "HKCU\Software\Sysinternals\VolumeId" /v EulaAccepted /t REG_DWORD /d 1 /f
reg.exe ADD "HKCU\Software\Sysinternals\Whois" /v EulaAccepted /t REG_DWORD /d 1 /f
reg.exe ADD "HKCU\Software\Sysinternals\WinObj" /v EulaAccepted /t REG_DWORD /d 1 /f
reg.exe ADD "HKCU\Software\Sysinternals\ZoomIt" /v EulaAccepted /t REG_DWORD /d 1 /f
exit

Sie muss eigentlich nur einmal pro PC ausgeführt werden, danach sind die Reg Keys ja drin. Jedoch dauert die Ausführung eh nur 1-2 Sekunden, eine Überprüfung würde da kaum Sinn ergeben.

Hier ein Auszug aus der Logdatei:
skype-script-deployment-log
Hier sieht man gut die verschiedenen Abläufe:

  • Rechner 60, 42 und 28 deinstallieren zuerst eine alte Version, bei der die Installation der neuen Version mit Fehlercode 1638 abbrach. Nach der Deinstallation erfolgt die Neuinstallation problemfrei.
  • Rechner 9 und 54 haben bereits diese oder eine neuere Version installiert.
  • Und der Rechner 36 hatte eine ältere Version installiert, die ohne Deinstallation erfolgreich aktualisiert werden konnte.

Somit wurden bisher alle Computer letztendlich mit Errorlevel 0 erfolgreich bedient.

Download

Ich habe mal alle nötigen Dateien zu einem Download zusammengefasst:
skype-script-deployment-download
Download section
skype [.zip]

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. Die besten Lösung ist ganz unten, Stichwort FontReg.exe. Ziel ist die Verteilung (also Installation zur Verwendung) von Schriftarten in Windows Netzwerken über Gruppenrichtlinien.

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

Batch (nicht empfohlen)

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 (nicht empfohlen)

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 (nicht empfohlen)

Dieses VBS installiert alle Fontdateien, die sich in einem bestimmten Ordner befinden. Der Ordner wird in strFontSourcePath angegeben.

' via http://www.morovia.com/kb/Installing-Fonts-command-script-10008.html
' didnt work as is, some more lines were needed to make it work

Option Explicit
Dim objShell, objFSO, wshShell
Dim strFontSourcePath, objFolder, objFont, objNameSpace, objFile, oWinFonts

Set objShell = CreateObject("Shell.Application")
Set wshShell = CreateObject("WScript.Shell")
Set objFSO = createobject("Scripting.Filesystemobject")

strFontSourcePath = "\\server\Deployment\Sonstiges\fonts\fonts\"

If objFSO.FolderExists(strFontSourcePath) Then

Set objNameSpace = objShell.Namespace(strFontSourcePath)
Set objFolder = objFSO.getFolder(strFontSourcePath)
Const FONTS = &H14&
Set oWinFonts = objShell.Namespace(FONTS)

For Each objFile In objFolder.files
 If LCase(right(objFile,4)) = ".ttf" Then
  If objFSO.FileExists(wshShell.SpecialFolders("Fonts") & "\" & objFile.Name) Then
   
  Else
   Set objFont = objNameSpace.ParseName(objFile.Name)
   oWinFonts.CopyHere objNameSpace.ParseName(objFile.Name)
   objFont.InvokeVerb("Install")
   Set objFont = Nothing
  End If
 End If
Next
Else
 Wscript.Echo "Font Source Path does not exists"
End If

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%\install-fonts.txt

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

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

::REM Test mit zwei beliebigen Schriftarten
if exist "%windir%\fonts\OpenSans-SemiboldItalic.ttf" echo %date% %time:~0,8% - %computername% hat OpenSans installiert >> %log%
if exist "%windir%\fonts\Lato-ThinItalic.ttf" echo %date% %time:~0,8% - %computername% hat Lato 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.
Aber egal ob dieser Code, diese Kurzfassung oder anderen Varianten, und egal wie man es dreht und wendet – zu 100% zuverlässig sind die Skripte nicht. Auch in meinem Netzwerk wollten ca. 10% der Rechner diese Variante nicht annehmen.

FontReg.exe (empfohlen)

Nach weiterer Recherche fand ich eine Lösung, die SO einfach ist, dass es mich schon fast aufregt, auf dem Weg dorthin etliche Stunden nicht nicht 100% funktionierende Skriptlösungen investiert zu haben. FontReg ist die Lösung, eine Weiterentwicklung des älteren Windows Utilities fontinst.exe.
Das Tool, wenn es ohne weitere Parameter aufgerufen wird, repariert fehlerhafte oder fehlende Schriftartenverknüpfungen und ermöglicht damit einen einfachen Zweizeiler für die Schriftverteilung:

xcopy "\\server\Deployment\Sonstiges\fonts\fonts\*.*" "c:\Windows\Fonts" /y
"\\server\Deployment\Sonstiges\fonts\FontReg.exe"

Awesome! 🙂

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.

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

Eine Sache stört mich bei neu installierten Computern oft: die Windows Explorer Verknüpfung in der Taskleiste öffnet die Übersicht der – meiner Ansicht nach – völlig sinnlosen Bibliotheken.
windows-explorer-computer-statt-bibliotheken-ansicht

Ein simples Problem mit einer ebenso einfachen Lösung:
Rechtsklick auf die Explorer Verknüpfung -> Eigenschaften -> an das Ziel folgenden String anhängen:
[text]/e,::{20d04fe0-3aea-1069-a2d8-08002b30309d}[/text]
windows-explorer-computer-statt-bibliotheken-verknüpfung-ziel windows-explorer-computer-statt-bibliotheken-computer

Problem gelöst!

Für die Ansicht einer bestimmten Partition mit dem Explorer nutzt ihr eine Verknüpfung mit mit diesem Ziel:
[text]%windir%\explorer.exe /e, /root, c:[/text]
windows-explorer-computer-statt-bibliotheken-laufwerk-c

Mich persönlich stört es weniger, da ich sowieso den Total Commander anstelle des Windows Explorers nutze. Ein Tipp für alle IT-versierten Nutzer! Etwas Umgewöhnung ist nötig aber das Tool ist pure Power, wenn man es beherrscht.