Zum Hauptinhalt springen
  1. Blog/

Druckertreiber Installation mit MEM und pnputil.exe

·4 min
Daniel Kordes
Autor
Daniel Kordes
Microsoft 365 Consultant und Microsoft MVP aus Zürich. Ich blogge über Microsoft 365, Azure und Cloud-Technologien.
Inhaltsverzeichnis

–> Also available in English!

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.

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"

Unter den Voraussetzungen muss Windows als 64-bit Architektur eingetragen werden. Die Betriebssystemversion sollte immer im supporteten Bereichen sein.

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

Jetzt muss das Paket nur noch entsprechenden Usern, Geräten oder Gruppen zugewiesen werden. 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.