Un script pour changer automatiquement les adresses IP des imprimantes configurées sur Windows

par Julien Delmas

Lors d’un changement de plan d’adressage, il est nécessaire de modifier les adresses IP des imprimantes configurées sur chaque ordinateurs. Cela implique un travail long et fastidieux puisqu’il nécessite d’intervenir sur chaque les ordinateurs pour réaliser des manipulations.

Vous trouverez ci-dessous un script permettant de changer les ports TCP/IP sur lesquels sont connectées les imprimantes. Il est très largement inspiré de celui proposé par lumo.fr.

Script de changement d’adresse IP des imprimantes sur un ordinateur Windows

Comment le mettre en oeuvre ?

  1. changer les adresses IP des imprimantes sur leur interface web ou sur leur écran de contrôle ;
  2. télécharger, décompresser le fichier ci-dessus ;
  3. éditer le fichier avec un éditeur de texte :
    1. modifier les adresses IP des imprimantes avec les vôtres (première ligne = ancienne adresse IP) ;
    2. Attention, si vous supprimez une imprimante de la liste, il faut modifier la ligne
      « Dim myPrinters(xx,1) » en remplaçant le « xx » par le nombre d’imprimantes restantes
  4. Par défaut, le script affiche un message à chaque étape. Pour un fonctionnement silencieux, vous devez commenter toutes les lignes débutant par « WScript.Echo », sinon le script attendra une validation de l’utilisateur pour exécuter les actions.
  5. exécuter ce fichier avec un compte administrateur :
    1. soit en le plaçant tout simplement sur le bureau du compte administrateur et en cliquant dessus ;
    2. soit en le plaçant dans le dossier « Démarrage » du menu Démarrer de l’administrateur pour automatiser son lancement lors de la connexion du compte administrateur ;
    3. soit en utilisant un script pour automatiser son lancement. Dans ce cas, vous devez commenter toutes les lignes débutant par « WScript.Echo », sinon le script attendra de l’utilisateur un clic pour fermer la fenêtre de notification.

Le script

' 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(15,1)

' Compléter la liste des imprimantes ci-dessous
' Sur la première ligne, indiquer l adresse IP ACTUELLE
' Sur la deuxième ligne, indiquer la NOUVELLE adresse IP
' Si vous modifiez le nombre d imprimantes ci-dessous,
' pensez à modifier ci-dessus la ligne Dim myPrinters(xx,1)
' en remplaçant xx par le nombre d'imprimantes

'##########################################
' Salle 006 - USB
myPrinters(0,0) = "172.20.6.201"
myPrinters(0,1) = "172.20.150.6"

' Salle 006 bis
myPrinters(1,0) = "172.20.6.202"
myPrinters(1,1) = "172.20.150.56"

' Salle 007
myPrinters(2,0) = "172.20.0.0"
myPrinters(2,1) = "172.20.0.0"

' Salle 008
myPrinters(3,0) = "172.20.0.0"
myPrinters(3,1) = "172.20.0.0"

' Salle 102
myPrinters(4,0) = "172.20.0.0"
myPrinters(4,1) = "172.20.0.0"

' Salle 104
myPrinters(5,0) = "172.20.0.0"
myPrinters(5,1) = "172.20.0.0"

' Salle 106
myPrinters(6,0) = "172.20.0.0"
myPrinters(6,1) = "172.20.0.0"

' Salle 106bis
myPrinters(7,0) = "172.20.0.0"
myPrinters(7,1) = "172.20.0.0"

' Salle 107
myPrinters(8,0) = "172.20.0.0"
myPrinters(8,1) = "172.20.0.0"

' Salle 201
myPrinters(9,0) = "172.20.0.0"
myPrinters(9,1) = "172.20.0.0"

' Salle 204bis
myPrinters(10,0) = "172.20.0.0"
myPrinters(10,1) = "172.20.0.0"

' Salle 205
myPrinters(11,0) = "172.20.0.0"
myPrinters(11,1) = "172.20.0.0"

' Salle 206 - Pas d'imprimante
myPrinters(12,0) = "172.20.0.0"
myPrinters(12,1) = "172.20.0.0"

' Salle 207
myPrinters(13,0) = "172.20.0.0"
myPrinters(13,1) = "172.20.0.0"

' Salle XXX
myPrinters(14,0) = "172.20.0.0"
myPrinters(14,1) = "172.20.0.0"
'##########################################


' 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_172.20.%' OR PortName LIKE '172.20.%')", "WQL", wbemFlagReturnImmediately + wbemFlagForwardOnly)

' Iterate through that collection
For Each objPrinter In getPrinters
' Display the details for each printer
WScript.Echo "A l'adresse " & objPrinter.PortName & ", je trouve l'imprimante : " & objPrinter.Name
' 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 "Le nouveau port existe deja"
Else
' Creating new port
WScript.Echo "Je cree le nouveau port : " & myPrinters(aPrinter,1)
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 "Je connecte l'imprimante au nouveau port : " & myPrinters(aPrinter,1)
objPrinter.PortName = "IP_" & myPrinters(aPrinter,1)
objPrinter.Put_
' Now, the old port is not in use, we can delete it
WScript.Echo "Je supprime l'ancien port : " & myPrinters(aPrinter,0)
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