[..] Modification d'une adresse IP depuis une combobox

Aide et conseils concernant AutoIt et ses outils.
Règles du forum
.
Répondre
atlas12345
Niveau 1
Niveau 1
Messages : 10
Enregistré le : ven. 03 févr. 2017 09:47
Status : Hors ligne

[..] Modification d'une adresse IP depuis une combobox

#1

Message par atlas12345 »

Salut a tous,

Je parcours ce forum depuis quelques temps étant novice dans l'utilisation d'AutoIT. Les exemples, tutos et aides apportées facilite la compréhension et l'utilisation du logiciel, même un novice comme moi arrive a faire des petits programmes grave à vous.

Je suis justement en train d'essayer de me faire un petit programme qui me permettrais de redémarrer plusieurs pc en les sélectionnant depuis une boite de dialogue déroulante.

Ma combobox est créee et utilise un fichier .txt contenant la liste des noms de PC a afficher dans la combobox. Mais là ou je bloque et que j'aurais besoin d'un coup de main c'est pour faire le lien entre le libellé du pc contenu dans mon fichier .txt et son adresse IP.

Je souhaiterais faire en sorte que quand je choisi dans ma combobox un PC son adresse IP soit renseignée dans mon code afin d'envoyer la commande vers le bon PC.

Voici la commande envoyée pour le reboot:
$CMD = 'D:\psshutdown.exe \\0.0.0.0 -u user -p toto -r -f -t 0 '
          RunWait('"' & @ComSpec & '" /k ' & $CMD, @SystemDir)
Mes nom de pc:
pc 1
pc 2
pc 3
pc 4


et le code complet:
#include <ButtonConstants.au3>
#include <ComboConstants.au3>
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>

Global $BDD = "pc.txt"

GUICreate("Reboot", 226, 90, -1, -1)
Global $Valider = GUICtrlCreateButton("REBOOT", 75, 48, 75, 25)
Global $Combo = GUICtrlCreateCombo("Choisissez un pc dans la liste", 16, 16, 193, 25, BitOR($CBS_DROPDOWN, $CBS_AUTOHSCROLL))


GUICtrlSetData ($Combo, _LectureBase())
GUISetState(@SW_SHOW)



While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
        Case $GUI_EVENT_CLOSE
            Exit
        Case $Valider
             $CMD = 'D:\psshutdown.exe \\0.0.0.0 -u user -p toto -r -f -t 0 '
          RunWait('"' & @ComSpec & '" /k ' & $CMD, @SystemDir)
          MsgBox(16 + 8192, "Redémarrage en cours ...", "Reboot en cours de : " & GUICtrlRead($Combo))
         EndSwitch
WEnd

Func _LectureBase()
    $hFile = FileOpen($BDD)
    If $hFile = -1 Then
        MsgBox(16, "Erreur", "Erreur de lecture du fichier de base de données")
        Exit
    EndIf

    Local $Datas

    While 1
        Local $Line = FileReadLine($hFile)
        If @error = -1 Then ExitLoop

        $Datas &= $Line & "|"
    WEnd

    FileClose($hFile)
    Return $Datas
EndFunc   ;==>_LectureBase
Pourriez vous me montrer comment faire pour gérer les adresses IP de ces ordi et faire le lien IP<>PC via la combobox ?

merci pour l'aide que vous pourrez m'apporter.
Avatar du membre
walkson
Modérateur
Modérateur
Messages : 1037
Enregistré le : ven. 12 août 2011 19:49
Localisation : Hurepoix
Status : Hors ligne

Re: [..] Modification d'une adresse IP depuis une combobox

#2

Message par walkson »

Bonsoir,
Pas sûr d'avoir tout compris mais je m'y risque...
Voilà un code qui permet de trouver les postes connectés au réseau local. Il suffit de modifier Consolewrite() en Filewrite(). Il est basé sur @IPAddress1
#include <Constants.au3>
#include <Array.au3>
#include <Inet.au3>
;~ Based off threaded IP script by Manadar
;~ http://www.autoitscript.com/forum/topic/104334-whats-wrong-with-ping-or-with-me/page__view__findpost__p__740697
Local Const $MAX_PROCESS = 10 ; We spawn a maximum of 10 processes at once
Local $a_process[$MAX_PROCESS] ; An array to keep a reference to spawned processes, in the next loop we fill it with value 0
For $i = 0 to UBound($a_process)-1
    $a_process[$i] = 0
Next
$local = @IPAddress1

$split = StringSplit($local,".")
$host = $split[1] &"."& $split[2] &"."& $split[3] &"."
;MsgBox(0,"",$host)
; The following array represents a list of hosts, these are probably provided from a file later on
Local $address[256]
For $i = 0 to 255
    $address[$i] = $host & $i ; We generate some IPs
Next

ConsoleWrite("Pinging " & UBound($address)-1 & " addresses." & @CRLF)

Local $i = 0 ; A pointer to run through the $address array
TCPStartup()
While True

    ; Check on the current processes, and look if there is one finished for use with our next host in line (from $address)
    For $n = 0 to UBound($a_process)-1
        If ($a_process[$n] == 0) Then ; Check if there is an empty spot
            $a_process[$n] = _MSPing($address[$i])
         ToolTip($address[$i],50,200)
            $i += 1
            If ($i == UBound($address)-1) Then
                ExitLoop 2
            EndIf
        Else
            ; Something is running here, let's check on the output

            If (_MSPingIsReady($a_process[$n])) Then
                ; We have an output here, let's get it!
                $hostname = _MSPingGetHostname($a_process[$n])
                $pingtime = _MSPingGetResult($a_process[$n])
            If Not $pingtime Then
               ConsoleWrite(">>"& $hostname & @CR)
               $nameip =  _TCPIpToName ( $hostname)
               ConsoleWrite(">>> " & $nameip & @CRLF)
            EndIf

                If ($pingtime <> -1) Then
                    ;ConsoleWrite($hostname & " has a roundtrip of " & $pingtime & "." & @CRLF)
                Else
                    ;ConsoleWrite($hostname & " is unreachable." & @CRLF)
                EndIf
                ; Free up an empty space for the next address to Ping
                $a_process[$n] = 0
            EndIf
        EndIf
    Next

    Sleep(50) ; Give existing ping commands some time to process the request
WEnd

ConsoleWrite("Ping ready!!" & @CRLF)

Func _MSPing($hostname, $timeout = 50)
    Local $return_struc[4]
    ; [0] = Result (in ms)
    ; [1] = The hostname originally used
    ; [2] = Process handle (for internal use only)
    ; [3] = Buffer (for internal use only)

    $return_struc[1] = $hostname
    $return_struc[2] = Run("ping " & $hostname & " -n 1 -w " & $timeout, "", @SW_HIDE, $STDOUT_CHILD)

    Return $return_struc
EndFunc

Func _MSPingIsReady(ByRef $return_struc)
    Return ___MSPingReadOutput($return_struc)
EndFunc

Func _MSPingGetResult($return_struc)
    Return $return_struc[0]
EndFunc

Func _MSPingGetHostname($return_struc)
    Return $return_struc[1]
EndFunc

; Internal use only
Func ___MSPingReadOutput(ByRef $return_struc)
    $data = StdoutRead($return_struc[2])
    If (@error) Then
        ___MSPingParseResult($return_struc)
        Return 1
    Else
        $return_struc[3] &= $data
        Return 0
    EndIf
EndFunc

; Internal use only
Func ___MSPingParseResult(ByRef $return_struc)
    $result = StringRegExp($return_struc[3], "([0-9]*)ms", 3)
    If @error Then
        $return_struc[0] = -1
    Else
        $return_struc[0] = $result[0]
    EndIf
EndFunc
Pour la command line, tout simplement:
Case $Valider
      $lire = GUICtrlRead($Combo)
      $CMD = 'D:\psshutdown.exe \\'& $lire &' -u user -p toto -r -f -t 0 '
      RunWait('"' & @ComSpec & '" /k ' & $CMD, @SystemDir)
      MsgBox(16 + 8192, "Redémarrage en cours ...", "Reboot en cours de : " & $lire)
J'ai testé mon code qui me renvoie bien les adresses des PC connectés. Par contre, impossible de faire un reboot avec psshutdown.exe

Petite remarque, si votre code est fonctionnel, pensez à prévenir vos collègues avant le reboot ! :mrgreen:
Cordialement,
Walkson
"Horas non numero nisi serenas " Le canon de midi
(Je ne compte que les heures heureuses)
Avatar du membre
jguinch
Modérateur
Modérateur
Messages : 2515
Enregistré le : lun. 14 févr. 2011 22:12
Status : Hors ligne

Re: [..] Modification d'une adresse IP depuis une combobox

#3

Message par jguinch »

Si c'est ce que je comprends, tu as besoin de trouver l'adresse IP d'un PC à partir de son nom ?
Il faut utiliser TCPNameToIP($nom) (sans oublier TCPStartup() )
Le script, ça fait gagner beaucoup de temps... à condition d'en avoir beaucoup devant soi !
Avatar du membre
orax
Modérateur
Modérateur
Messages : 1479
Enregistré le : lun. 23 mars 2009 04:50
Localisation : ::1
Status : Hors ligne

Re: [..] Modification d'une adresse IP depuis une combobox

#4

Message par orax »

atlas12345 a écrit :c'est pour faire le lien entre le libellé du pc contenu dans mon fichier .txt et son adresse IP
Est-ce vraiment nécessaire d'obtenir son IP ?
psshutdown \\NOM_D'HÔTE_DU_PC ... devrait marcher, non ?
De petits détails peuvent faire toute la différence. — Quand la boule de neige commence à rouler… poussez-la. (Columbo)
Avatar du membre
jguinch
Modérateur
Modérateur
Messages : 2515
Enregistré le : lun. 14 févr. 2011 22:12
Status : Hors ligne

Re: [..] Modification d'une adresse IP depuis une combobox

#5

Message par jguinch »

@orax : si TCPNameToIp fonctionne, il y a toutes les chances pour que la commande shutdown fonctionne également en utilisant le nom de machine.
(D'ailleurs, pourquoi utiliser psshutdown alors que shutdown permet également de redémarrer le poste ?)
Le script, ça fait gagner beaucoup de temps... à condition d'en avoir beaucoup devant soi !
Avatar du membre
walkson
Modérateur
Modérateur
Messages : 1037
Enregistré le : ven. 12 août 2011 19:49
Localisation : Hurepoix
Status : Hors ligne

Re: [..] Modification d'une adresse IP depuis une combobox

#6

Message par walkson »

@jguinch
shutdown permet également de redémarrer le poste
même sur un poste distant ?.... un petit exemple serait bienvenue
Cordialement,
Walkson
"Horas non numero nisi serenas " Le canon de midi
(Je ne compte que les heures heureuses)
Avatar du membre
jguinch
Modérateur
Modérateur
Messages : 2515
Enregistré le : lun. 14 févr. 2011 22:12
Status : Hors ligne

Re: [..] Modification d'une adresse IP depuis une combobox

#7

Message par jguinch »

Code : Tout sélectionner

shutdown /m \\remotecomputer /r /f /t 0
Le script, ça fait gagner beaucoup de temps... à condition d'en avoir beaucoup devant soi !
atlas12345
Niveau 1
Niveau 1
Messages : 10
Enregistré le : ven. 03 févr. 2017 09:47
Status : Hors ligne

Re: [..] Modification d'une adresse IP depuis une combobox

#8

Message par atlas12345 »

Salut à tous

ça fait chaud au cœur de vous voir vous intéresser à mes galères .

Je pense ne pas avoir été suffisamment clair dans la description de ce que je voulais faire en me relisant je m'aperçois que c'est le cas , une grande baffe dans ma gueule :D

En fait je ne cherche pas à trouver l'adresse IP des PC qui sont sur mon réseau mais je voudrais simplement que lorsque l'on sélectionne dans la Comboboxe un PC par exemple PC 1 que son adresse IP soit automatiquement renseigner afin de lui envoyer une commande de reboot.

Je connais la liste des PC est également leur adresse IP je cherche à faire le lien entre le choix sélectionné dans la Combobox afin que son adresse IP soit remplie dans le script de reboot .

Je gère la liste des PC à sélectionner via un petit fichier PC TXT je pourrais faire de même avec les adresses IP de chacun des PC par contre ce que je cherche à faire c'est faire le lien entre le PC et l'adresse IP .

Pc1 a une ip que je connais quand je sélectionne pc 1 dans la combobox alors l'adresse ip de pc est renseignée la \\ip-pc1.

Merci de votre aide
Avatar du membre
walkson
Modérateur
Modérateur
Messages : 1037
Enregistré le : ven. 12 août 2011 19:49
Localisation : Hurepoix
Status : Hors ligne

Re: [..] Modification d'une adresse IP depuis une combobox

#9

Message par walkson »

une grande baffe dans ma gueule :D
je crois que vous devriez recommencer :mrgreen:
Si j'ai compris, on peut le faire comme ceci
Case $Valider
            $lire = GUICtrlRead($Combo)
         Switch $lire
            Case "PC1"
               $ip = "192.168.01.01"
               $user = "toto"
               $password = "secret"
            Case "PC2"
               $ip = "192.168.01.02"
               $user = "toto1"
               $password = "secret"
            Case "PC3"
               $ip = "192.168.01.03"
               $user = "toto2"
               $password = "secret"            
         EndSwitch
         
            $CMD = 'D:\psshutdown.exe \\'& $lire &' -u '&$user&' -p '&$password&' -r -f -t 0 '
            RunWait('"' & @ComSpec & '" /k ' & $CMD, @SystemDir)
            MsgBox(16 + 8192, "Redémarrage en cours ...", "Reboot en cours de : " & $lire)
Vous remarquerez que j'ai anticipé les users et passwords :P
C'est une solution pour peu de PC.Pour un parc plus important, je pense que la solution serait de passer par un INI
J'attire votre attention sur les commentaires d' Orax et de jguinch !.....
Cordialement,
Walkson
"Horas non numero nisi serenas " Le canon de midi
(Je ne compte que les heures heureuses)
atlas12345
Niveau 1
Niveau 1
Messages : 10
Enregistré le : ven. 03 févr. 2017 09:47
Status : Hors ligne

Re: [..] Modification d'une adresse IP depuis une combobox

#10

Message par atlas12345 »

Bonjour,

Bien vu walkson pour l'anticipation du nom d'utilisateur et du mot de passe et merci !

Je poste le code ça pourras certainement servir à d'autre utilisateurs de cet excellent forum.
voilà ce que ça donne :
#include <ButtonConstants.au3>
    #include <ComboConstants.au3>
    #include <GUIConstantsEx.au3>
    #include <WindowsConstants.au3>

    Global $BDD = "pc.txt"

    GUICreate("Reboot", 226, 90, -1, -1)
    Global $Valider = GUICtrlCreateButton("REBOOT", 75, 48, 75, 25)
    Global $Combo = GUICtrlCreateCombo("Choisir un pc dans la liste", 16, 16, 193, 25, BitOR($CBS_DROPDOWN, $CBS_AUTOHSCROLL))


    GUICtrlSetData ($Combo, _LectureBase())
    GUISetState(@SW_SHOW)

    While 1
        $nMsg = GUIGetMsg()
        Switch $nMsg
            Case $GUI_EVENT_CLOSE
                Exit
         Case $Valider
      $lire = GUICtrlRead($Combo)
      $ip = GUICtrlRead($Combo)
         Switch $ip
                    Case "PC 1"
                        $ip = "192.168.1.10"
                        $user = "toto"
                        $password = "secret"
                    Case "PC 2"
                        $ip = "192.168.1.20"
                        $user = "toto1"
                        $password = "secret"
                    Case "PC 3"
                        $ip = "192.168.1.68"
                        $user = "toto2"
                        $password = "secret"
         EndSwitch

            $CMD = 'C:\psshutdown.exe \\'&$ip&' -u '&$user&' -p '&$password&' -r -f -t 0 '
                RunWait('"' & @ComSpec & '" /k ' & $CMD, @SystemDir)
                MsgBox(16 + 8192, "Redémarrage en cours ...", "Reboot en cours de : " & $lire)
                EndSwitch
    WEnd

    Func _LectureBase()
        $hFile = FileOpen($BDD)
        If $hFile = -1 Then
            MsgBox(16, "Erreur", "Erreur de lecture du fichier de base de données")
            Exit
        EndIf

        Local $Datas

        While 1
            Local $Line = FileReadLine($hFile)
            If @error = -1 Then ExitLoop

            $Datas &= $Line & "|"
        WEnd

        FileClose($hFile)
        Return $Datas
    EndFunc
Par contre comme vous le faite remarquer walkson, ce code n'est pas adapté pour un nombre important de pc, dans mon cas, a terme je devrais en avoir une 50ène ...
Avant de poster ma demande, j'ai parcouru le forum et suis tombé sur le post de blacksoul305 qui traite le sujet des fichiers .INI. Gestion des fichiers ini. Je pense que dans mon cas cette solution serait plus adaptée.
J'ai lu son post et ai compris comment définir la structure du fichier .INI et les fonctions se rattachant a sa lecture/écriture. Mais bon je suis une grosse buse n'ayant aucune expérience en développement (ça vous l'aurez compris :? ) je n'ai pas réussi à le mettre en place et ce n'est pas faute d'avoir essayé ...
Surtout que l'utilisation d'un fichier ini n'apporte que des avantages a mon sens:
- Plus facile a maintenir en cas de changement
- plus simple a modifier
- un code beaucoup plus léger

et surtout l'utilisation d'un fichier .ini il permettrai de faire évoluer le code, par exemple ma combobox pourrait évoluer comme suit:

1°) Aujourd'hui ma combobox est comme ça

-------------------------------
Choisir un pc dans la liste + bouton VALIDER
-------------------------------
Fichiers INI contenant:
[nom demachine] [IP] [user] [password]
********************************************************

2) Mais demain je pourrais scinder comme suit:

-------------------
PC WINDOWS
------------------ + bouton VALIDER
PC LINUX
------------------
Fichiers INI contenant:
[OS][nom demachine] [IP] [user] [password]
********************************************************

3°)ou encore et là se serait le top:

-----------------------
PC WINDOWS
-----------------------
PC LINUX
-----------------------
Fichiers INI contenant:
[OS][nom demachine] [IP] [user] [password]
-----------------------
REBOOT
------------------------ + bouton VALIDER
METTRE A L'HEURE
------------------------
Commande a envoyer ...

Walkson auriez vous un exemple d'utilisation d'un fichier .INI pour le script de reboot ci dessus ?

J'ai vu plus haut qu'un question m'était posée de la part de Orax & jguinch sur l'utilisation de psshutdown plutôt que de la commande shutdown. J'utilise psshutdown car elle me permet de m'identifier sur une machine distance, chose que je n'ai pas réussi a faire avec l'invite de commande.

un petit lien vers cet utils:
PSSHUTDOWN
Avatar du membre
orax
Modérateur
Modérateur
Messages : 1479
Enregistré le : lun. 23 mars 2009 04:50
Localisation : ::1
Status : Hors ligne

Re: [..] Modification d'une adresse IP depuis une combobox

#11

Message par orax »

Je continu de penser qu'il serait plus simple d'utiliser le nom d'hôte plutôt que l'IP. C'est pourquoi j'avais proposé de faire psshutdown \\NOM_D'HÔTE_DU_PC au lieu de psshutdown \\IP_DU_PC.
; le code...
Case "PC de la blonde"
    $ip = "192.168.1.10"
    $user = "toto"
    $password = "secret"

; ... deviendrait
Case "PC de la blonde"
    $host = "PC-BLONDE"
    $user = "toto"
    $password = "secret"

; ou
Case "PC-BLONDE"
    $user = "toto"
    $password = "secret"
Au lieu de stocker l'IP dans le code ou dans un fichier INI, ça serait le nom d'hôte qui serait stocké.
De petits détails peuvent faire toute la différence. — Quand la boule de neige commence à rouler… poussez-la. (Columbo)
atlas12345
Niveau 1
Niveau 1
Messages : 10
Enregistré le : ven. 03 févr. 2017 09:47
Status : Hors ligne

Re: [..] Modification d'une adresse IP depuis une combobox

#12

Message par atlas12345 »

effectivement, cette optimisation est la bienvenue. Il faut quand même que je m'assure qu'un serveur DNS est disponible pour ce VLAN.et ci c'est le cas plus besoin de fichier INI pour la commande de reboot.
Je pourrais même me passer des variables $user et $password vu qu'elles sont identiques pour l'ensemble des pc's.
Case "PC 3"
$CMD = 'D:\psshutdown.exe \\'& $lire &' -u toto -p unmotdepassesupercompliqué -r -f -t 0 '
RunWait('"' & @ComSpec & '" /k ' & $CMD, @SystemDir)
MsgBox(16 + 8192, "Redémarrage en cours ...", "Reboot en cours de : " & $lire)
Répondre