Page 1 sur 1

[R] Message réseau dans une MsgBox

Posté : mer. 30 sept. 2015 21:13
par papy46
Bonjour,

Je suis à la recherche d'un script dont la fonction est décrite ci-dessous.

J'ai une application AutoIt qui fonctionne en continu sur les ordinateurs (en Win7) de mon réseau (l'application est fonctionnelle). Cette application permet d'accéder rapidement au portail intranet de la société. L'application est réduite dans la zone de notification. Je souhaiterai ajouter la fonctionnalité suivante à mon application : Affichage d'un message dans une MsgBox (envoi du texte et du type d’icône). Ce message serait envoyé par une application utilisée par le responsable du réseau. L'application qui envoie le message n'a pas besoin d'avoir une liste des PC du réseau, elle doit envoyer le message à tous les PC du réseau (on peut fixer une plage IP, exemple : 192.168.0.1 à 192.168.0.254) et ceux exécutant l'application afficheront le message.

En vous remerciant pour votre aide.

Cordialement.

Papy46

Re: [..] Message réseau dans une MsgBox

Posté : jeu. 01 oct. 2015 13:32
par Hugues
Bonjour,

J'ai peux-etre une solution... Une usine à gaz lol.

Pourquoi ne pas mettre un fichier texte sur un serveur. L'administrateur saisie le message qu'il veut afficher...

J'ai trouvé ce script sur le net qui contrôle si le fichier a été modifié. Sur ce script j'ai "greffé" une autre fonction qui va lire la dernière ligne du fichier txt pour l'afficher dans une MsgBox.

Ci joint le code, cela sera surement plus clair...
► Afficher le texte

Re: [..] Message réseau dans une MsgBox

Posté : jeu. 01 oct. 2015 15:18
par walkson
Bonjour,
Peut être en utilisant le TCP
Le serveur se connecte en local et les clients se connectent à l'IP du serveur (ex: 192.168.1.xxx)
Pour le MsgBox, il suffit que le message reçu contienne le flag (ex: "48 attention virus en ligne") et de l'extraire du message e.g. MsgBox ( $flag, "title", $réceptionmessage)
Voici un exemple à adapter à vos besoins
Pour le serveur (à démarrer en premier)
► Afficher le texte
Pour le ou les clients
► Afficher le texte
(Coté serveur, à l'invite, tapez 48 et regardez en retour le MsgBox puis tapez un autre nombre)
Le code vient de http://www.autoitscript.fr/forum/viewto ... f=6&t=2464
Deux remarques: à la demande du client, c'est l'IP du serveur à rentrer (pas celui indiqué). s'assurer que le port est ouvert et inutilisé.
L'exemple ne correspond pas tout à fait à votre demande mais il est fonctionnel
En espérant que ce vous soit utile...

Re: [..] Message réseau dans une MsgBox

Posté : jeu. 01 oct. 2015 18:02
par papy46
Bonjour,

Merci de vos réponses. La seconde proposition correspond mieux à mon souhait. Il me faut retravailler la partie qui sera intégrée au portail afin de n'afficher qu'une MsgBox quand on reçoit un message. Et peut-être aussi prévoir une option pour que l'utilisateur puisse inhiber l'affichage du message.

Pour la partie qui va servir à envoyer le message, je pensai faire une boucle (for ?) qui va passer toutes les adresses IP comprises entre 192.168.0.1 et 192.168.0.254 (cela correspond à mon besoin). Si on peut se connecter, alors on envoie le message. Il me faudra aussi créer un fichier log afin de savoir quelles sont les adresses en échec et celles en réussites.

Si tout fonctionne, j'aurai atteint mon objectif :-)

Cordialement.

Papy46

Re: [..] Message réseau dans une MsgBox

Posté : jeu. 01 oct. 2015 21:55
par jguinch
Perso, voilà comment je ferais :
- Un fichier PHP hébergé sur un serveur Web, qui permet de configurer la MsgBox et la liste des postes/IP concernés, je tout génère un fichier .txt (ou autre) - comment ça, un administrateur utilise une interface web, plutôt que le bloc-note pour modifier le fichier de config
- Sur les les postes clients s'exécute un programme en tâche de fond, qui télécharge à intervalles réguliers le fichier .txt. Une fois téléchargé, le fichier est analysé et la boite de dialogue s'affiche en fonction des critères (poste/IP/date-heure...)

Ca peut être un simple partage de fichiers à la place d'une url...

Re: [..] Message réseau dans une MsgBox

Posté : ven. 02 oct. 2015 11:01
par walkson
Bonjour,
Pour la partie qui va servir à envoyer le message, je pensai faire une boucle (for ?) qui va passer toutes les adresses IP comprises entre 192.168.0.1 et 192.168.0.254 (cela correspond à mon besoin). Si on peut se connecter, alors on envoie le message. Il me faudra aussi créer un fichier log afin de savoir quelles sont les adresses en échec et celles en réussites.
La boucle est inutile car le serveur envoie son message à tout le monde et, seuls, les clients connectés sur le même port à l'adresse du serveur le reçoivent.
Pour connaitre ceux qui ont reçu le message, il y a la solution du retour, CAD le client qui a reçu le message envoie au serveur ses coordonnées.
En fait, le véritable problème de cette solution, est que si le client se connecte avant le serveur, il y a échec. Là, il faudrait une boucle pour vérifier la connexion. Il y a aussi le problème de ne pas recevoir sans cesse le même message...
Sauf erreur de ma part, il me semble que votre sujet a déjà été abordé sur le forum......
Il y a aussi http://autoitscript.fr/forum/viewtopic.php?f=21&t=13662 (il faut la version beta d'autoit)
Après, la solution de jguinch semble de loin la plus simple (mais je n'y connais rien en PHP)

Re: [..] Message réseau dans une MsgBox

Posté : ven. 02 oct. 2015 13:16
par papy46
Bonjour,

En m'inspirant des scripts indiqués, j'ai écrit le script suivant (pour la partie émission) :

Code : Tout sélectionner

#NoTrayIcon

#include <MsgBoxConstants.au3>
#include <File.au3>
#include <Inet.au3>





; Déclaration des variables
$adresseIP_debut = "192.168.0."
$adresseIP = "192.168.0.1"





; InputBox pour saisir le message à envoyer
$message = InputBox("Envoi d'un message", "Votre message :", "", "", "", 130)





; Création du fichier log
$FileName = "LOG_" & @YEAR & @MON & @MDAY & "_" & @HOUR & @MIN & @SEC & ".log"
$hFileOpen = FileOpen($FileName, $FO_READ + $FO_OVERWRITE)
FileWrite($hFileOpen, "Fichier | " & $FileName & @CRLF)
FileWrite($hFileOpen, "Message | " & $message & @CRLF & @CRLF)
FileClose($hFileOpen)





; Départ du timer
$dTimer = TimerInit()

; Incrément pour adresse IP DHCP
For $i = 2 To 50 Step 1
    $adresseIP = $adresseIP_debut & $i
    envoi_message($adresseIP, $message, $FileName)
 Next

 ; Incrément pour adresse IP FIXE
For $i = 100 To 169 Step 1
    $adresseIP = $adresseIP_debut & $i
    envoi_message($adresseIP, $message, $FileName)
Next

; Fin du timer
$fDiff = TimerDiff($dTimer)





$hFileOpen = FileOpen($FileName, $FO_READ + $FO_APPEND)
FileWrite($hFileOpen, @CRLF & "Durée du traitement | " & Round(($fDiff/1000), 0) & " secondes" & @CRLF)
FileClose($hFileOpen)

MsgBox(64+262144, "Envoi d'un message", "     Envoi réalisé en " & Round(($fDiff/1000), 0) & " secondes")

Exit





; FONCTION ENVOI MESSAGE RESEAU (MSGBOX)
Func envoi_message($adresseIP, $message, $FileName)

   Local $ConnectedSocket, $szData, $recv, $flag
   Local $nPORT = 14584
   Local $yourIP = _GetIP()

   Opt("TCPTimeout", 100)

   If @error Then
      ; Ecriture ECHEC dans le fichier LOG
      $hFileOpen = FileOpen($FileName, $FO_READ + $FO_APPEND)
      FileWrite($hFileOpen, @MDAY & "/" & @MON & "/" & @YEAR & " " & @HOUR & ":" & @MIN & ":" & @SEC & " | " & $adresseIP & " | Echec (1)" & @CRLF)
      FileClose($hFileOpen)

      TCPStartup()
   Else
      $szData = $message

      $ConnectedSocket = -1

      $ConnectedSocket = TCPConnect($adresseIP, $nPORT)
      TCPSend($ConnectedSocket, $yourip & "\" &$szData)

      If @error Then
         ; Ecriture ECHEC dans le fichier LOG
         $hFileOpen = FileOpen($FileName, $FO_READ + $FO_APPEND)
         FileWrite($hFileOpen, @MDAY & "/" & @MON & "/" & @YEAR & " " & @HOUR & ":" & @MIN & ":" & @SEC & " | " & $adresseIP & " | Echec (2)" & @CRLF)
         FileClose($hFileOpen)
      Else
         ; Ecriture ENVOYE dans le fichier LOG
         $hFileOpen = FileOpen($FileName, $FO_READ + $FO_APPEND)
         FileWrite($hFileOpen, @MDAY & "/" & @MON & "/" & @YEAR & " " & @HOUR & ":" & @MIN & ":" & @SEC & " | " & $adresseIP & " | Envoyé" & @CRLF)
         FileClose($hFileOpen)
      EndIf
   EndIf

EndFunc
Il fonctionne, mais il peut être trèèèèsss long : 1117 secondes pour envoyer un message de 2 mots à 119 PC ....

Comme la partie qui envoie le message n'est pas connectée en permanence, le serveur est dans le module qui reçoit le message (donc sur le poste de l'utilisateur). Ma boucle me permet de tester chaque adresse IP et d'envoyer le message. Je ne comprends pas pourquois c'est si long ?

Cordialement.

Papy46

Re: [..] Message réseau dans une MsgBox

Posté : sam. 03 oct. 2015 11:18
par walkson
Bonjour,
La lenteur vient peut être de "Local $yourIP = _GetIP()" qui vous retourne votre IP public en interrogeant le web.
Est ce vraiment utile de le faire alors que vous êtes sur un réseau interne ?
Mais je ne suis pas du tout un spécialiste dans ce domaine (je "gère" 3 PC espacés de 50 cm)

Re: [..] Message réseau dans une MsgBox

Posté : sam. 03 oct. 2015 23:27
par papy46
Bonjour,

J'ai tenté l'expérience en utilisant le protocole UDP à la place du TCP et en m'inspirant de la doc AutoIt (https://www.autoitscript.com/autoit3/do ... DPSend.htm) :
► Afficher le texte
Pour tester les 254 adresses IP, il me faut environ 741 secondes soit à peu près 3 secondes pour déterminer si un PC est actif ou pas. Je trouve ça relativement long, mais je n'est pas suffisamment d'expérience dans les réseaux et leurs protocole pour être objectif.

Cordialement.

Papy46

Re: [..] Message réseau dans une MsgBox

Posté : lun. 12 oct. 2015 08:56
par papy46
Bonjour,

Le problème a l'air d'être résolu en utilisant la fonction PING, si ça répond alors j'envoie le message sinon je passe à l'adresse suivante. Je suis aussi resté sur le protocole UDP qui répond à mon besoin.

Cordialement.

Papy46