Script VBA filtrage par @IP

Signaler
Messages postés
11
Date d'inscription
mercredi 5 mars 2008
Statut
Membre
Dernière intervention
29 août 2011
-
Messages postés
3983
Date d'inscription
jeudi 14 juillet 2005
Statut
Membre
Dernière intervention
30 juin 2013
-
Bonjour à tous,

Je souhaiterais avoir votre aide sur un script VB me permettant de lancer une commande ou un autre script en fonction de l'adresse IP du poste qui exécute ce script VBA.

Pour mieux me comprendre :
Je souhaite qu'un PC lance une commande A ou B en fonction du site ou il est connecté. Pour cela il faut que je récupéré son IP dans une variable et en fonction de cette variable si elle est comprise entre une plage IP type 192.168.1.1 et 192.168.1.254 ça lance une commande A. Si la variable est comprise entre une plage 192.168.2.1 et 192.168.2.254 ça lance une commande B.

Merci à vous pour votre aide.

19 réponses

Messages postés
3983
Date d'inscription
jeudi 14 juillet 2005
Statut
Membre
Dernière intervention
30 juin 2013
13
Ma fonction IP2Long : http://pastebin.com/2TYF85LL
Tu n'as qu'à convertir les bornes (192.168.1.1=a, 192.168.1.254=b, ...) et faire de simples comparaisons "est compris dedans", ça devrait fonctionner.

VB.NET is good ... VB6 is better
Utilise Réponse acceptée quand un post répond à ta question
Messages postés
11
Date d'inscription
mercredi 5 mars 2008
Statut
Membre
Dernière intervention
29 août 2011

Bonjour,

Avant tout merci pour votre réponse.
J'ai regarde votre script mais n'étant pas un AS du VB je n'arrive pas à comprendre s'il faut prendre les 2 ou juste le premier.
Aussi comment faire pour convertir les bornes ?

Merci et désolé mais je ne suis vraiment pas très fort en VB.
Messages postés
3983
Date d'inscription
jeudi 14 juillet 2005
Statut
Membre
Dernière intervention
30 juin 2013
13
C'est la même fonction en haut et en bas. Celle en bas peut être copiée directement (la partie supérieure est colorisée pour faciliter la lecture humaine). Cette fonction permet de convertir des IP en nombres simples. Il te suffit de faire a= IP2Long(" limiteInférieure ") et b =IP2Long("limiteSupérieure") et de comparer l'IP du client (aussi passée à la fonction) à ces deux bornes. Petite aide : a<x<b devient a<x And x<b en VB (ça deviendrait trop compliqué pour l'interpréteur sinon)

VB.NET is good ... VB6 is better
Utilise Réponse acceptée quand un post répond à ta question
Messages postés
11
Date d'inscription
mercredi 5 mars 2008
Statut
Membre
Dernière intervention
29 août 2011

Bonjour,

Super j'ai réussi à créer mon script et ça fonctionne très bien.
Merci encore pour votre aide et votre patience.
Messages postés
11
Date d'inscription
mercredi 5 mars 2008
Statut
Membre
Dernière intervention
29 août 2011

Je suis de retour avec mes questions car là j'ai un nouveau souci.
Voilà ci-dessous le script que j'ai pondu en fin de compte.
Le problème que j'ai c'est sur certaines machines il y à plusieurs cartes réseaux et c'est pas la première qui reçois une adresse IP.
Si j'enventorie les cartes je me restrouve avec 3 :
1. IP 0.0.0.0
2. avec la bonne IP
3. IP 0.0.0.0

Comme mon script ne regarde que la première IP il ne la trouve pas dans le range donc il n'execute pas les opérations demandées.
Comment faire pour choisir la 2nd carte ou cell qui possède une adresse IP non vide ?

Merci.


'-------------------------------------------------------------------------------
' DELETTE ALL THE NETWORK PRINTERS
'-------------------------------------------------------------------------------

Set oNet = CreateObject ("Wscript.Network")
Set oPrt = oNet.EnumPrinterConnections
For i = 0 to oPrt.Count - 1 Step 2
If Left (oPrt.Item(i+1), 1) = "" Then
oNet.RemovePrinterConnection oPrt.Item(i+1)
End If
Next

'-------------------------------------------------------------------------------
' LOCAL NETWORK IP
'-------------------------------------------------------------------------------

strComputer = "."

Set objWMIService = GetObject("winmgmts:" & "!\" & strComputer & "\root\cimv2" )
Set colAdapters objWMIService.ExecQuery("Select * from Win32_NetworkAdapterConfiguration Where IPEnabled True" )
For Each objAdapter in colAdapters

    IPdebut = LBound(objAdapter.IPAddress)
    IPfin = UBound(objAdapter.IPAddress)
    If (objAdapter.IPAddress(IPdebut) <> "" ) then


        For i = IPdebut To IPfin
                strIPAddress = objAdapter.IPAddress(i) & vbCrLf
        Next

    End If
Next

Public Function ip2num(IP) 'ipv4-only
Dim i, a, N
a = Split(ip, ".")
N = CDbl(0)
For i = 0 To UBound(a)
       N = N * 256 + a(i)
Next
ip2num = N

End Function

'-------------------------------------------------------------------------------
' MAP LOCAL NETWORK PRINTERS - L'HORME
'-------------------------------------------------------------------------------

If ip2num(strIPAddress) >= ip2num("192.33.54.1")_
And ip2num(strIPAddress) <= ip2num("192.33.54.254") Then

Set WshNetwork = CreateObject ("WScript.Network")
on error resume next
PrinterPath = "\\eufrlhoimp01\impfrlho025"
WshNetwork.RemovePrinterConnection PrinterPath, true, true
WshNetwork.AddwindowsPrinterConnection (PrinterPath)
PrinterPath = "\\eufrlhoimp01\impfrlho059"
WshNetwork.RemovePrinterConnection PrinterPath, true, true
WshNetwork.AddwindowsPrinterConnection (PrinterPath)

'Else
' other fonction
End If
Messages postés
3983
Date d'inscription
jeudi 14 juillet 2005
Statut
Membre
Dernière intervention
30 juin 2013
13
bonneCarte=-1
For i = 0 to nbCartes-1
 Si ipValide Alors
  bonneCarte=i
  Fin FOR
 Fin si
Next i
Si bonneCarte=-1 Then End 'pas trouvée, on quitte
IP = cartes(bonneCarte).ip


VB.NET is good ... VB6 is better
Utilise Réponse acceptée quand un post répond à ta question
Messages postés
11
Date d'inscription
mercredi 5 mars 2008
Statut
Membre
Dernière intervention
29 août 2011

Bonjour,

J'ai copié le script tel que et il ne fonctionne pas.
Messages postés
3983
Date d'inscription
jeudi 14 juillet 2005
Statut
Membre
Dernière intervention
30 juin 2013
13
C'est un pseudo-algorithme, faut le traduire avant de l'exécuter. Pas obligé de mettre un index dans bonneCarte (à renommer en bonneIP), tu peux mettre directement l'adresse IP. En fin de boucle, si Len(bonneIP)=0 alors pas d'IP trouvée sinon on continue (condition à faire dans l'autre sens, càd on quitte si pas d'IP trouvée. Il sufit de comprendre les 9 lignes qui concernent la récup de l'IP que tu as déjà ... IPdebut est toujours nul, donc dans la boucle, remplace-la par 0. Petite aide : tu auras beaucoup de mal à le faire inline, fais une fonction getFirstIP qui te renvoie rien si pas trouvée ou l'adresse.

VB.NET is good ... VB6 is better
Utilise Réponse acceptée quand un post répond à ta question
Messages postés
11
Date d'inscription
mercredi 5 mars 2008
Statut
Membre
Dernière intervention
29 août 2011

je t'avoue que j'ai du mal ... pas évident pour un novice
Messages postés
3983
Date d'inscription
jeudi 14 juillet 2005
Statut
Membre
Dernière intervention
30 juin 2013
13
La difficulté est peut-être la boucle imbriquée ...
Public Function getFirstIP() 'As String
 Dim adapters, adap, i
 adapters = XXXXXXXX
 For Each adap In adapters
  For i = 0 To UBound(adap.IPAddress)
   ''SI IP NON VIDE ALORS RETOURNE CETTE IP
  Next 'i
 Next 'adap
End Function


VB.NET is good ... VB6 is better
Utilise Réponse acceptée quand un post répond à ta question
Messages postés
11
Date d'inscription
mercredi 5 mars 2008
Statut
Membre
Dernière intervention
29 août 2011

Bon merci beaucoup pour le temps que tu y à consacré c'est vraiment très sympa.
Ca me dépasse complétement. Je vais abandonner là car j'ai passé une semaine.

Merci encore.
Messages postés
3983
Date d'inscription
jeudi 14 juillet 2005
Statut
Membre
Dernière intervention
30 juin 2013
13
'Code non testé, devrait aller ...
Public Function ip2long() 'coller le contenu véritable de ma fonction à partir du lien fourni

'Les lignes ajoutées se terminent par un +.
'Comme tu peux le voir y'en a pas des masses
Public Function getFirstIP() 'As String
'Remballe la première IP trouvée sur toutes les interfaces réseau de la machine locale
'Si aucune IP n'est trouvée, renvoie une chaine vide.
 Dim adapters, adap, i, wmi
 Set wmi = GetObject("winmgmts:!\\.\root\cimv2") '+
 Set adapters wmi.ExecQuery("Select * from Win32_NetworkAdapterConfiguration Where IPEnabled True") '+
 For Each adap In adapters
  For i = 0 to UBound(adap.IPAddress)
   If Len(adap.IPAddress(i)) Then
    getFirstIP = adap.IPAddress(i) '+
    Exit Function 'on quitte '+
   End If
  Next 'i
 Next 'adap
End Function

monIP = ip2long(getFirstIP())
If monIP = 0 Then
 MsgBox "Pas d'IP trouvée"
 End 'pas besoin d'aller plus loin
End If
'comparer et installer les imprimantes


VB.NET is good ... VB6 is better
Utilise Réponse acceptée quand un post répond à ta question
Messages postés
11
Date d'inscription
mercredi 5 mars 2008
Statut
Membre
Dernière intervention
29 août 2011

Le retour est identique à celui que j'avais avec le précédent script.
Malgré que sur les 3 cartes actives :
1 - VPN
2 - LAN
3 - WIFI

j'ai une adresse IP présente sur le LAN, le retour du script est "pas d'IP trouvée" certainement parce qu'il ne regarde que la première connexion active (VPN) qui elle n'as pas d'IP.
Messages postés
11
Date d'inscription
mercredi 5 mars 2008
Statut
Membre
Dernière intervention
29 août 2011

J'ai fait un test sur un post sur lequel j'ai désactivé toutes les cartes sauf le LAN.
L'adresse IP du poste est : 192.33.54.34
Le retour de la variable monIP est : 3223402018

Etant donné que ca ne retourne pas l'adresse IP du poste mais une valeur comment faire le filtre entre telle et telle IP on lance la commande ?
Messages postés
3983
Date d'inscription
jeudi 14 juillet 2005
Statut
Membre
Dernière intervention
30 juin 2013
13
Sur la machine où le script ne parvient pas à trouver l'IP, affiche getFirstIP() ...
Si ip2long(min qui se termine par ".0")<monIP ET monIP<ip2long(max qui se termine par ".255") ALORS faitL'install

VB.NET is good ... VB6 is better
Utilise Réponse acceptée quand un post répond à ta question
Messages postés
11
Date d'inscription
mercredi 5 mars 2008
Statut
Membre
Dernière intervention
29 août 2011

getFirstIP() = 0.0.0.0
Messages postés
3983
Date d'inscription
jeudi 14 juillet 2005
Statut
Membre
Dernière intervention
30 juin 2013
13
Peut-être vérifier aussi que l'IP est différente de "0.0.0.0" dans getFirstIP() ...

VB.NET is good ... VB6 is better
Utilise Réponse acceptée quand un post répond à ta question
Messages postés
11
Date d'inscription
mercredi 5 mars 2008
Statut
Membre
Dernière intervention
29 août 2011

En effet on peut filtrer sur une IP 0.0.0.0 mais comment lui demander d'aller chercher l'IP de la 2nde connexion si c'est = à 0.0.0.0

Mois ce que j'ai besoin c'est de retrouver une IP valide sur uen des 3 connexions existantes.
Messages postés
3983
Date d'inscription
jeudi 14 juillet 2005
Statut
Membre
Dernière intervention
30 juin 2013
13
Faudrait peut-être comprendre le code que l'on exécute
Il suffit de changer ceci :
If Len(adap.IPAddress(i)) And adap.IPAddress(i)<>"0.0.0.0" Then


VB.NET is good ... VB6 is better
Utilise Réponse acceptée quand un post répond à ta question