Voici une de mes réalisations dans le but de reconnecter facilement toutes les imprimantes réseaux sur des postes clients suite à un changement du plan d’adressage.
Le site Activexperts m’a pas mal aidé dans le développement de ce script VBS.
Je tiens à préciser qu’il faut être administrateur sur l’ordinateur pour pouvoir l’exécuter.
Le script a pour but de recréer un port TCP/IP local s’il trouve une concordance avec une imprimante listée dans la collection en début de script. Ainsi par exemple, si un port TCP/IP local utilise l’adresse IP 10.0.1.10, elle deviendra 192.168.1.100. Pour fonctionner, le port doit porter un nom ressemblant à « IP_10.0.1.10 » ou juste « 10.0.1.10 » sous peine de se voir exclu.
La procédure est la suivante et s’effectuera automatiquement pour chaque imprimante trouvée :
- recherche de l’imprimante au moyen de son nom de port actuel,
- création d’un nouveau port TCP/IP local,
- mappage de l’imprimante sur le nouveau port,
- suppression de l’ancien port.
' ' Script VBS permettant la reconnexion des imprimantes réseaux ' d'un ordinateur suite à un changement du plan d'adressage. ' Il faudra exécuter ce script avec une élévation de privilèges ' sous peine de se voir refuser l'accès. ' ' https://blog.lumo.fr/migrer-des-imprimantes-reseau-a-laide-dun-script-vbs.html ' ' Constants strComputer="." Const wbemFlagReturnImmediately = &h10 Const wbemFlagForwardOnly = &h20 ' Variants Dim myPrinters(5,1) ' Filling the collection myPrinters(0,0) = "10.0.1.10" myPrinters(0,1) = "192.168.1.100" myPrinters(1,0) = "10.0.1.11" myPrinters(1,1) = "192.168.1.101" myPrinters(2,0) = "10.0.1.12" myPrinters(2,1) = "192.168.1.102" ' Initiate WMI Set objWMI = GetObject("winmgmts:{impersonationLevel=impersonate}!\\" & strComputer & "\root\CIMV2") ' Get collection of local printers with an IP address in the current range ' PortName can contain the string "IP_" or not Set getPrinters = objWMI.ExecQuery("SELECT * FROM Win32_Printer WHERE Local=True AND (PortName LIKE 'IP_192.33.50.%' OR PortName LIKE '192.33.50.%')", "WQL", wbemFlagReturnImmediately + wbemFlagForwardOnly) ' Iterate through that collection For Each objPrinter In getPrinters ' Display the details for each printer WScript.Echo "Printer Name = " & objPrinter.Name WScript.Echo "Current Port = " & objPrinter.PortName ' Replace the current port name after a search into the collection myPrinters For aPrinter = 0 To 5 ' Deleting the string "IP_" if exists tempPortName = Replace(objPrinter.PortName, "IP_", "") ' Comparaison If (StrComp(tempPortName, myPrinters(aPrinter,0))) = 0 Then Set getPorts = objWMI.ExecQuery("SELECT * FROM Win32_TCPIPPrinterPort WHERE HostAddress='" & myPrinters(aPrinter,1) & "'") If getPorts.Count = 1 Then WScript.Echo "New port already exists" Else ' Creating new port WScript.Echo "Creating new port ..." Set objNewPort = objWMI.Get("Win32_TCPIPPrinterPort").SpawnInstance_ objNewPort.Name = "IP_" & myPrinters(aPrinter,1) objNewPort.Protocol = 1 objNewPort.HostAddress = myPrinters(aPrinter,1) objNewPort.Put_ End If ' Now map the printer to the new port WScript.Echo "Mapping this printer to the new port" & VBCrLf objPrinter.PortName = "IP_" & myPrinters(aPrinter,1) objPrinter.Put_ ' Now, the old port is not in use, we can delete it WScript.Echo "Deleting old port ..." Set getPortsToDelete = objWMI.ExecQuery("SELECT * FROM Win32_TCPIPPrinterPort WHERE HostAddress='" & myPrinters(aPrinter,0) & "'") For Each portToDelete In getPortsToDelete portToDelete.Delete_ Next End If Next Next