[Résolu] Récupérer l'états des différentes liaison

Forum traitant des automates industriels de marque Siemens.
Avatar du membre
djé
Dieu du process
Dieu du process
Messages : 864
Enregistré le : 20 oct. 2015, 09:55
Localisation : Bretagne, Pays de la Loire, Nantes
Contact :

Re: Récupérer l'états des différentes liaison

Message par djé »

Priigame a écrit : 09 nov. 2017, 08:53 En bidouillant un petit peu depuis hier j'ai quelque chose de pas mal pour ping, cependant je n'arrive pas à récupérer la réponse PINGFlag.
Je voulais faire une condition IF afin de set ou reset un bit local mais je ne sais pas quoi mettre en condition, c'est pourquoi je voulais récupérer le résultat PINGFlag dans un bloc note afin d'étudier le résultat émis.

Code : Tout sélectionner

Dim WshShell, PINGFlag, My, Activate, test, i

Set WshShell = CreateObject("WScript.Shell")

Set PINGFlag = WshShell.Run("ping 192.168.90.57")

End Sub
Si quelqu'un as une solution compatible TIA :/
Sinon pour répondre à ta question le code serai plutôt celui-là:

Code : Tout sélectionner

set WshShell = CreateObject("WScript.Shell") 

PINGFlag = Not CBool(WshShell.run("ping -n 1 192.168.0.250",0,True))

If PINGFlag = True Then
    'traitement quand ping ok
Else
   'traitement quand ping nok
End If
Le monde se divise en 10 catégories:les personnes qui comprennent le binaire,et les autres.

Dans tout ce que vous apprenez, seuls 10% vont vous servir,mais vous ne savez pas lesquels ...
Avatar du membre
Priigame
Générateur de blocs fonctions
Générateur de blocs fonctions
Messages : 121
Enregistré le : 08 nov. 2017, 09:28

Re: Récupérer l'états des différentes liaison

Message par Priigame »

Nickel ça marche ! J'aurais pas sortie de script aussi complexe :x

Je vais juste l'adapter pour qu'il scan l'ensemble des stations.

PS: j'ai utiliser ton premier script, je comprend pas tout comparé au second mais tout est bon :)
Avatar du membre
Priigame
Générateur de blocs fonctions
Générateur de blocs fonctions
Messages : 121
Enregistré le : 08 nov. 2017, 09:28

Re: Récupérer l'états des différentes liaison

Message par Priigame »

Pour enchainer plusieurs requête à la suite avec une ip différentes, cela peut marcher si je présente ça ainsi ?

Code : Tout sélectionner

Sub FonctionVB_1(ByVal IP)
' déclaration variables
    Dim DefReqWmi, ReqWmi, objPingResult

    ' définition de la requete  WMI 
    '@_Liaison_1 = paramètre transmis à la routine (SUB) (ex 192.168.90.57)
    DefReqWmi = "SELECT * FROM Win32_PingStatus WHERE Address = '" & "@_Liaison_1" & "'" 

    ' lancement de la requete  WMI
    Set ReqWmi = GetObject("winmgmts://./root/cimv2").ExecQuery( DefReqWmi )

    ' Analyse de la reponse requete WMI
    For Each objPingResult In ReqWmi
		
        If Not IsObject( objPingResult ) Then
            Variable_1 = False	'Variable si résultat = False
            
        ElseIf objPingResult.StatusCode = 0 Then
            Variable_1 = True  'Variable si résultat = True
            
		End If
    Next
    
        ' définition de la requete  WMI 
    '@_Liaison_1 = paramètre transmis à la routine (SUB) (ex 192.168.90.57)
    DefReqWmi = "SELECT * FROM Win32_PingStatus WHERE Address = '" & "@_Liaison_2" & "'" 

    ' lancement de la requete  WMI
    Set ReqWmi = GetObject("winmgmts://./root/cimv2").ExecQuery( DefReqWmi )

    ' Analyse de la reponse requete WMI
    For Each objPingResult In ReqWmi
		
        If Not IsObject( objPingResult ) Then
            Variable_1 = False	'Variable si résultat = False
            
        ElseIf objPingResult.StatusCode = 0 Then
            Variable_1 = True  'Variable si résultat = True
            
		End If
    Next

    Set ReqWmi = Nothing
End Sub
Modifié en dernier par Priigame le 09 nov. 2017, 11:09, modifié 1 fois.
Avatar du membre
djé
Dieu du process
Dieu du process
Messages : 864
Enregistré le : 20 oct. 2015, 09:55
Localisation : Bretagne, Pays de la Loire, Nantes
Contact :

Re: Récupérer l'états des différentes liaison

Message par djé »

Priigame a écrit : 09 nov. 2017, 10:53 PS: j'ai utiliser ton premier script, je comprend pas tout comparé au second mais tout est bon :)
le premier utilise l'API windows WMI (Windows Management Instrumentation) qui permet d'avoir une représentation/management intégral d'un système windows (périphériques, réseau, active directory, registres...) le tout par "simple" script VBS par exemple. C'est assez puissant.

Le second lance en fait un commande (dos) ping via la fentêtre "cmd" tout simplement. (tu ne vois pas la fenêtre à cause du deuxième argument "0" de la commande run. (WshShell.run("ping -n 1 192.168.0.250",0,True). Si tu met 1 à la place tu verras la fenêtre apparaitre.
On interprête alors le résultat "errorlevel" renvoyé par la fonction ping pour savoir si le ping a aboutit ou non. A savoir (je ne saurais dire pourquoi) que l'interprétation de la valeur "errrolevel=0" n'est pas systématiquement significative d'un ping correct.

si ton environnement n'est pas évolutif (nombre d'adresse IP à peu près constant) tu peux très bien faire un boucle sur un array (tableux de valeur Ip) :

Dim myListIP

myListIP = array ("192.168.0.25","192.168.0.26","192.168.0.27","192.168.0.28","192.168.0.29")

For each ipAd in myListIP
le script avec ipAd en paramètre
next

en gros..
Le monde se divise en 10 catégories:les personnes qui comprennent le binaire,et les autres.

Dans tout ce que vous apprenez, seuls 10% vont vous servir,mais vous ne savez pas lesquels ...
Avatar du membre
Priigame
Générateur de blocs fonctions
Générateur de blocs fonctions
Messages : 121
Enregistré le : 08 nov. 2017, 09:28

Re: Récupérer l'états des différentes liaison

Message par Priigame »

Merci des détails, c'est déja plus clair ^^

Je vais garder ce petit script de coté, ça peut toujours servir encore merci
Avatar du membre
djé
Dieu du process
Dieu du process
Messages : 864
Enregistré le : 20 oct. 2015, 09:55
Localisation : Bretagne, Pays de la Loire, Nantes
Contact :

Re: Récupérer l'états des différentes liaison

Message par djé »

A savoir (je ne saurais dire pourquoi) que l'interprétation de la valeur "errrolevel=0" n'est pas systématiquement significative d'un ping correct.
Je suis sur mon réseau domestique (en 192.168.0.50 (ip PC), 255.255.255.0 (mask), 192.168.0.254 (gtw))
  • Ici je ping mon téléphone portable:
C:\WINDOWS\system32>ping 192.168.0.13
Envoi d’une requête 'Ping' 192.168.0.13 avec 32 octets de données :
Réponse de 192.168.0.13 : octets=32 temps=183 ms TTL=64
Résultat:
C:\WIND0OWS\system32>echo %errorlevel%
0

  • Ici je ping une adresse bidon hors de mon réseau:
C:\WINDOWS\system32>ping 172.15.42.84
Envoi d’une requête 'Ping' 172.15.42.84 avec 32 octets de données :
Délai d’attente de la demande dépassé.
Résultat:
C:\WINDOWS\system32>echo %errorlevel%
1

  • Ici je ping une adresse bidon sur mon réseau:
C:\WINDOWS\system32>ping 192.168.0.140
Envoi d’une requête 'Ping' 192.168.0.140 avec 32 octets de données :
Réponse de 192.168.0.50 : Impossible de joindre l’hôte de destination.<< ici c'est l'adresse IP de mon ordi qui répond
Résultat:
C:\WINDOWS\system32>echo %errorlevel%
0

  • Ici je ping une adresse bidon en dehors de mon réseau mais sur une adresse 192.168.x.x:
C:\WINDOWS\system32>ping 192.168.255.50
Envoi d’une requête 'Ping' 192.168.255.50 avec 32 octets de données :
Réponse de 192.168.0.254 : Impossible de joindre l’hôte de destination.<< ici c'est l'adresse IP de ma box qui répond
Résultat:
C:\WINDOWS\system32>echo %errorlevel%
0

EN conclusion on voit que la commande Ping se termine avec le statut d'execution ErrorLevel=0 si elle reçoit une réponse, même infructueuse.
Pour assurer le truc il faudrait scruter la réponse complète à la recherche de "TTL" pour être sûr.
Le monde se divise en 10 catégories:les personnes qui comprennent le binaire,et les autres.

Dans tout ce que vous apprenez, seuls 10% vont vous servir,mais vous ne savez pas lesquels ...
Avatar du membre
Priigame
Générateur de blocs fonctions
Générateur de blocs fonctions
Messages : 121
Enregistré le : 08 nov. 2017, 09:28

Re: Récupérer l'états des différentes liaison

Message par Priigame »

Du coup pour avoir un retour du ping correct cela va énormément compliqué le code non ?

Je devrais probablement le détaillé lors de ma soutenance de fin d'année ^^

Si non dans le cas d'une supervision de X automate, le premier script peu largement faire l'affaire non ?


Va falloir que je me penche un petit peu sur les différentes instruction que tu as utiliser pour quand même montrer que je me suis renseigné :D
Avatar du membre
djé
Dieu du process
Dieu du process
Messages : 864
Enregistré le : 20 oct. 2015, 09:55
Localisation : Bretagne, Pays de la Loire, Nantes
Contact :

Re: Récupérer l'états des différentes liaison

Message par djé »

Priigame a écrit : 10 nov. 2017, 11:02 Du coup pour avoir un retour du ping correct cela va énormément compliqué le code non ?
Dans le cas de l'utilisation du script avec WSH, oui.

L'utilisation du script avec WMI est beaucoup plus sûre et pro, je pense.

Ensuite pour ce qui est d'utiliser cette API, il y a plein de choses qui existe avec notamment des outils de génération de code. tu peux regarder par si tu veux.
Le monde se divise en 10 catégories:les personnes qui comprennent le binaire,et les autres.

Dans tout ce que vous apprenez, seuls 10% vont vous servir,mais vous ne savez pas lesquels ...
Avatar du membre
Priigame
Générateur de blocs fonctions
Générateur de blocs fonctions
Messages : 121
Enregistré le : 08 nov. 2017, 09:28

Re: Récupérer l'états des différentes liaison

Message par Priigame »

Désolé de revenir sur ce sujet, j'aurais juste besoin d’éclaircissement vis à vis du script :/

Est-ce possible de détailler la fonction de :
" Select * From Win32_PingStatus"
"GetObject("winmgmts://./root/cimv2")"

Et le PingResult est la valeur retourner par la classe Win32_PingStatus ?

Le reste c'est tout bon :)

Merci d'avance.


Code:

Code : Tout sélectionner

    ' déclaration variables
    Dim colPingResults, objPingResult, strQuery

    ' définition de la requete  WMI 
    'ipAdr = paramètre transmis à la routine (SUB) (ex 192.168.2.250)
    strQuery = "SELECT * FROM Win32_PingStatus WHERE Address = '" & ipAdr & "'" 

    ' lancement de la requete  WMI
    Set colPingResults = GetObject("winmgmts://./root/cimv2").ExecQuery( strQuery )

    ' Analyse de la reponse requete WMI
    For Each objPingResult In colPingResults
        If Not IsObject( objPingResult ) Then
            Variable_1 = False
        ElseIf objPingResult.StatusCode = 0 Then
            Variable_1 = True  'Variable_1 d'animation de type locale
        Else
            Variable_1 = False
        End If
    Next

    Set colPingResults = Nothing

Avatar du membre
djé
Dieu du process
Dieu du process
Messages : 864
Enregistré le : 20 oct. 2015, 09:55
Localisation : Bretagne, Pays de la Loire, Nantes
Contact :

Re: [Eclaircissement] Récupérer l'états des différentes liaison

Message par djé »

Salut,

Difficile de détailler plus avec mon niveau actuel de connaissance (je sais l'utiliser mais pas expliquer comment cela fonctionne exactement...)
  • le GetObject("winmgmts://./root/cimv2") se connecte au gestionnaire de la base CIM de l'ordinateur local.
  • le ExecQuery exécute la requête "SELECT * FROM Win32_PingStatus WHERE Address = '" & ipAdr & "'" (un peu comme en SQL)
  • Win32_PingStatus (représentent les résultats d'une commande de ping sur l'adresse donnée dans la requête)
L'ensemble de la commande renvoie une collection dans laquelle on retrouve la valeur de retour du ping "StatusCode")

Plus d'info:

https://msdn.microsoft.com/en-us/librar ... s.85).aspx
http://igm.univ-mlv.fr/~dr/XPOSE2006/du ... tionnement
Le monde se divise en 10 catégories:les personnes qui comprennent le binaire,et les autres.

Dans tout ce que vous apprenez, seuls 10% vont vous servir,mais vous ne savez pas lesquels ...
Répondre