Printer Migration Script
Posted in on Monday, June 25, 2012 by cam
Here is a VB script which is useful for migrating users from one print server to another. This needs to be run on each workstation (I usually call it from a login script). No credit taken for the script and I can’t remember where I got it from (Sorry)
' put in the server names here (keep the quotes!) MovePrinters "OLD-SERVERNAME", "NEW-SERVERNAME" ' ********************************************* ' Move printers to new server ' ********************************************* Sub MovePrinters(OldServer, NewServer) ' Loops through all network printers and moves all printers ' on "OldServer" to the same printername on "NewServer". dim WshNetwork, oPrinters, i, PrinterPath, DefaultPrinter, PrinterList ' Check that WSH version is new enough: If CDbl(Replace(wscript.version,".",",")) < CDbl(5.6) Then MsgBox "Automatic printer migration is not available for" & _ " this computer." & vbCrLf & _ "Please migrate printers manually." & vbCrLf & _ "The new printer server name is """ & NewServer & """", _ vbOKOnly + vbCritical, "Windows Scripting Host is too old" wscript.quit 1 End If Set WshNetwork = WScript.CreateObject("WScript.Network") Set PrinterList = CreateObject("Scripting.Dictionary") ' Get the default printer before we start deleting: DefaultPrinter = GetDefaultPrinter ' Get a list of printers to work with: ' (We cannot modify the collection while looping through it) Set oPrinters = WshNetwork.EnumPrinterConnections For i = 1 to oPrinters.Count Step 2 PrinterList.Add oPrinters.Item(i), "x" Next ' i ' Loop through the printer list and migrate mathching ones: For Each PrinterPath In PrinterList.Keys If StrComp(ServerName(PrinterPath), OldServer, 1) = 0 Then WshNetwork.RemovePrinterConnection PrinterPath, True, True On Error Resume next WshNetwork.AddWindowsPrinterConnection "" & NewServer & "" & _ ShareName(PrinterPath) 'If Err.Number = -2147023095 Then ' MsgBox "The printer """ & ShareName(PrinterPath) & _ ' """ does not exist on server """ & NewServer & """." & vbCrLf & _ ' "The printer has been removed.", vbOKonly + vbExclamation, _ ' "Missing printer" 'End If On Error goto 0 End If Next 'Set the default printer: If ServerName(DefaultPrinter) = OldServer Then On Error Resume Next WshNetwork.SetDefaultPrinter "" & NewServer & "" & _ ShareName(DefaultPrinter) 'If Err.Number = -2147352567 Then 'MsgBox "Your default printer did not exist, and has been deleted.", _ ' vbOKonly + vbInformation, "Invalid default printer" 'End If On Error goto 0 End If End Sub ' MovePrinters Function GetDefaultPrinter() ' Returns the UNC path to the current default printer Dim oShell, sRegVal, sDefault Set oShell = CreateObject("WScript.Shell") sRegVal = _ "HKCUSoftwareMicrosoftWindows NTCurrentVersionWindowsDevice" sDefault = "" On Error Resume Next sDefault = oShell.RegRead(sRegVal) sDefault = Left(sDefault ,InStr(sDefault, ",") - 1) On Error Goto 0 GetDefaultPrinter = sDefault End Function Function ServerName(sPrinterPath) Dim aPrinterPath ServerName = "" If Left(sPrinterPath, 2) = "" Then aPrinterPath = Split(sPrinterPath, "") ServerName = aPrinterPath(2) End If End Function Function ShareName(sPrinterPath) Dim aPrinterPath ShareName = "" If Left(sPrinterPath, 2) = "" Then aPrinterPath = Split(sPrinterPath, "") ShareName = aPrinterPath(3) End If End Function