Schriftarten im Netzwerk verteilen mit Batch, GPO, VBS, FontReg

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! 🙂

11 Kommentare

Schreibe einen Kommentar