Drucker auf Clients via Powershell migrieren

Wir haben im Unternehmen mehrere Printserver am Start. In den nächsten Wochen steht eine Migration von Windows Server 2008 auf Windows Server 2012R2 an.
Der Umzug der Drucker auf dem Server selber ist ein Kinderspiel im Vergleich zu dem was alle Clients angeht.

Die Kolleginnen und Kollegen mit einer kl. Anleitung manuell die Drucker löschen zu und die neuen wieder verbinden lassen, wird wahrscheinlich die Supportanfragen in die Höhe treiben und viele stehen mit der IT-Welt auf Kriegsfuß.

Per Batch die Drucker an den Clients auszulesen und wieder zu verbinden ist machbar. Ich habe dazu auch ein längeres Skript gefunden. leider ist Batch nicht meine Stärke und es aus unserer Sicht Fehler anfällig.

Eine echte Alternative ist inzwischen PowerShell. Die Sprache ist sehr mächtig und vieles lässt sich damit inzwischen automatisieren. Warum also auch nicht die Druckermigration auf allen Arbeitsplatzsystemen. Voraussetung ist mindestens Powershell Version 1 auf dem Rechner installiert ist.

Das Script war in einem halben Tag geschrieben und getestet:

$strNewPrintserver = "printserver01.xzy.de"

# Prüft, ob das Skript bei diesem Benutzer bereits gelaufen ist
If (-not (Test-Path "C:\Temp\$env:USERNAME-printers.txt")) {

    Write-Host "Druckermigration wird gestartet..."
 
    # Alle Drucker auslesen, die als Netzwerkdrucker markiert sind
        Get-WMIObject Win32_Printer | where{$_.network -eq "true"} | Select ShareName, Default, Name | ForEach {

        # Ausgabe Freigabename
        $_.ShareName
        
        # Ausgabe Standarddrucker
        $_.Default

        # Drucker löschen
        (New-Object -ComObject WScript.Network).RemovePrinterConnection($_.Name)

        # Neue Drucker anlegen
        $printer = [WMIClass]"\\.\root\cimv2:Win32_Printer"
        $printer.AddPrinterConnection("\\" + $strNewPrintserver + "\" + $_.Sharename)

        # Standarddrucker einrichten
        if($_.Default -eq $true) {

            $printer = Get-WmiObject Win32_Printer | ? { $_.name -like "\\" + $strNewPrintserver +"\" + $_.Sharename }
            $printer.SetDefaultPrinter()
        }
    }

    # Ausgabe
    write-host "Fertig" | Out-File "C:\Temp\$env:USERNAME-printers.txt"
}

Quelle: Git Repository

Läuft unter Microsoft Windows Professional/Enterprise 7, Serivce Pack 1 (32Bit und 64Bit) problemlos. Falls Fehler gefunden werden, schreibt mir einen Kommentar.