Migrate shared printers connection from one server to another
Sysadmin
on
Please note that I didn’t use this script since the PrintNightmare saga started.
A long time ago, I found this VBS script on Microsoft Script Gallery. Unfortunately, this script is now nowhere to be found, thus, I decided to share it with you.
This script, once executed on a workstation, allow migrating all connected printers (\\printserver\sharedprinter) to a new server. While this script is probably not as fancy as some Powershell scripts, this one has never let me down and works every single time.
This script is easy to use, just update line 2 and execute it on the workstation with the remote management tool of your choice or through GPO.
' put in the server names here (keep the quotes!)
MovePrinters "Old Server", "New Server"
' *********************************************
' 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
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 = 0 Then
Set objFile = wscript.CreateObject("Scripting.FileSystemObject")
If Not objFile.FolderExists("c:\printers_remapped") Then
objFile.CreateFolder "c:\printers_remapped"
objFile.Close
End If
End If
'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 = _
"HKCU\Software\Microsoft\Windows NT\CurrentVersion\Windows\Device"
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
'discardScript()
Function discardScript()
Set objFSO = CreateObject("Scripting.FileSystemObject")
strScript = Wscript.ScriptFullName
objFSO.DeleteFile(strScript)
End Function
'--------------------8<----------------------