Print server migration

The following script migrates from print server A to server B with the following actions:

  • Map printers to the new server
  • Removal of the workstation printers that are mapped to the old server only if they are present on the new one
  • Changing the default printer if it is a printer from the old server.

In order to be able to follow the execution of the script, traces are written in the Windows event viewer.

In order to be able to follow the execution of the script, traces are written in the Windows event viewer.

On Error Resume Next

Dim strComputer, oldDefaultPrinter, oldDefaultPrinterSansServer, PrinterServerOld, PrinterServerNew, ProcessDefaultPrinter

strComputer = "."

' Define value old PrinterServer
PrinterServerOld = "SERVER_A"
PrinterServerNew = "SERVER_B"

Set objWMIService = GetObject("winmgmts:" & "{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2")
Set colInstalledPrinters = objWMIService.ExecQuery ("Select * from Win32_Printer")
Set WshNetwork = WScript.CreateObject("WScript.Network")
Set oShell = CreateObject("WScript.Shell")

oShell.LogEvent SUCCESS, "===== START SCRIPT SWITCH PRINTER SERVER ====="

oldDefaultPrinter = DefaultPrinter    ' On recupere l imprimante par default
oShell.LogEvent SUCCESS, "Default printer detected : " & oldDefaultPrinter

oldDefaultPrinterSansServer =  Right(oldDefaultPrinter, len(oldDefaultPrinter) - (len(PrinterServerOld)+3))

' Verification imprimante mappe sur le nouveau serveur
if IsPrinterConnected("\\"& PrinterServerNew &"\" & oldDefaultPrinterSansServer) = 0 then
    oShell.LogEvent SUCCESS, "Default printer not installed on : " & PrinterServerNew
    'Wscript.quit(0)
end if

' Check if need process switch default printer
' Only if default printer is in old server
if InStr(1,oldDefaultPrinter,PrinterServerOld,vbTextCompare) = 0 then
    ProcessDefaultPrinter = "N"
    oShell.LogEvent SUCCESS, "Ignore switch default printer not in old server"
else
    ProcessDefaultPrinter = "Y"
    oShell.LogEvent SUCCESS, "Process switch default printer"
end if

For Each objPrinter in colInstalledPrinters
    oShell.LogEvent SUCCESS, "Printer iteration : "& objPrinter.Name
    if lcase(Left(objPrinter.Name,2)) = "\\" then
        ' Check printer in Each is on old printer server
        if( Left(objPrinter.Name, (len(PrinterServerOld)+2)) = "\\"& PrinterServerOld  OR Left(objPrinter.Name, (len(PrinterServerOld)+2)) = "\\"& Ucase(PrinterServerOld) ) then
            ' Verification imprimante de l ancien serveur est connectee sur le nouveau
            if IsPrinterConnected("\\"& PrinterServerNew &"\" & Right(objPrinter.Name, len(objPrinter.Name) - (len(PrinterServerNew)+3))) = 1 then
                WshNetwork.RemovePrinterConnection objPrinter.Name, true, true
            else
                ' Printer mapping on new server
                WshNetwork.AddWindowsPrinterConnection "\\"&PrinterServerNew &"\"& Right(objPrinter.Name, len(objPrinter.Name) - (len(PrinterServerNew)+3))
                oShell.LogEvent SUCCESS, "Mapping printer : "&  Right(objPrinter.Name, len(objPrinter.Name) - (len(PrinterServerNew)+3)) &" on new server"
                WshNetwork.RemovePrinterConnection objPrinter.Name, true, true
                oShell.LogEvent SUCCESS, "Remove printer on old server"
                WScript.Sleep(60000)
            end if
        end if        
    end if
Next

if ProcessDefaultPrinter = "Y" then
    oShell.LogEvent SUCCESS, "Start pause/sleep script for 3 min"
    WScript.Sleep(180000)
    oShell.LogEvent SUCCESS, "End pause/sleep"
    if IsPrinterConnected("\\"& PrinterServerNew &"\" & Right(oldDefaultPrinter, len(oldDefaultPrinter) - (len(PrinterServerNew)+3))) then
        WshNetwork.SetDefaultPrinter "\\"& PrinterServerNew &"\" & Right(oldDefaultPrinter, len(oldDefaultPrinter) - (len(PrinterServerNew)+3))
        oShell.LogEvent SUCCESS, "Switch default printer on new server"
    end if
end if

oShell.LogEvent SUCCESS, "===== END SCRIPT SWITCH PRINTER SERVER ====="

'##############################################################
'#                        Functions                              # 
'##############################################################

Function DefaultPrinter
    Dim strComputer
    Dim Result
    
    strComputer = "."
    Result = ""
    
    Set objWMIService = GetObject("winmgmts:" _
& "{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2")
    Set colInstalledPrinters = objWMIService.ExecQuery _
     ("Select * from Win32_Printer")
    For Each objPrinter in colInstalledPrinters
        If objPrinter.Default = True Then
         Result = objPrinter.Name
        End If
    Next
    DefaultPrinter = Result
End Function

Function IsPrinterConnected (strPrinter)

    ' declaration des variables
    Dim oWMI, oPrinter
    Dim colPrinters
    Dim strServer, strShare

    ' initialisation des objets
    Set oWMI = GetObject ("winmgmts:\root\cimv2")

    ' decomposition du nom de l'imprimante reseau
    ' en nom de serveur et nom de partage
    strServer = "\\" & Left (strPrinter, InStrRev (strPrinter, "\") - 1)
    strShare = Mid (strPrinter, InStrRev (strPrinter, "\") + 1)

    ' requete WMI pour determiner si l'imprimante specifiee
    ' est connectee dans la session courante
    Set colPrinters = oWMI.ExecQuery ( _
    "SELECT * from Win32_Printer " & _
    "WHERE ServerName='" & strServer & "' " & _
    "AND ShareName='" & strShare & "'")

    ' retour du resultat de la requete
    IsPrinterConnected = colPrinters.Count

End Function

Modify the following two lines according to your environment:

PrinterServerOld = "SERVER_A"
PrinterServerNew = "SERVER_B"
Romain Drouche
Romain Drouche
System Architect | MCSE: Core Infrastructure
IT infrastructure expert with over 15 years of field experience. Currently a Systems and Networks Project Manager and Information Systems Security (ISS) expert, I use my expertise to ensure the reliability and security of technological environments.

Leave a Comment