Le script ci-après permet d’effectuer la migration d’un serveur d’impression A à un serveur B avec les actions suivantes :
- Mappage des imprimantes sur le nouveau serveur
- Suppression des imprimantes du poste qui sont mappées sur l’ancien serveur seulement si elles sont présente sur le nouveau
- Modification de l’imprimante par défaut si celle-ci est une imprimante de l’ancien serveur.
Afin de pouvoir suivre l’exécution du script, des traces sont écrites dans l’observateur d’événement Windows.
Prérequis : les imprimantes doivent avoir le même nom sur les deux serveurs.
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 FunctionModifier les deux lignes suivantes en fonction de votre environnement :
PrinterServerOld = "SERVER_A"
PrinterServerNew = "SERVER_B"