Script VBA filtrage par @IP

lyon0691 Messages postés 11 Date d'inscription mercredi 5 mars 2008 Statut Membre Dernière intervention 29 août 2011 - 18 août 2011 à 16:19
cs_ghuysmans99 Messages postés 3982 Date d'inscription jeudi 14 juillet 2005 Statut Membre Dernière intervention 30 juin 2013 - 31 août 2011 à 00:09
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

cs_ghuysmans99 Messages postés 3982 Date d'inscription jeudi 14 juillet 2005 Statut Membre Dernière intervention 30 juin 2013 16
18 août 2011 à 22:34
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
0
lyon0691 Messages postés 11 Date d'inscription mercredi 5 mars 2008 Statut Membre Dernière intervention 29 août 2011
22 août 2011 à 13:12
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.
0
cs_ghuysmans99 Messages postés 3982 Date d'inscription jeudi 14 juillet 2005 Statut Membre Dernière intervention 30 juin 2013 16
22 août 2011 à 17:00
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
0
lyon0691 Messages postés 11 Date d'inscription mercredi 5 mars 2008 Statut Membre Dernière intervention 29 août 2011
23 août 2011 à 15:00
Bonjour,

Super j'ai réussi à créer mon script et ça fonctionne très bien.
Merci encore pour votre aide et votre patience.
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
lyon0691 Messages postés 11 Date d'inscription mercredi 5 mars 2008 Statut Membre Dernière intervention 29 août 2011
23 août 2011 à 16:36
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
0
cs_ghuysmans99 Messages postés 3982 Date d'inscription jeudi 14 juillet 2005 Statut Membre Dernière intervention 30 juin 2013 16
23 août 2011 à 19:44
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
0
lyon0691 Messages postés 11 Date d'inscription mercredi 5 mars 2008 Statut Membre Dernière intervention 29 août 2011
24 août 2011 à 09:13
Bonjour,

J'ai copié le script tel que et il ne fonctionne pas.
0
cs_ghuysmans99 Messages postés 3982 Date d'inscription jeudi 14 juillet 2005 Statut Membre Dernière intervention 30 juin 2013 16
24 août 2011 à 11:48
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
0
lyon0691 Messages postés 11 Date d'inscription mercredi 5 mars 2008 Statut Membre Dernière intervention 29 août 2011
25 août 2011 à 11:48
je t'avoue que j'ai du mal ... pas évident pour un novice
0
cs_ghuysmans99 Messages postés 3982 Date d'inscription jeudi 14 juillet 2005 Statut Membre Dernière intervention 30 juin 2013 16
25 août 2011 à 12:11
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
0
lyon0691 Messages postés 11 Date d'inscription mercredi 5 mars 2008 Statut Membre Dernière intervention 29 août 2011
25 août 2011 à 14:47
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.
0
cs_ghuysmans99 Messages postés 3982 Date d'inscription jeudi 14 juillet 2005 Statut Membre Dernière intervention 30 juin 2013 16
25 août 2011 à 16:44
'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
0
lyon0691 Messages postés 11 Date d'inscription mercredi 5 mars 2008 Statut Membre Dernière intervention 29 août 2011
26 août 2011 à 09:12
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.
0
lyon0691 Messages postés 11 Date d'inscription mercredi 5 mars 2008 Statut Membre Dernière intervention 29 août 2011
26 août 2011 à 09:32
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 ?
0
cs_ghuysmans99 Messages postés 3982 Date d'inscription jeudi 14 juillet 2005 Statut Membre Dernière intervention 30 juin 2013 16
26 août 2011 à 13:04
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
0
lyon0691 Messages postés 11 Date d'inscription mercredi 5 mars 2008 Statut Membre Dernière intervention 29 août 2011
26 août 2011 à 13:34
getFirstIP() = 0.0.0.0
0
cs_ghuysmans99 Messages postés 3982 Date d'inscription jeudi 14 juillet 2005 Statut Membre Dernière intervention 30 juin 2013 16
26 août 2011 à 13:55
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
0
lyon0691 Messages postés 11 Date d'inscription mercredi 5 mars 2008 Statut Membre Dernière intervention 29 août 2011
29 août 2011 à 10:43
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.
0
cs_ghuysmans99 Messages postés 3982 Date d'inscription jeudi 14 juillet 2005 Statut Membre Dernière intervention 30 juin 2013 16
31 août 2011 à 00:09
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
0
Rejoignez-nous