Printer migration script I wrote to move users print queues from one server to another (remembers default printer), mainly for my own reference. Remember to update the log location, and old/new print server variables.
'Migrates users print queues from one server to another, defined by NewPrintServer and OldPrintServer
'Retains Default queue
'Logs results to \\AUZMRMSRV200\Logs\printers\
On Error Resume Next
Const ForWriting = 2
Const ForReading = 1
Dim Result
Dim LogonServer
Dim UserName
Dim strComputer
Dim objLog
Dim ObjPrinter
Dim NewPrintServer, OldPrintServer
Dim strPrinterName
Dim strPrinterServer
Dim objWMIService
Dim strDefault
Dim PrinterArray
Dim ObjNetwork, ObjShell, ObjFSO
Initialize()
RemapPrinters()
Finish()
Function Initialize()
Set objNetwork = CreateObject ("Wscript.Network")
Set objShell = CreateObject ("WScript.Shell")
Set objFSO = CreateObject ("Scripting.FileSystemObject")
OldPrintServer = "AUZMRMSRV302"
NewPrintServer = "AUZMRMSRV200"
strComputer = "."
LogonServer = objShell.ExpandEnvironmentStrings("%logonserver%")
UserName = objShell.ExpandEnvironmentStrings("%username%")
Set objLog = objFSO.CreateTextFile ("\\AUZMRMSRV200\Logs\printers\" & UserName & ".log")
End Function
Function RemapPrinters()
'Clear error variable
Err.Clear
'Connect to WMI service on local machine
Set objWMIService = GetObject("winmgmts:" & _
"{impersonationLevel=Impersonate}!\\" & strComputer & "\root\cimv2")
'Report any errors connecting to WMI
If Err.Number Then
objLog.Write Date() & " " & Time() & ": " & "Error accessing WMI on " & strComputer & ", Error #" & Err.Number & ": " & Err.Description & ")"
& VbCrLf
Err.Clear
Else
'Find default printer
strDefault = GetDefaultPrinter
objLog.Write Date() & " " & Time() & ": " & "Migrating users printers from " & OldPrintServer & " to " & NewPrintServer & VbCrLf
objLog.Write Date() & " " & Time() & ": " & "Default Printer: " & strDefault & VbCrLf & VbCrLf
'Enumerate all installed printers
Set colInstalledPrinters = objWMIService.ExecQuery _
("SELECT * FROM Win32_Printer")
'Loop through each installed printer, where printer is a confirmed network printer on OldPrintServer
For Each objPrinter in colInstalledPrinters
if Left(objPrinter.Name,len(OldPrintServer)+2) = "\\" & OldPrintServer then
objLog.Write Date() & " " & Time() & ": " & "Migrating " & objPrinter.Name & VbCrLf
PrinterArray = Split (objPrinter.Name , "\") ' "","",Servername,Printername
strPrinterName = PrinterArray(3)
strPrinterServer = PrinterArray(2)
'Confirm servername value is populated and is not using the new print server already
If (LCase(objPrinter.ServerName) <> "") and (LCase(objPrinter.ServerName) <> "\\" & NewPrintServer) then
'Is this printer the default?
blDefault = false
if strDefault = "\\" & OldPrintServer & "\" & strPrinterName then
blDefault = true
end if
'Add print queue from new server, make default if need be
If AddPrinter("\\" & NewPrintServer & "\" & strPrinterName, blDefault) = True Then
'Report Successful install
objLog.Write Date() & " " & Time() & ": " & "Migrated \\" & OldPrintServer & "\" & strPrinterName & " to " &
"\\" & NewPrintServer & "\" & strPrinterName & VbCrLf
'Remove old printer queue, assuming Addprinter worked - prevents printers from being lost altogether
RemovePrinter(objPrinter.Name)
End if
Else
objLog.Write Date() & " " & Time() & ": " & "No change needed, already on new server" & VbCrLf
End If
objLog.Write Date() & " " & Time() & ": " & (VbCrLf)
End If
Next
End If
End Function
Function AddPrinter(strPrintQueue, blDefault)
AddPrinter = False
'Attempt to add printer, using new server
objNetwork.AddWindowsPrinterConnection strPrintQueue
If Err.Number Then
objLog.Write Date() & " " & Time() & ": " & "The printer " & strPrintQueue & " cannot be mapped" & VbCrLf
objLog.Write Date() & " " & Time() & ": " & "Error code : " & Err.Number & ": " & Err.Description & VbCrLf
Err.Clear
else
AddPrinter = True
End If
'Set printer as default if necessary
If blDefault then
objLog.Write Date() & " " & Time() & ": " & "Changing default printer -> " & strPrintQueue & VbCrLf
objNetwork.SetDefaultPrinter strPrintQueue
If Err.Number Then
objLog.Write Date() & " " & Time() & ": " & "Could not set as default" & VbCrLf
objLog.Write Date() & " " & Time() & ": " & "Error code : " & Err.Number & ": " & Err.Description & VbCrLf
Err.Clear
End If
End If
End Function
Function RemovePrinter(strPrintQueue)
'Attempt to remove printer
objNetwork.RemovePrinterConnection strPrintQueue
If Err.Number Then
objLog.Write Date() & " " & Time() & ": " & "The printer " & strPrintQueue & " cannot be removed" & VbCrLf
objLog.Write Date() & " " & Time() & ": " & "Error code : " & Err.Number & ": " & Err.Description & VbCrLf
Err.Clear
Else
objLog.Write Date() & " " & Time() & ": " & "The printer " & strPrintQueue & " was successfully removed" & VbCrLf
End if
End Function
Function GetDefaultPrinter()
sRegVal = "HKCU\Software\Microsoft\Windows NT\CurrentVersion\Windows\Device"
sDefault = ""
sDefault = objShell.RegRead(sRegVal)
sDefault = Left(sDefault ,InStr(sDefault, ",") - 1)
GetDefaultPrinter = sDefault
End Function
Function Finish()
objLog.Close
Wscript.quit
End Function
migration, printers, vbscript