Migración del servidor de impresión
- El siguiente script permite migrar un servidor de impresión al servidor B con la siguiente:
- Eliminación de las impresoras de la estación de trabajo que están asignadas al servidor anterior solo si están presentes en el nuevo
- Cambiar la impresora predeterminada si es una impresora del servidor anterior.
Para poder seguir la ejecución del script, los seguimientos se escriben en el visor de eventos de Windows.
Requisito previo: las impresoras deben tener el mismo nombre en ambos servidores.
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
Modifique las dos líneas siguientes según su entorno:
PrinterServerOld = "SERVER_A"
PrinterServerNew = "SERVER_B"