Netzwerkdrucker via Powershell migrieren

Letzte Aktualisierung am 01.01.2023, 14:01:13 Uhr

Auf Grund einer Domänenmigration musste auch ein Druckserver (=Printserver) umgezogen. Das ist an sich mit ADMT kein großer Aufwand. Sogar die Drucker werden 1:1 wieder im Microsoft Active Directory veröffentlicht. Problematischer sind hierbei die Benutzer, welche in ihrem Profil jeweils verschiedenste Drucker verbunden haben. Tricks wie ein CNAME oder DNS-Zone für die alte Domäne funktionieren nicht.

Ich habe vor über 1 1/2 Jahren bereits solch ein Skript hier veröffentlicht. Was ich damals nicht berücksichtigt habe war, dass der Drucker sowohl mit dem NetBIOS-Name oder FQDN des Servers verbunden ist. Um beide Fälle abzufangen, war eine Anpassung notwendig.

Untenstehend die neue Version des Skripts. In der ersten Zeile wird der FQDN des neuen Printservers eingetragen.

$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

Verbesserungsvorschläge sind immer herzlich Willkommen.

Abonnieren
Benachrichtige mich bei
5 Comments
neueste
älteste
Inline Feedbacks
View all comments
Achim
24.01.2017 09:31

Da funktioniert noch irgendwas nicht. Er setzt zwar ein rotes X im Explorer, der Zugriff funktioniert aber nach wie vor. Es kommt auch diese Meldung:

The local device name has a remembered connection to another network resource.
At line:5 char:36
+ … .mapnetworkdrive($_.DeviceID,$(„$NewFileserver\$_.VolumeName“),[bool] …
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : OperationStopped: (:) [], COMException
+ FullyQualifiedErrorId : System.Runtime.InteropServices.COMException

Achim
Reply to  Achim
25.01.2017 08:50

Hallo Daniel,

folgendes ist jetzt raus gekommen:

$oldserver = „oldFileServer“
$newserver = „newFileServer“
$oldunits = Get-ChildItem -Path HKCU:\Network\ -Name
ForEach ($unit in $oldunits)
{
 $oldmap = (Get-Itemproperty HKCU:\Network\$unit).RemotePath
 If ($oldmap -match $oldserver)
 {
     #Remove-PSDrive –Name $unit -Force
    (New-Object -ComObject WScript.Network).RemoveNetworkDrive($unit +“:“, $true, $true)
    New-PSDrive –Name $unit –PSProvider FileSystem –Root $oldmap.replace($oldserver,$newserver) –Persist
 }

Es gibt aber noch Probleme. Werde mich evtl. nochmals melden.
Danke dir auf jeden Fall

Achim
23.01.2017 14:27

Habe selber gebastelt und hier geändert:
$printers = @(Get-WMIObject Win32_Printer | where{$_.network -eq $True –And $_.Name -match „printserver1“} | Select-Object -expandProperty Name)

und am Ende:
If ($default_printer –match “printserver1” )

{ $default_printer = $default_printer.replace(„$old_printserver“, „$new_printserver“)

$printer = Get-WmiObject Win32_Printer | ? { $_.name -like „*$default_printer*“}
$printer.SetDefaultPrinter() }
Habe auch nach wie vor Teile vom älteren Skript:
https://blog.daniel.wydler.eu/2014/01/02/drucker-auf-clients-via-powershell-migrieren/
mit drin gelassen.
Wäre aber trotzdem dankbar für Hilfe bezüglich des Fileservers

Achim
23.01.2017 09:30

Sehr gutes Skript.
Wie müsste es denn heißen wenn man nur die Drucker migrieren will die zu einem bestimmten Printserver (\\printserver1) verbunden sind. Alle anderen zu \\printserver2 z. B. sollten von dem Skript ignoriert werden. Natürlich auch der Standarddrucker, sollte er nicht mit printserver1 verbunden sein.

Als weitere Herausforderung hätte ich die ähnliche Migration der User bei einem neuen Fileserver. Also bei allen Usern von \\alterFileserver nach \\neuerFileserver umzuziehen. Die Freigabenamen selber bleiben gleich, z. B. \\neuerFileserver\Daten.