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
Code : Tout sélectionner
#include <File.au3>
#include <WindowsConstants.au3>
#include <FileSystemMonitor.au3>
$path_input = GUICtrlCreateInput("LeCheminDeMonFichierTxt", 10, 10, 320)
; Setup File System Monitoring
_FileSysMonSetup(3, "LeCheminDeMonFichierTxt", "")
; Main Loop
While 1
_FileSysMonDirEventHandler()
_FileSysMonSetDirMonPath(GUICtrlRead($path_input))
_FileSysMonSetShellMonPath(GUICtrlRead($path_input))
WEnd
Func _FileSysMonActionEvent($event_type, $event_id, $event_value)
Local $event_type_name
Local $fs_event = ObjCreate("Scripting.Dictionary")
Switch $event_type
Case 0
$fs_event.item(Hex(0x00000001)) = "file added to the directory|FILE_ACTION_ADDED"
$fs_event.item(Hex(0x00000002)) = "file removed from the directory|FILE_ACTION_REMOVED"
$fs_event.item(Hex(0x00000003)) = "file was modified|FILE_ACTION_MODIFIED"
$fs_event.item(Hex(0x00000004)) = "file was renamed old name|FILE_ACTION_RENAMED_OLD_NAME"
$fs_event.item(Hex(0x00000005)) = "file was renamed new name|FILE_ACTION_RENAMED_NEW_NAME"
Case 1
$fs_event.item(Hex(0x00000001)) = "Non-folder item name changed|SHCNE_RENAMEITEM"
$fs_event.item(Hex(0x00000002)) = "Non-folder item created|SHCNE_CREATE"
$fs_event.item(Hex(0x00000004)) = "Non-folder item deleted|SHCNE_DELETE"
$fs_event.item(Hex(0x00000008)) = "Folder created|SHCNE_MKDIR"
$fs_event.item(Hex(0x00000010)) = "Folder removed|SHCNE_RMDIR"
$fs_event.item(Hex(0x00000020)) = "Storage media inserted into a drive|SHCNE_MEDIAINSERTED"
$fs_event.item(Hex(0x00000040)) = "Storage media removed from a drive|SHCNE_MEDIAREMOVED"
$fs_event.item(Hex(0x00000080)) = "Drive removed|SHCNE_DRIVEREMOVED"
$fs_event.item(Hex(0x00000100)) = "Drive added|SHCNE_DRIVEADD"
$fs_event.item(Hex(0x00000200)) = "Local computer folder shared via the network|SHCNE_NETSHARE"
$fs_event.item(Hex(0x00000400)) = "Local computer folder not shared via the network|SHCNE_NETUNSHARE"
$fs_event.item(Hex(0x00000800)) = "Item or folder attributes have changed|SHCNE_ATTRIBUTES"
$fs_event.item(Hex(0x00001000)) = "Folder content has changed|SHCNE_UPDATEDIR"
$fs_event.item(Hex(0x00002000)) = "Folder or non-folder has changed|SHCNE_UPDATEITEM"
$fs_event.item(Hex(0x00004000)) = "Computer disconnected from server|SHCNE_SERVERDISCONNECT"
$fs_event.item(Hex(0x00008000)) = "System image list image has changed|SHCNE_UPDATEIMAGE"
$fs_event.item(Hex(0x00010000)) = "Not used|SHCNE_DRIVEADDGUI"
$fs_event.item(Hex(0x00020000)) = "Folder name has changed|SHCNE_RENAMEFOLDER"
$fs_event.item(Hex(0x00040000)) = "Drive free space has changed|SHCNE_FREESPACE"
$fs_event.item(Hex(0x0002381F)) = "SHCNE_DISKEVENTS"
$fs_event.item(Hex(0x0C0581E0)) = "SHCNE_GLOBALEVENTS"
$fs_event.item(Hex(0x7FFFFFFF)) = "SHCNE_ALLEVENTS"
$fs_event.item(Hex(0x80000000)) = "SHCNE_INTERRUPT"
EndSwitch
If StringLen($fs_event.item(Hex($event_id))) > 0 Then
$event_type_name = StringSplit($fs_event.item(Hex($event_id)), "|")
$event_type_name[2] = $event_type_name[2] & "(" & $event_id & ")"
_ReadTxtFileToMsgBox()
EndIf
EndFunc
Func _ReadTxtFileToMsgBox()
$hFile = FileOpen("LeCheminDeMonFichierTxt")
$iCount = _FileCountLines("LeCheminDeMonFichierTxt")
$sRead = FileReadLine($hFile, $iCount)
MsgBox(64, "Message", $sRead)
FileClose($hFile)
EndFunc
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
Code : Tout sélectionner
#include <GUIConstantsEx.au3>
;http://www.autoitscript.fr/forum/viewtopic.php?f=6&t=2464
Opt('MustDeclareVars', 1)
Dim $szIPADDRESS
$szIPADDRESS = InputBox("Connexion du SERVER", "IP du SERVER : ", @IPAddress1)
;==============================================
;==============================================
;SCRIPT DU SERVER ; A LANCER EN PREMIER
;==============================================
;==============================================
Example()
Func Example()
Sleep (100)
; INFOS A COMPLÉTÉES
Local $nPORT = 80
Local $MainSocket, $GOOEY, $edit, $ConnectedSocket, $szIP_Accepted
Local $msg, $recv
Dim $recvstring
; Lancement des services TCP
;==============================================
; Si la connection au port à échouée, alors on recommence
; Création d'un GUI pour recevoir des données d'un autre PC part le port ouvert
;==============================================
$GOOEY = GUICreate("Mon Server (IP: " & $szIPADDRESS & ")", 300, 200)
$edit = GUICtrlCreateEdit("", 10, 10, 280, 180)
GUISetState()
; Initialisation de la variable définissant la connexion
;==============================================
; Fenêtre GUI affichant les données envoyées
;==============================================
While 1
TCPStartup()
; Ouverture d'un port sur le reseau / ATTENTION UN PARE FEU PEU BLOQUER CETTE FONCTION
; Utilisation pour l'ouverture de : L'ip Privée (@IPAddress1) avec le port 14584 (inutilisé normalement)
;==============================================
$MainSocket = TCPListen($szIPADDRESS, $nPORT,5000)
$ConnectedSocket = -1
;Attente d'une demande de connection
;==============================================
;MsgBox(0,"","do")
Do
$ConnectedSocket = TCPAccept($MainSocket)
$msg = GUIGetMsg()
If $msg = $GUI_EVENT_CLOSE Then Exit
$szIP_Accepted = SocketToIP($ConnectedSocket)
Until $ConnectedSocket <> -1
$msg = GUIGetMsg()
; Fermeture de la GUI
;--------------------
If $msg = $GUI_EVENT_CLOSE Then Exit
; Reçoit des données à partir du port connecté / 2048 bytes maximum
;----------------------------------------------------------------
$recv = TCPRecv($ConnectedSocket, 2048)
;TCPSend($ConnectedSocket, "connection reçue")
; Si les données on mal été reçues, le SERVER se ferme
;----------------------------------------------------------------
$recvstring=StringSplit($recv,"\")
; Rafraichissement des données envoyées
;----------------------------------------------------------------
If $recv <> "" Then
GUICtrlSetData($edit, _
$recvstring[1] & " > " & $recvstring[2] & @CRLF & GUICtrlRead($edit))
TCPSend($ConnectedSocket, "connection reçue " & $recv)
EndIf
TCPShutdown()
WEnd
TCPShutdown()
EndFunc ;==>Example
; Fonction permettant de connaitre l'adresse IP du CLIENT connecté au SERVER
;----------------------------------------------------------------------
Func SocketToIP($SHOCKET)
Local $sockaddr, $aRet
$sockaddr = DllStructCreate("short;ushort;uint;char[8]")
$aRet = DllCall("Ws2_32.dll", "int", "getpeername", "int", $SHOCKET, _
"ptr", DllStructGetPtr($sockaddr), "ptr", DllStructGetSize($sockaddr))
If Not @error And $aRet[0] = 0 Then
$aRet = DllCall("Ws2_32.dll", "str", "inet_ntoa", "int", DllStructGetData($sockaddr, 3))
If Not @error Then $aRet = $aRet[0]
Else
$aRet = 0
EndIf
$sockaddr = 0
Return $aRet
EndFunc ;==>SocketToIP
Pour le ou les clients
► Afficher le texte
Code : Tout sélectionner
#include <Inet.au3>
;http://www.autoitscript.fr/forum/viewtopic.php?f=6&t=2464
$yourip=_GetIP()
$szIPADDRESS = InputBox("Connexion à un SERVER", "IP du SERVER : ", @IPAddress1)
Opt('MustDeclareVars', 1)
;==============================================
;==============================================
;SCRIPT DU CLIENT ; A LANCER EN DEUXIEME
;==============================================
;==============================================
Example()
Func Example()
; INFOS A COMPLÉTÉES
Local $ConnectedSocket, $szData, $recv, $flag
Local $nPORT = 14584
; Lancement des services TCP
;==============================================
; Si une erreur existe alors on l'envoie par MsgBox puis le script se ferme
If @error Then
MsgBox(4112, "Error", "TCPConnect failed with WSA error: " & @error)
; Si il n'y a pas d'erreur le CLIENT est connecté au SERVER
TCPStartup()
Else
;Demande de données à envoyées
While 1
; Initialisation de la variable définissant la connexion
;==============================================
; InputBox des données à envoyées
$szData = InputBox("Data for Server", @LF & @LF & "Enter data to transmit to the SERVER:")
; Si il y a une erreur ou si le bouton annuler est préssé le script se ferme, si les données envoyées sont nul, ne rien faire
If @error Then
MsgBox(0,"","do")
Exit
ElseIf $szData = "" Then
Sleep (0)
EndIf
; Envoie des données vers le SERVER
$ConnectedSocket = -1
;Connection sur le SERVER d'adresse IP:*voir ImputBox* avec le port 14584 (inutilisé normalement)
;=======================================================
$ConnectedSocket = TCPConnect($szIPADDRESS, $nPORT)
TCPSend($ConnectedSocket, $yourip&"\"&$szData)
If Not @error Then
$recv = TCPRecv($ConnectedSocket, 2049)
If $recv > "" Then
If StringInStr($recv,48) > 0 Then
$flag = 48
Else
$flag = 64
EndIf
MsgBox($flag,"",$recv)
EndIf
EndIf
; Si les données n'ont pas été envoyées, le CLIENT se Déconnecte
;----------------------------------------------------------------
If @error Then MsgBox(0,"","doap")
WEnd
EndIf
EndFunc ;==>Example
(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
Code : Tout sélectionner
#NoTrayIcon
#include <GUIConstantsEx.au3>
#include <MsgBoxConstants.au3>
#include <File.au3>
#include <Inet.au3>
; Déclaration des variables
Local $debut_adresseIP = "192.168.1."
Local $adresseIP = "192.168.1.1"
Local $port = 65532
Local $i = 1
UDPStartup()
OnAutoItExitRegister("OnAutoItExit")
Opt("TCPTimeout", 100)
; InputBox pour saisir le message à envoyer
Local $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, "Nom du fichier LOG | " & $FileName & @CRLF)
FileWrite($hFileOpen, "Message envoyé | " & $message & @CRLF & @CRLF)
FileClose($hFileOpen)
; Départ du timer
$dTimer = TimerInit()
; Boucle d'envoi du message
While $i < 255
$adresseIP = $debut_adresseIP & $i
Local $socket = UDPOpen($adresseIP, $port)
Local $error = 0
If @error Then
$iError = @error
; Ecriture dans le fichier LOG
$hFileOpen = FileOpen($FileName, $FO_READ + $FO_APPEND)
FileWrite($hFileOpen, @MDAY & "/" & @MON & "/" & @YEAR & " " & @HOUR & ":" & @MIN & ":" & @SEC & " | " & $adresseIP & " | Echec connection (" & $iError & ")" & @CRLF)
FileClose($hFileOpen)
Return False
EndIf
UDPSend($socket, StringToBinary($message))
If @error Then
$iError = @error
; Ecriture dans le fichier LOG
$hFileOpen = FileOpen($FileName, $FO_READ + $FO_APPEND)
FileWrite($hFileOpen, @MDAY & "/" & @MON & "/" & @YEAR & " " & @HOUR & ":" & @MIN & ":" & @SEC & " | " & $adresseIP & " | Echec envoi (" & $iError & ")" & @CRLF)
FileClose($hFileOpen)
Return False
Else
; Ecriture dans le fichier LOG
$hFileOpen = FileOpen($FileName, $FO_READ + $FO_APPEND)
FileWrite($hFileOpen, @MDAY & "/" & @MON & "/" & @YEAR & " " & @HOUR & ":" & @MIN & ":" & @SEC & " | " & $adresseIP & @CRLF)
FileClose($hFileOpen)
EndIf
UDPCloseSocket($socket)
$i = $i + 1
WEnd
; Fin du timer
$fDiff = TimerDiff($dTimer)
$hFileOpen = FileOpen($FileName, $FO_READ + $FO_APPEND)
FileWrite($hFileOpen, @CRLF & "Durée de l'opération | " & Round(($fDiff/1000), 0) & " secondes" & @CRLF)
FileClose($hFileOpen)
MsgBox(64+262144, "Envoi d'un message", " Opération réalisée en " & Round(($fDiff/1000), 0) & " secondes")
Exit
Func OnAutoItExit()
UDPShutdown()
EndFunc
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