In Windows 10 und 11 sind viele Schriftarten bereits vorhanden. Oft hat eine Firma aber eine eigene Schriftart, welche für die Einhaltung von CI/CD auf allen Geräten benötigt wird. Dies kann z.B. "Open Sans" die "Deutschschweizer Basisschrift" oder eine andere Schriftart sein. In solchen Fällen nutze ich zum Installieren / Verteilen der Schriftarten via Intune ein PowerShell Script innerhalb eines Win32 Paketes.

Table of Contents

Win32 für Schriftarten

Das Win32 Packet baue ich wie die meisten meiner Pakete nach derselben Logik auf. Dies habe ich zuvor im Beitrag "my take on win32 apps - Intune" beschrieben.
In diesem Beispiel installiere ich die Schriftart Open Sans von Google, welche in vielen Webseiten zum Einsatz kommt. Zum Installieren weiterer Schriftarten via Intune musst du diese übrigens nur in den Ordner "Fonts" im Paket legen und das intunewin neu generieren.

Installation von Schriftarten

Um die Schriftart auf einem Endgerät zu installieren, müssen wir diese einerseits ins Verzeichnis "C:\Windows\Fonts" kopieren und zusätzlich in der Windows Registry unter "HKLM:\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Fonts" registrieren.

Da die meisten Schriftarten aus mehreren TTF oder OTF Dateien bestehen, habe ich das Paket so aufgebaut, dass du diese im Unterverzeichnis Fonts ablegen kannst. Pro TTF und/oder OTF Datei innerhalb dieses Ordners wird dann automatisch der Kopiervorgang inklusive Registry Key Erstellung durchgeführt.

Um das gleiche Paket mit allenfalls einem erweiterten Schriftsatz erneut installieren zu können, hinterlege ich im Validierungsfile übrigens eine Version.

$PackageName = "Company-Fonts"
$Version = "1"

$Path_local = "$Env:Programfiles\_MEM"
Start-Transcript -Path "$env:ProgramData\Microsoft\IntuneManagementExtension\Logs\$PackageName-install.log" -Force

try{

    $WorkingPath = "$Path_local\Data\Fonts"
    New-Item -ItemType "directory" -Path $WorkingPath -Force
    Copy-Item -Path ".\Fonts\*" -Destination $WorkingPath -Recurse

    $AllFonts = @()
    $AllFonts += Get-ChildItem -Path "$WorkingPath\*.ttf"
    $AllFonts += Get-ChildItem -Path "$WorkingPath\*.otf"

    foreach($FontFile in $AllFonts){
        try{
            Copy-Item -Path "$WorkingPath\$($FontFile.Name)" -Destination "$env:windir\Fonts" -Force -PassThru -ErrorAction Stop
            New-ItemProperty -Path "HKLM:\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Fonts" -Name $FontFile.Name -PropertyType String -Value $FontFile.Name -Force
        }catch{
            Write-Error $_
        }
    }

    Remove-Item $WorkingPath -Force -Recurse

    New-Item -Path "$Path_local\Validation\$PackageName" -ItemType "file" -Force -Value $Version
}catch{
    Write-Host "_____________________________________________________________________"
    Write-Host "ERROR"
    Write-Host "$_"
    Write-Host "_____________________________________________________________________"
    exit 1618
}
Stop-Transcript
Code language: PowerShell (powershell)

Deinstallation von Schriftarten

Bei der Deinstallation verwende ich im Grunde dieselbe Logik wie bei der Installation, einfach, dass hier im Gegensatz zu einem Kopiervorgang und der Registry Erstellung ein Löschvorgang ausgeführt wird. Ebenfalls lösche ich das Validierungsfile.

$PackageName = "Company-Fonts"

$Path_local = "$Env:Programfiles\_MEM"
Start-Transcript -Path "$env:ProgramData\Microsoft\IntuneManagementExtension\Logs\$PackageName-uninstall.log" -Force

$WorkingPath = "$Path_local\Data\Fonts"
New-Item -ItemType "directory" -Path $WorkingPath -Force
Copy-Item -Path ".\Fonts\*" -Destination $WorkingPath -Recurse

$AllFonts = Get-ChildItem -Path "$WorkingPath\*.ttf"
$AllFonts += Get-ChildItem -Path "$WorkingPath\*.otf"

foreach($FontFile in $AllFonts){
    try{
        Remove-Item -Path "$WorkingPath\$($FontFile.Name)" -Force
        Remove-ItemProperty -Path "HKLM:\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Fonts" -Name $FontFile.Name -Force
    }catch{
        Write-Host $_
    }
}

Remove-Item $WorkingPath -Force -Recurse

Remove-Item -Path "$Path_local\Validation\$PackageName" -ItemType "file" -Force -Value $Version

Stop-TranscriptCode language: PowerShell (powershell)

Erkennungsregel

Die Erkennungsregel ist sehr simpel und überprüft, ob das Validierungsfile mit der entsprechenden Zielversion als Inhalt vorhanden ist. Ist dies der Fall, wird "Found it!" ausgegeben und der Endpoint Manager beziehungsweise Intune weiss, dass da Paket auf dem Endgerät vorhanden ist.

$PackageName = "Company-Fonts"
$Version = "1"
$Path_local = "$Env:Programfiles\_MEM"
$ProgramVersion_current = Get-Content -Path "$Path_local\Validation\$PackageName"

if($ProgramVersion_current -eq $Version){
    Write-Host "Found it!"
}Code language: PowerShell (powershell)

Win32 Packet erstellen und verteilen

Mit dem Intune Win32 Prep Tool wird das Paket, nachdem das CSV und oder der Desktop Ordner abgefüllt ist erstellt:

intunewin creation fonts

Anschliessend erstellen wir ein "Windows app (Win32)" und laden die erstellte Datei «install.intunewin» im MEM/Intune mit den entsprechenden Parametern hoch. (rot zwingend, orange optional, aber hilfreich, wenn das Unternehmensportal genutzt wird.)

NameFonts oder individueller Name
BeschreibungHinweis zu den Schriftarten
Herausgeberindividuell
Iconfrei wählbar, erscheint im Unternehmensportal
Installations-Befehl%SystemRoot%\sysnative\WindowsPowerShell\v1.0\powershell.exe -executionpolicy bypass -command .\install.ps1
Deinstallations-Befehl%SystemRoot%\sysnative\WindowsPowerShell\v1.0\powershell.exe -executionpolicy bypass -command .\uninstall.ps1
Anforderungenx64 und 2004 (Windows Version nicht relevant)
Erkennungsregelcustom script, check.ps1
Abhängigkeitkeine
Zuweisungje nach Anforderung

Nun hast du das Paket erstellt im Endpoint Manager hochgeladen und kannst es an die gewünschten Geräte verteilen. Vergiss bei einer Anpassung am Paket nicht, die Version sowohl im "install.ps1" als auch im "check.ps1" anzupassen.

Video Walkthrough