Druckertreiber Installation mit MEM und pnputil.exe

Ich werde häufig nach einer Methode gefragt Druckertreiber zentral über Intune zu verteilen. Gerade auf Clients ohne lokale Adminrechte ist es nicht möglich Treiber beispielsweise von einem Printserver herunterzuladen und zu installieren. Hierzu habe ich ein Vorgehen entwickelt mit Hilfe von pnputil.exe Treiber auf Clients zu installieren.

Was benötigen wir dafür:
1. Die Treiberdateien des Herstellers (wichtig vor allem *.INF und *.CAT)
2. Eine Powershellumgebung (Visual Studio, ISE o.ä.)
3.Microsoft Win32 Content Prep Tool

Entpacken der Treiber

Die Treiber laden wir beim Druckerhersteller herunter und entpacken diese im gewünschten Pfad. Im Ordner, in dem die Installationsdatei liegt (*.INF) erstellen wir 3 PowerShellskripte:

  1. Install-Driver.ps1
  2. Remove-Driver.ps1
  3. Detectionscript.ps1

Install-Driver.ps1

Zur Installation des Treibers auf dem Client nutzen wir das Tool pnputil.exe. Dieses rufen wir per „Start-Process“- Befehl in der PowerShell auf und geben entsprechende Argumente, sowie die Installationsdatei an. Ist der Treiber mit pnputil geladen, kann mit dem Befehl „Add-PrinterDriver“ der gewünschte Treiber hinzugefügt werden. Sind in einem Treiberpaket mehrere Druckertreiber enthalten, können natürlich alle gewünschten Treiber hinzugefügt werden.

Da wir das Skript in eine WIN32 App packen, startet Intune bei der Verteilung standardmäßig eine 32-bit PowerShell. Diese kann allerdings pnputil.exe nicht aufrufen. Daher muss am Anfang des Skripts mitgegeben werden, dass das Skript in 64-bit PowerShell gestartet wird.

In meinem Beispiel nutze ich Treiber der Druckerserie THERMOMARK von Phoenix.

#starts script in 64bit powershell
If ($ENV:PROCESSOR_ARCHITEW6432 -eq "AMD64") {
    Try {
        &"$ENV:WINDIR\SysNative\WindowsPowershell\v1.0\PowerShell.exe" -File $PSCOMMANDPATH
    }
    Catch {
        Throw "Failed to start $PSCOMMANDPATH"
    }
    Exit
}

#install driver
#pnputil arguments
$INFARGS = @(
    "/add-driver"
    "PHOENIX.inf"
)

Start-Process pnputil.exe -ArgumentList $INFARGS -wait -passthru
Add-PrinterDriver -Name "THERMOMARK ROLL 2.0"
Add-PrinterDriver -Name "THERMOMARK CARD 2.0" 

Druckertreiber ohne vertrauenswürdige Zertifikate

Es gibt Druckertreiber, die standardmäßig von Windows 10 nicht als vertrauenswürdig eingestuft werden. Bei der Installation muss dies erst bestätigt werden.

In einer Intune Installation ist diese Userinteraktion nicht gewünscht und auch nicht möglich, da lokale Adminrechte notwendig sind. Das können wir allerdings lösen in dem wir im Powershellskript vorher das Zertifikat aus der *.CAT Datei exportieren und im Zertifikatsspeicher unter „Trusted Publisher“ speichern.
So haben wir nun ein Skript, das Druckertreiber mithilfe von pnputil.exe installiert.

#starts script in 64bit powershell
If ($ENV:PROCESSOR_ARCHITEW6432 -eq "AMD64") {
    Try {
        &"$ENV:WINDIR\SysNative\WindowsPowershell\v1.0\PowerShell.exe" -File $PSCOMMANDPATH
    }
    Catch {
        Throw "Failed to start $PSCOMMANDPATH"
    }
    Exit
}

#transfer driver certificate to local trusted cert store
$signature = Get-AuthenticodeSignature PHOENIX.cat
$store = Get-Item -Path Cert:\LocalMachine\TrustedPublisher
$store.Open("ReadWrite")
$store.Add($signature.SignerCertificate)
$store.Close()

#install driver
$INFARGS = @(
    "/add-driver"
    "PHOENIX.inf"
)

Start-Process pnputil.exe -ArgumentList $INFARGS -wait -passthru
Add-PrinterDriver -Name "THERMOMARK ROLL 2.0"
Add-PrinterDriver -Name "THERMOMARK CARD 2.0" 

Remove-Printer.ps1

Wichtig für einen reibungslosen Betrieb über Intune ist auch die Deinstallation von Programmpaketen. Somit kann auch die Deinstallation von alten Druckertreibern, die nicht mehr benötigt werden, realisiert werden. Hierzu nutzen wir wieder pnputil.exe und die gleiche Herangehensweise, wie bei der Installation.

If ($ENV:PROCESSOR_ARCHITEW6432 -eq "AMD64") {
    Try {
        &"$ENV:WINDIR\SysNative\WindowsPowershell\v1.0\PowerShell.exe" -File $PSCOMMANDPATH
    }
    Catch {
        Throw "Failed to start $PSCOMMANDPATH"
    }
    Exit
}
#delete driver
$INFARGS = @(
    "/delete-driver /force"
    "oemsetup.inf"
)

Start-Process pnputil.exe -ArgumentList $INFARGS -wait
Remove-PrinterDriver -Name "THERMOMARK ROLL 2.0"
Remove-PrinterDriver -Name "THERMOMARK CARD 2.0" 

Detectionscript.ps1

Damit Intune nach der Installation erkennt, dass der Vorgang erfolgreich war, müssen wir ein Erkennungsskript während der Bereitstellung in Intune hochladen. Dieses Skript prüft, ob die Druckertreiber über die PowerShell gefunden werden. Wenn man mehrere Treiber installiert, müssen alle Treiber auch in der Detection aufgenommen werden.
Dies könnte dann beispielsweise so aussehen.

IF ( (Get-PrinterDriver| Where-Object {($_.Name -Match "THERMOMARK ROLL 2.0")})`
 -and (Get-PrinterDriver| Where-Object {($_.Name -Match "THERMOMARK CARD 2.0")})){
  $True
} 

Paketierung

Jetzt haben wir alle notwendigen Dateien und Skripte und können das Intune Paket packen. Wichtig für die Paketierung ist, dass alle Skripte im Ordner mit der *.INF und *.CAT Datei liegen.
Das Detectionscript muss nicht mitgepackt werden, da es extra in Intune hochgeladen wird.

Zu paketierender Ordner mit allen Treiber und den Skripten

Ist der Ordner vollständig, starten wir das Microsoft Win32 Content Prep Tool und geben alle relevanten Informationen ein:

Das Tool packt uns nun eine Install-Driver.intunewin Datei, die wir in Intune hochladen können.

Einstellungen in Microsoft Endpoint Manager

Wir laden nun unsere INTUNEWIN Datei als Win32 App in Endpoint Manager hoch und geben dem Paket den gewünschten Namen.
Unter dem Punkt „Program“ geben wir das Installationskommando

powershell.exe -executionpolicy bypass ".\Install-Driver.ps1"

sowie das Deinstallationskommando an.

powershell.exe -executionpolicy bypass ".\Remove-Printer.ps1"

Das sollte dann am Ende etwa so aussehen:

Unter den Voraussetzungen muss Windows als 64-bit Architektur eingetragen werden. Die Betriebssystemversion sollte immer im supporteten Bereichen sein. In meinem Fall habe ich Windows 10 20 H2 angegeben.

Im nächsten Schritt laden wir unser Detectionscript.ps1 hoch.

Jetzt muss das Paket nur noch entsprechenden Usern, Geräten oder Gruppen zugewiesen. Natürlich gilt wie immer: Bevor ihr es ausrollt, testet es ausgiebig auf ein paar Maschinen.

Viel Spaß beim nachbauen!

Bei Fragen kommt gerne auf mich zu.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht.