IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

VBScript Discussion :

[VBS]Script balayage d'ip et remonter d'information


Sujet :

VBScript

  1. #1
    Membre du Club
    Inscrit en
    Août 2008
    Messages
    8
    Détails du profil
    Informations forums :
    Inscription : Août 2008
    Messages : 8
    Par défaut [VBS]Script balayage d'ip et remonter d'information
    Bonjours,

    Voilà, je vais tenter de vous expliquez clairement mon projet et mon problème:

    Mon script a pour but :
    -De scanner un réseau d'entreprise
    -De vérifier si le processus iexplore.exe est lancé.

    Pour cela je souhaite créer un .bat qui vas lancer un script master, ce script master va exécuter 4 autres script enfant.

    Ces 4 script ont en faite le même rôle...
    Ils ping une plage Ip puis remontent comme informations:
    -si la machine est injouagnable(non connecté/ip inexistente)
    -si la machaine est connecté
    -si sur la machine connecté le processus iexplore.exe est activé

    J'utilise 4 script pour découpé la plage ip qui se compose de cette manière:
    -172.16.3.x (1 à 127; 128 à 254)
    -172.16.9.x (1 à 127; 128 à 254)

    voici le code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    station ="172.16.3."
     
    ON ERROR RESUME NEXT
    for toto = 127 to 254
     
     
    Newstation= station & toto 
    'wscript.echo Newstation
     
    Set objShell = CreateObject("WScript.Shell")
    Set objExec = objShell.Exec("ping -n 1 -w 1000 " & Newstation )
    strPingStdOut = LCase(objExec.StdOut.ReadAll)
     
    If InStr(strPingStdOut, "temps") Then
     
    MachinesActive= MachinesActive +1
    Set objWMIService = GetObject("winmgmts:\\" & Newstation & "\root\cimv2")
    Set colItems = objWMIService.ExecQuery("Select * from Win32_Process")
     
    for each ObjetProcessus in colitems
    'Wscript.echo ObjetProcessus.name 
     
    If Lcase(ObjetProcessus.name)= "iexplore.exe" then
    wscript.echo Newstation & "Processus actif"
     
    Jesuisla=1 
    Cumul = cumul + 1
    end if
     
    next
     
    if Jesuisla=0 then wscript.echo Newstation & "Processus inactif"
    else 
    wscript.echo newstation & "Impossible de joindre l'hote"
     
    end if
    CumulTotal = CumulTotal + 1
    next 
     
    wscript.echo "Machines connecté : " & MachinesActive
    wscript.echo "Machine Non connecté : " & CumulTotal - MachinesActive
    Wscript.echo "Processus Actif : " & cumul

    voilà !

    Donc mon problème réside dans le résultat.
    individuelement le script marche...
    mais dé que je les lance à partir du script master (qui éxécute les 4 script en simultané) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Set WshShell = WScript.CreateObject("WScript.Shell")
    WshShell.Run ("balayage1.vbs" )
    WshShell.Run ("balayage2.vbs" )
    WshShell.Run ("balayage3.vbs" )
    WshShell.Run ("balayage4.vbs" )
    le scan s'exécute mais n'affiche plus de résultat...
    c a d que les 4 fenêtres se ferment une fois que le scan est fini.

    mon but final est de pouvoir obtenir un résultat total...
    c'est à dire d'additionner les résultats entre eux.
    ("Machines connecté" du script1 + celui du script 2,3 et 4 pour avoir un résultat finale... et ceci pareille avec "Machine non connecté" et "processus actif")

    donc comment faire ? j'ai pensé comme solution de mettre le résultat final de chaque script dans un .txt puis faire une opération pour avoir un total.

    est-ce réalisable ? de quel manière dois-je mi prendre ?

    Je suis pas sur de m'ettre bien expliquer je veux résumé :

    un .bat qui lance un script qui va exécuter 4 scripts en simultané qui vont balayé le réseau de l'entreprise pour savoir le nombre de machine connecté au reseau et le nombre de machine utilisant internet.
    L soucis est au niveau de l'affichage du résultat.

    Voilà j'espere avoir été claire !
    je vous remercie d'avance pour votre patiente et vos réponses.

  2. #2
    Expert confirmé
    Avatar de ced600
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Août 2006
    Messages
    3 364
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Août 2006
    Messages : 3 364
    Par défaut
    Tu peux mettre les résultats dans un fichier.txt à l'aide de FileSystemObject.
    Regarde la FAQ VBScript, elle t'explique comment faire.

  3. #3
    Membre du Club
    Inscrit en
    Août 2008
    Messages
    8
    Détails du profil
    Informations forums :
    Inscription : Août 2008
    Messages : 8
    Par défaut
    Ok grâce à ça j'ai pu donc faire un report de chacun de mes scripts dans un .txt :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    Dim FichierLog, f
    Set FichierLog = CreateObject("Scripting.FileSystemObject")
     
    if FichierLog.FileExists ("balayage1.txt") then
       FichierLog.delete ("balayage1.txt")
       f= FichierLog.Createfile ("Balayage1.txt")
    else 
    	f= FichierLog.Createfile ("Balayage1.txt")
    end if 
     
    Const ForWriting = 2
    Set f = FichierLog.OpenTextFile("balayage1.txt", ForWriting,true)   
    f.write(MachinesActive &","& cumul &","& CumulTotal - MachinesActive)
    f.close
    j'ai 3 valeurs qui sont écrite dans chacun des .txt

    maintenant mon problème réside dans la combinaison des 4 .txt.
    car je le rappelle, chaque script me donne comme information le nombre de machines connecté, non connecté, et processus actif (le processus iexplore.exe est lancé)

    donc j'aimerais additionner les 4 .txt pour obtenir une résultat fiinale, cependant les 4 script ne se terminent pas au même moment.

    Donc je dois trouver le moyen de récupérer les 3 valeurs de chacun des .txt pour m'afficher un résultat global.

    De plus je rappelle que je lance mes 4 script en simultanée avec un script master, donc plusieurs soucis se posent pour afficher un résultat global.

    je pensais faire en sorte qu'il va récupérer les valeurs seulement un fois le dernier script achevé, pour m'afficher mon résultat. non ?

    Ou mettre en pause mon script master avant de récupérer les données...
    mais je perd l'avantage de la simultanée et donc un gain de temps.

    Donc voilà, je sais pas comment mi prendre pour obtenir un résultat total.
    si vous pouvez m'aider sur cette dernière remarque je vous en remercierais jamais suffisamment.

    merci d'avance pour vos réponses et votre patiente.

  4. #4
    Expert confirmé
    Avatar de ced600
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Août 2006
    Messages
    3 364
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Août 2006
    Messages : 3 364
    Par défaut
    je pensais faire en sorte qu'il va récupérer les valeurs seulement un fois le dernier script achevé, pour m'afficher mon résultat. non ?

    Ou mettre en pause mon script master avant de récupérer les données...
    mais je perd l'avantage de la simultanée et donc un gain de temps.
    Oui pour les 2 premières phrases, et oui et non pour la dernière.

    En fait pour avoir toutes les infos tu es obligé d'attendre la fin de tes trois scripts.
    Maintenant je suppose que l'intéret de la simultanéité et de pouvoir commencer à traiter le premier résultat obtenu avant de lancer les autres non ?
    Donc en fait, il faut que tes 3 scripts remontent au master l'information qu'ils ont fini, et que le master se mette en "pause" le temps jusqu'à ce qu'il est un fichier à lire.
    Alors il pourrait traiter le premier fichier en attendant la fin des autres, puis il s'occuperait des autres ensuites.

    Mon idée et que chacun de tes trois scripts crée un autre fichier (en plus du resultat) pour annoncer qu'ils ont fini leur travail.
    Le master après avoir lancé les trois scripts boucle avec comme condition de sortie la fin du process en entier (une variable booléene) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    dim finish
    finish = false
    while (Not finish)
    ....
    'une fois les traitement terminé
    finish = true
     
    wend
    Dans la boucle tu vérifie la présence des trois fichiers annonçant la fin d'un script, et à chaque fois que l'un d'entre eux est présent, tu faits ce que tu dois fair avec le fichier resulat.

    N'oublie pas de mettre un Sleep dans le while lorsqu'il n'a rien à faire, un Sleep de 500 millisecondes mettra en pause ton script pendant 500 ms, et surtout l'empêchera de prendre toutes les ressources processeur. Tu peux même juste mettre un pause de 10 ms.

    Voila dis moi ce que tu en penses.

  5. #5
    Membre du Club
    Inscrit en
    Août 2008
    Messages
    8
    Détails du profil
    Informations forums :
    Inscription : Août 2008
    Messages : 8
    Par défaut
    Merci pour ta réponse, ta solution me pense en partie réalisable mais je sais pas si ça correspond exactement à ce que je veux obtenir, je vais essayer dans la journée, je te tiens au courant.

    Merci

  6. #6
    Expert confirmé
    Avatar de ced600
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Août 2006
    Messages
    3 364
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Août 2006
    Messages : 3 364
    Par défaut
    Ma solution te permet de gérer les fichiers resultats dès que le script le générant est terminé.

    Si ton but n'est pas de les traités, mais juste de les fusionner pour par exemples loguer les infos pour faire des stats, alors tu n'as pas d'autre choix que d'attendre la fin de tous les scripts. Tu peux commencer à fusionner des que certain fichier sont près, mais tu seras limité par le script le plus lent.

    Si ton script master doit faire des choses en même temps que les autres scripts fassent la collecte, alors tu n'es pas obligé de faire de pause dans le script.
    Selon ce que doit faire le script tu peux créer des thread, une qui s'occupe d'attendre les fichiers résultats, l'autre qui fait un autre travail.
    Les threads sont comme des sous process d'un process (ton script étant un process).
    Néanmoins la mise en place de Thread n'est pas facile pour débutant, et si ces threads doivent utiliser les mêmes ressources il faudra les gérer de telle manière qu'il ne se bloque, et là cela devient difficille pour tout le monde.
    Si tu penses avoir besoin de te diriger vers ce genre de solution, c'est que ton script resemble plus à une application qu'un script, peut être un service windows. Dans ce cas il faudrait voir à changer de langage pour profiter de l'avatange de certain de ces langages pour ce genre de chose (je pense au .Net pour les services windows).

    Bref tout dépend de ce que tu fais au final avec ton Master. S'il collecte juste les resultats des scripts esclaves, alors un script suffit.

  7. #7
    Membre du Club
    Inscrit en
    Août 2008
    Messages
    8
    Détails du profil
    Informations forums :
    Inscription : Août 2008
    Messages : 8
    Par défaut
    Ok donc je viens de me replongé dans le script, et je t'avourai que j'ai un peu de mal.

    Car, je pense m'ettre mal exprimé ou n'avoir pas donner toute les informations.

    En faite j'utilise la simultané pour avoir un résultat rapide, car je dois scanner plus de 500 IP... pour savoir si iexplore.exe est lancé sur les machines.
    Et enchainer les 500 IP une par une est bien trop long et mon résultat devient par conséquent fossé, vu que le résultat changera avant la fin du scan.

    C'est pour cela que je fais 4 script qui se lancent en simultanée pour avoir un résultat plus réaliste à la fin du script.

    Donc jusqu'a présent j'ai mis le résultat des scripts dans un fichier texte,
    et dedans jai : ( X1,X2,X3) ( X = résultats obtenus)

    Ce que je souhaite réalisé c'est d'additionner les X1 de chaque .txt entre eux, et pareille pour X2 et X3. Comme ça aprés la lancement de mon master j'ai un résultat global.

    Donc avec
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    dim finish
    finish = false
    while (Not finish)
    ....
    'une fois les traitements terminé
    finish = true
     
    wend
    Je peux dir que: TANT QUE le processus n'est pas fini j'attend. Et une fois terminé je fais un traitement des données. c'est bien ça ?

    le problème c'est que je veux traiter les données seulement une fois les 4 script finit, pour obtenir un résultat de toutes mes plages IP.

    Cependant, comme je suis novice et que j'ai quand même réalisé ce bout de code en seulement deux aprés midi je ne maitrise pas le langage =)
    Et pour le traitement de .txt j'ai beau chercher je ne trouve pas!

    Je pense touché le bout là, si j'arrive a traiter les informations récolté aprés le reste sera que du perfectionnement, donc si on pouvais m'aider sur ce dernier point, me donner ou chercher ou simplement comment precédé., ça serait vraiment super.

    Un grand merci d'avance.

  8. #8
    Membre du Club
    Inscrit en
    Août 2008
    Messages
    8
    Détails du profil
    Informations forums :
    Inscription : Août 2008
    Messages : 8
    Par défaut
    J'ai demander conseil à un collègue qui m'a fournit une solution assé astucieuse, je m'explique :

    Il me faudrait en faite separer mes 4.txt de mes 4 .vbs
    Puis verifier le nombre de fichier présent dans mon dossier destiné aux .txt
    Bien sur ils seront sup a chaque début de script.

    Donc cette solution qui me parrait simple et astucieuse me permet de dire dé que j'ai 4 .txt dans un dossier spécifier, je peux faire un traitement de donneés.

    Il me reste plus qu'a trouver comment faire tout cela
    ton aide n'est pas de refus, et si tu as une solution plus propre ou plus rapide ou même plus astucieuse, fais en moi par =) c'est avec plaisir que je me pencherais sur ton code.

    merci encore, j'espère terminer au plus tard demain ce petit script =)

  9. #9
    Expert confirmé
    Avatar de ced600
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Août 2006
    Messages
    3 364
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Août 2006
    Messages : 3 364
    Par défaut
    Il me faudrait en faite separer mes 4.txt de mes 4 .vbs
    Puis verifier le nombre de fichier présent dans mon dossier destiné aux .txt
    Bien sur ils seront sup a chaque début de script.
    Heu ... c'est un peu ce que j'ai dit non ?
    Sauf que moi je ne passe pas la détection de tes 4 fichiers, mais la détection d'autre 4 fichiers qui sont créé pour communiquer.
    En effet, selon si tu crée ton fichier texte au départ et tu fis des ajouts de texte dedans, ou si tu le crée à la fin avec toutes les données que tu as en mémoire, ton fichier sera créé à la fin du script ou au début.
    Utiliser 4 autre fichier pour la signalisation c mieux, cela te posera moins de problème.
    Tu détecte leur création avec la méthode FileExist de l'objet FileSystemObject.

    Tu peux mettre les résultats dans un fichier.txt à l'aide de FileSystemObject.
    Regarde la FAQ VBScript, elle t'explique comment faire.
    Cela ne change pas, et cela donnerais un truc du genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    dim finish
    finish = false;
    Set objFSO = CreateObject("Scripting.FileSystemObject")
    strComputer = "."
    Set objWMIService = GetObject("winmgmts:{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2")
     
    while(!finish)
       If objFSO.FileExists("C:\FSO\ScriptLog1.txt") && objFSO.FileExists("C:\FSO\ScriptLog2.txt") && objFSO.FileExists("C:\FSO\ScriptLog3.txt") && objFSO.FileExists("C:\FSO\ScriptLog4.txt") Then
     
          Set colFiles = objWMIService.ExecQuery("Select * from CIM_DataFile where Path = '\\FSO\\'")
          For Each objFile in colFiles
             'La tu ouvres chaque fichier et tu en récupères le contenu.
             'Avec objFile.name tu as le nom des fichiers.
          Next
          finish = true
       End If
    sleep(100)
    wend
    'Il e te reste plus qu'à écrire le contenu des fichiers dans un 5 eme fichier de fusion
    Voilà je n'ai pas testé mais c'est un point de départ.

  10. #10
    Membre du Club
    Inscrit en
    Août 2008
    Messages
    8
    Détails du profil
    Informations forums :
    Inscription : Août 2008
    Messages : 8
    Par défaut
    Merci de nouveau pour ton aide,

    Mais j'ai encore un soucis et pas des moindes...
    Voilà, Finalement j'ai fais en sorte que les .txt des scripts enfant ne se créer seulement à leur fin.

    Donc ce que j'ai fais dans le script maitre c'est de passer par la détection de ces 4 .txt ... ce qui simplifie le travaille.

    Seulement voilà, mon master détecte les .txt avant que les scripts enfant les supprime... Bref ça je sais comment arranger le problème.

    Cependant une fois ce problème résolu je souhaite procédé ce la manière suivante :

    Si FichierLog1.txt, FichierLog2.txt, FichierLog3.txt, FichierLog4.txt Existent Créer FichierResult.txt !

    Comme cela je peux déterminer la fin des 4 scripts.
    Et je voudrais pouvoir écrire dans ce FichierResult.txt mon résultat ToTal.
    Mais j'ai un souci... je sais comment écrire dans un fichier, mais je sais pas récupérer les données de plusieurs .txt pour en écrire le résultat dans un autre!

    Comme je disait précédemment, Dans chaque fichier Log jai :
    Machine Connecté = X1
    Processus Actif = X2
    Machine Non connecté= X3

    J'aimerais donc faire une simple addition...
    Prendre le nombre de "machine connecté" du premier fichier Log et l'addionné avec le nombre de "machine Connecté" des autres fichiers... Et mettre le résultat total dans FichierResult.txt
    Et faire de même avec "Processus Actif" et "Machine Non connecté".

    Ce qui donne X1+X1+X1+X1= X1Total; X2+X2+X2+X2=X2Total; X3+X3+X3+X3=X3Total (Donc retrouver dans FichierResult.txt : X1Total; X2Total; X3Total)

    est-ce possible ?

    Merci encore deprendre de ton temps pour répondre.

    Cordialement.

  11. #11
    Expert confirmé
    Avatar de ced600
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Août 2006
    Messages
    3 364
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Août 2006
    Messages : 3 364
    Par défaut
    Pour lire un fichier, tu fais comme pour écrire dedans mais en l'ouvrant en lecture, et en utilisant ReadLine.
    Pour cela regarde la FAQ, tu as un exemple de lecture de fichier.

    Lit chaque fichier, et stock dnas une variables les données qui t'intéresses.
    Pour ce faire utilise les fonctions de chaines de caractères VB, comme Split, Left, Right, Mid, Trim, ... Je te laisse te documenter dessus, mais sache que Split découpe une chaine de caractère en fonction d'un séparateur, et que c'est ce que tu va devoir utiliser.

    Donc lorsque tu lis une ligne d'un des fichiers, utilises Split avec comme séparateur le caractère '=', cela te permettra de récupérer deux éléments, par exemple "Machines connectés " et " X1". Attention, les espaces sont conservés. Pour supprimer des espaces avant et après une chaine de caractère, utilise Trim.

    Un fois l'élément récupéré, convertit le en int à l'aide de Cint, puis stock le dans une variable.

    Tu fais ces opérations pour tous les fichiers et chacune des lignes.
    Ensuite tu n'as plus qu'à faire les sommes, et les ecrires dans un nouveau fichier.

  12. #12
    Membre du Club
    Inscrit en
    Août 2008
    Messages
    8
    Détails du profil
    Informations forums :
    Inscription : Août 2008
    Messages : 8
    Par défaut
    je te remercis !
    je pense avoir le temps pour me penché dessus cette aprés midi.

    Encore merci

Discussions similaires

  1. Réponses: 2
    Dernier message: 28/10/2008, 11h25
  2. [VBS]Script balayage d'ip et remonter d'information
    Par jbmamba dans le forum VBScript
    Réponses: 0
    Dernier message: 28/08/2008, 14h26
  3. wsh VBS script de calcul de salaire net
    Par heinquoi dans le forum VBScript
    Réponses: 2
    Dernier message: 14/02/2007, 20h51
  4. Réponses: 2
    Dernier message: 31/05/2006, 09h58
  5. [VBS]Script d'enregistrement d'un document Word
    Par TomZ dans le forum VBScript
    Réponses: 1
    Dernier message: 22/03/2006, 09h06

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo