Letzte Aktualisierung am 12.10.2024, 09:10:06 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.
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
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
Sieht eigentlich ganz ähnlich aus. Probier es mal so:
$strNewFileserver = „fileserver02.xzy.de“
Get-WmiObject -Class Win32_LogicalDisk | Where-Object { $_.DriveType -eq 4 -and $_.ProviderName -match ‚192.168.52.2‘} | Select DeviceID, VolumeName | foreach {
$net = New-Object -com WScript.Network
$net.removenetworkdrive($_.DeviceID)
$net.mapnetworkdrive($_.DeviceID,$(„$strNewFileserver\$_.VolumeName“),[bool]$UpdateProfile)
}
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
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.