Bin/Move-PrinterConnections.ps1
|
# Set defaults if not provided if (-not $OldServer) { $OldServer = "E10-REPORT-1" } if (-not $NewServer) { $NewServer = "PRINTSRV-1" } $oldPrefix = "\\$OldServer\" $diagnosticFile = "$env:TEMP\PrinterMigration_Debug.txt" # Capture current default printer connection $defaultConn = $null $defaultWmi = Get-CimInstance -ClassName Win32_Printer -Filter "Default = TRUE" -ErrorAction SilentlyContinue if ($defaultWmi -and $defaultWmi.Name) { if ($defaultWmi.Name -like "\\*\*") { $defaultConn = $defaultWmi.Name } } # Get printers connected from old server $allPrinters = Get-CimInstance -ClassName Win32_Printer -ErrorAction SilentlyContinue $allConnectionNames = @($allPrinters | Where-Object { $_.Name -like "\\*\*" } | Select-Object -ExpandProperty Name) $oldPrinters = @($allPrinters | Where-Object { $_.Name -like "$oldPrefix*" }) $matchingConnectionNames = @($oldPrinters | Select-Object -ExpandProperty Name) # Diagnostic output "User: $env:USERDOMAIN\$env:USERNAME" | Out-File $diagnosticFile "Computer: $env:COMPUTERNAME" | Out-File $diagnosticFile -Append "All Printers: $($allConnectionNames -join '; ')" | Out-File $diagnosticFile -Append "Old Server Prefix: $oldPrefix" | Out-File $diagnosticFile -Append "Matching Printers: $($matchingConnectionNames -join '; ')" | Out-File $diagnosticFile -Append if (-not $oldPrinters) { return } # Determine if we need to restore default printer after migration $setDefaultTo = $null if ($defaultConn -like "$oldPrefix*") { $defaultShare = $defaultConn -replace "^\\\\$OldServer\\", "" $setDefaultTo = "\\$NewServer\$defaultShare" } # Migrate each printer foreach ($p in $oldPrinters) { $oldConn = $p.Name $share = $oldConn -replace "^\\\\$OldServer\\", "" $newConn = "\\$NewServer\$share" rundll32 printui.dll,PrintUIEntry /q /dn /n "$oldConn" | Out-Null Add-Printer -ConnectionName "$newConn" | Out-Null } # Restore default printer if it was migrated if ($setDefaultTo) { rundll32 printui.dll,PrintUIEntry /q /y /n "$setDefaultTo" | Out-Null } |