#Region ;**** Directives created by AutoIt3Wrapper_GUI **** #AutoIt3Wrapper_outfile=wol_autoit_txt.exe #EndRegion ;**** Directives created by AutoIt3Wrapper_GUI **** #include #include #include #include #include #include #include #Include #Include #include #include #include ;Création du fichier wol.txt If not FileExists(@ScriptDir & "\wol.txt") Then $filewol= FileOpen(@ScriptDir & "\wol.txt", 10) FileClose($filewol) EndIf ;Récupération Mac adresse de la carte connexion au réseau local par WMI $objWMIService = ObjGet("winmgmts:\\" & @ComputerName & "\root\CIMV2") $colItems = $objWMIService.ExecQuery( "SELECT * FROM Win32_NetworkAdapter where NetConnectionID = 'Connexion au réseau local'") For $objItem in $colItems $mac = $objItem.MACAddress $etat = $objItem.NetConnectionStatus Next ;Requete afin de récupérer le masque de sous réseau de la carte connexion au réseau local par WMI $objWMIService = ObjGet("winmgmts:\\" & @ComputerName & "\root\cimv2") $colNetAdapters = $objWMIService.ExecQuery("Select * from Win32_NetworkAdapterConfiguration where IPEnabled=TRUE and MACAddress = '" & $mac & "'") Dim $tab[2] For $objItem in $colNetAdapters $tab = $objItem.IPSubnet $DefaultIPGateway = $objItem.DefaultIPGateway Next $pas =_ArrayToString($tab, ",") $passerelle = _ArrayToString($DefaultIPGateway, ",") ;Recherce du caractère "," utilisé dans windows vista ex: 255.255.255.0,64 sous xp ilya seulement 255.255.255.0 $pos = StringInStr($pas, ",") if $pos <> 0 then ;si caractère trouvé extraction du masque de sous réseau $pas = StringLeft($pas, $pos - 1) EndIf ;Masque de sous réseau $arrSubnetMask = StringSplit($pas, ".") $arrpasserelle = StringSplit($passerelle, ".") If IsArray($arrSubnetMask) <> 1 Then Exit EndIf $arrIPAddress = StringSplit(@IPAddress1, ".") If $arrSubnetMask[1] = 255 Then $strBroadcastIP = $arrIPAddress[1] Else $strBroadcastIP = 255 - $arrSubnetMask[1] EndIf if $etat <> 7 Then For $i = 2 To 4 If $arrSubnetMask[$i] = 255 Then $strBroadcastIP = $strBroadcastIP & "." & $arrIPAddress[$i] ElseIf $arrSubnetMask[$i] < 255 And $arrSubnetMask[$i] > 0 Then $diff = 255 - $arrSubnetMask[$i] $broad = $diff + $arrpasserelle[$i] $strBroadcastIP = $strBroadcastIP & "." & $broad Else $strBroadcastIP = $strBroadcastIP & "." & 255 - $arrSubnetMask[$i] EndIf Next $presencereseau = 1 Else $presencereseau = 0 EndIf if $presencereseau = 0 Then MsgBox(16,"Message important","ATTENTION votre poste n'est pas connecté au réseau") Endif $frmwol = GUICreate("Wake on Lan", 800, 600) GUISetFont(10, 400, 0, "Tahoma") $listwake = GUICtrlCreateListView("NetBios | IP | Mac | En ligne", 16, 25, 640, 515, -1, BitOR($WS_EX_DLGMODALFRAME, $WS_EX_CLIENTEDGE)); Définition des entêtes de colonnes ;Définition de la largeur des colonnes GUICtrlSendMsg(-1, $LVM_SETCOLUMNWIDTH, 0, 150) GUICtrlSendMsg(-1, $LVM_SETCOLUMNWIDTH, 1, 150) GUICtrlSendMsg(-1, $LVM_SETCOLUMNWIDTH, 2, 160) GUICtrlSendMsg(-1, $LVM_SETCOLUMNWIDTH, 3, 120) $lblinfo = GUICtrlCreateLabel("Veuillez patienter pendant la mise à jour de la liste SVP!", 16, 2, 640, 20, $SS_CENTER) $cmdOK = GUICtrlCreateButton("Réveil", 670, 40, 120, 40, BitOR($WS_GROUP, $BS_DEFPUSHBUTTON)) GUICtrlSetFont(-1, 11, 400, 0, "Tahoma") if $presencereseau = 0 Then GUICtrlSetState(-1, $GUI_DISABLE) EndIf $cmdping = GUICtrlCreateButton("Ping", 670, 80, 120, 40, $WS_GROUP) GUICtrlSetFont(-1, 11, 400, 0, "Tahoma") if $presencereseau = 0 Then GUICtrlSetState(-1, $GUI_DISABLE) EndIf $cmdnbtstat = GUICtrlCreateButton("Nbtstat", 670, 120, 120, 40, $WS_GROUP) GUICtrlSetFont(-1, 11, 400, 0, "Tahoma") if $presencereseau = 0 Then GUICtrlSetState(-1, $GUI_DISABLE) EndIf $cmdarret = GUICtrlCreateButton("Arrêter...", 670, 160, 120, 40, $WS_GROUP) GUICtrlSetFont(-1, 11, 400, 0, "Tahoma") if $presencereseau = 0 Then GUICtrlSetState(-1, $GUI_DISABLE) EndIf $cmdactualiser = GUICtrlCreateButton("Actualiser", 670, 200, 120, 40, $WS_GROUP) GUICtrlSetFont(-1, 11, 400, 0, "Tahoma") if $presencereseau = 0 Then GUICtrlSetState(-1, $GUI_DISABLE) EndIf $cmdScanner = GUICtrlCreateButton("Scanner... ", 250, 544, 150, 25, $WS_GROUP) GUICtrlSetFont(-1, 11, 400, 0, "Tahoma") if $presencereseau = 0 Then GUICtrlSetState(-1, $GUI_DISABLE) EndIf $cmdAjout = GUICtrlCreateButton("Ajouter...", 90, 572, 150, 25, $WS_GROUP) GUICtrlSetFont(-1, 11, 400, 0, "Tahoma") $cmdModif = GUICtrlCreateButton("Modifier... ", 250, 572, 150, 25, $WS_GROUP) GUICtrlSetFont(-1, 11, 400, 0, "Tahoma") $cmdSuppr = GUICtrlCreateButton("Supprimer", 410, 572, 150, 25, $WS_GROUP) GUICtrlSetFont(-1, 11, 400, 0, "Tahoma") $cmdfermer = GUICtrlCreateButton("Fermer", 685, 550, 109, 40, $WS_GROUP) GUICtrlSetFont(-1, 11, 400, 0, "Tahoma") GUICtrlSetState($listwake, $GUI_FOCUS) GUISetState(@SW_SHOW) _GUICtrlListView_RegisterSortCallBack($listwake) ;Appel de la fonction de remplissage de la listview RempliListe() While 1 $nMsg = GUIGetMsg() Switch $nMsg Case $GUI_EVENT_CLOSE Exit Case $cmdfermer Exit Case $listwake _GUICtrlListView_SortItems($listwake, GUICtrlGetState($listwake)) Case $cmdOK ;Bouton d'envoi du réveil ;Lecture du nom netbios de la listview $str = GUICtrlRead(GUICtrlRead($listwake)) $val2 = StringInStr($str, "|", 0, 1) $Netbiosname = Stringleft($str, $val2 - 1) if $Netbiosname = "" Then ;Si aucune ligne de la listview sélectionnée Msgbox (4096 + 16, "Message important", "Veuillez choisir un poste à démarrer SVP!") Else $wol = FileOpen(@ScriptDir & "\wol.txt", 0) While 1 $ligne = FileReadLine($wol) If @error = -1 Then ExitLoop $arrwol = _StringExplode($ligne, ",", 2) For $i = 0 to 2 $Netbios = $arrwol[0] $MACAddresse = $arrwol[1] $IPAddress = $arrwol[2] next if $Netbios = $Netbiosname Then $MACAddress = $MACAddresse $ip = $IPAddress ExitLoop Endif $Netbios = "" $MACAddresse = "" $IPAddress = "" Wend FileClose($wol) ;Mise en forme de l'adresse MAC $MACAddress = StringReplace($MACAddress, ":", "") $MACAddress = StringReplace($MACAddress, "-", "") UDPStartUp() $connexion = UDPOpen($strBroadcastIP, 7) $res = UDPSend($connexion, GenerateMagicPacket($MACAddress)) MsgBox(4096 + 64, "Réveil initié", "Le réveil de " & $Netbiosname & " a été initié sur la Mac Adresse " & StringUpper($MACAddress)) UDPCloseSocket($connexion) UDPShutdown() Run ("cmd") sleep(500) Send ("ping " & $ip & " -t {ENTER}") EndIf Case $cmdModif ;Lecture du nom netbios dans la listview $modif = _GUICtrlListView_GetItemTextString($listwake, -1) ;Recherche de la position de la première instance du caractère "|" dans la ligne issue de la listview $val2 = StringInStr($modif, "|", 0, 1) ;Extraction de la ligne de la listview du Nom Netbios moyennant la position de la première instance du caractère "|" $modifnetbios = Stringleft($modif, $val2 - 1) ;Recherche de la position de la deuxième instance du caractère "|" dans la ligne issue de la listview $val4 = StringInStr($modif, "|", 0, 2) ;Extraction de la ligne de la listview de l'adresse ip en partant du caractére suivant la 1ère instance de "|" ;en comptant un nombre de caractères égal à la position de la deuxième instance de "|" moins la position de la première instance de "|" moins 1 caractère $modifip = StringMid($modif, $val2 + 1, ($val4 - $val2) - 1) $val6 = StringInStr($modif, "|", 0, 3) ;Extraction de la ligne de la listview de l'adresse mac en partant du caractére suivant la 2ème instance de "|" ;en comptant un nombre de caractères égal à la position de la 3ème instance de "|" moins la position de la 2ème instance de "|" moins 1 caractère $modif_mac = StringMid($modif, $val4 + 1, ($val6 - $val4) - 1) if $modifnetbios <> "" Then ;Si une ligne a été sélectionnée Ajout($modifnetbios, $modif_mac, $modifip) ;Appel de la fonction qui ouvrira le formulaire de saisie Else ;Si aucune ligne sélectionnée Msgbox (4096 + 16, "Message important", "Veuillez choisir un poste à modifier SVP!") EndIf Case $cmdAjout Ajout("ajout", "", "") Case $cmdScanner Scan() Case $cmdactualiser RempliListe() Case $cmdarret ;Lecture du nom netbios dans la listview $Netbiosname = _GUICtrlListView_GetItemTextString($listwake, -1) $val2 = StringInStr($Netbiosname, "|", 0, 1) $Netbiosname = Stringleft($Netbiosname, $val2 - 1) if $Netbiosname <> "" Then ;Si une ligne a été sélectionnée Arret($Netbiosname) ;Appel de la fonction qui arrêtera le poste Else ;Si aucune ligne sélectionnée Msgbox (4096 + 16, "Message important", "Veuillez choisir un poste à arrêter SVP!") EndIf Case $cmdSuppr ;Lecture du nom netbios dans la listview $supprim = _GUICtrlListView_GetItemTextString($listwake, -1) $val2 = StringInStr($supprim, "|", 0, 1) $suppr = Stringleft($supprim, $val2 - 1) $val4 = StringInStr($supprim, "|", 0, 2) ;Extraction de la ligne de la listview de l'adresse ip en partant du caractére suivant la 1ère instance de "|" ;en comptant un nombre de caractères égal à la position de la deuxième instance de "|" moins la position de la première instance de "|" moins 1 caractère $supprip = StringMid($supprim, $val2 + 1, ($val4 - $val2) - 1) if $suppr <> "" Then ;Si une ligne a été sélectionnée Supprime($suppr, $supprip) ;Appel de la fonction qui supprimera les données Else ;Si aucune ligne sélectionnée Msgbox (4096 + 16, "Message important", "Veuillez choisir un poste à supprimer SVP!") EndIf case $cmdping ;Lecture du nom netbios de la listview $str = GUICtrlRead(GUICtrlRead($listwake)) $val2 = StringInStr($str, "|", 0, 1) $Netbiosname = Stringleft($str, $val2 - 1) if $Netbiosname = "" Then ;Si aucune ligne de la listview sélectionnée Msgbox (4096 + 16, "Message important", "Veuillez choisir un poste à pinguer!") Else $wol = FileOpen(@ScriptDir & "\wol.txt", 0) ;Afin de récupérer l'adresse ip du poste lecture des lignes du fichier wol.txt While 1 $ligne = FileReadLine($wol) If @error = -1 Then ExitLoop $arrwol = _StringExplode($ligne, ",", 2) ;Attribution des valeurs lues dans le fichier à une variable For $i = 0 to 2 $Netbios = $arrwol[0] $MACAddresse = $arrwol[1] $IPAddress = $arrwol[2] next ;Si le nom Netbios extrait du fichier text correspond à la valeur lue de la listview if $Netbios = $Netbiosname Then $ip = $IPAddress ; On récupère l'adresse ip ExitLoop ; et on sort de la boucle Endif ;Réinitialisation des variables $Netbios = "" $MACAddresse = "" $IPAddress = "" Wend FileClose($wol) Run ("cmd") sleep(500) Send ("ping " & $ip & " -t {ENTER}") EndIf case $cmdnbtstat ;Lecture du nom netbios de la listview $str = GUICtrlRead(GUICtrlRead($listwake)) $val2 = StringInStr($str, "|", 0, 1) $Netbiosname = Stringleft($str, $val2 - 1) if $Netbiosname = "" Then ;Si aucune ligne de la listview sélectionnée Msgbox (4096 + 16, "Message important", "Veuillez choisir un poste pour effectuer le Nbtstat!") Else $wol = FileOpen(@ScriptDir & "\wol.txt", 0) ;Afin de récupérer l'adresse ip du poste lecture des lignes du fichier wol.txt While 1 $ligne = FileReadLine($wol) If @error = -1 Then ExitLoop $arrwol = _StringExplode($ligne, ",", 2) ;Attribution des valeurs lues dans le fichier à une variable For $i = 0 to 2 $Netbios = $arrwol[0] $MACAddresse = $arrwol[1] $IPAddress = $arrwol[2] next ;Si le nom Netbios extrait du fichier text correspond à la valeur lue de la listview if $Netbios = $Netbiosname Then $ip = $IPAddress ; On récupère l'adresse ip ExitLoop ; et on sort de la boucle Endif ;Réinitialisation des variables $Netbios = "" $MACAddresse = "" $IPAddress = "" Wend FileClose($wol) Run ("cmd") sleep(500) Send ("nbtstat -a " & $ip & " {ENTER}") EndIf EndSwitch WEnd ;################################################################################# ; Fonctions ;################################################################################# ; This function convert a MAC Address Byte (e.g. "1f") to a char Func HexToChar($strHex) Return Chr(Dec($strHex)) EndFunc ;################################################################################# ; This function generate the "Magic Packet" Func GenerateMagicPacket($strMACAddress) $MagicPacket = "" $MACData = "" For $p = 1 To 11 Step 2 $MACData = $MACData & HexToChar(StringMid($strMACAddress, $p, 2)) Next For $p = 1 To 6 $MagicPacket = HexToChar("ff") & $MagicPacket Next For $p = 1 To 16 $MagicPacket = $MagicPacket & $MACData Next Return $MagicPacket EndFunc ;################################################################################# Func Ajout($modifnetbios, $modif_mac, $modifip) if $modifnetbios <> "ajout" Then $Netbiosname = $modifnetbios $IPAddresse = $modifip $MACAddress = $modif_mac EndIf if $modifnetbios = "ajout" then $frmNPoste = GUICreate("Nouveau poste", 496, 150) GUISetFont(10, 400, 0, "Tahoma") Else $frmNPoste = GUICreate("Modifier le poste " & $Netbiosname, 496, 150) GUISetFont(10, 400, 0, "Tahoma") EndIf if $modifnetbios = "ajout" then $InNetbios = GUICtrlCreateInput("", 152, 20, 181, 24) Else $InNetbios = GUICtrlCreateInput(StringUpper($Netbiosname), 152, 20, 181, 24) EndIf $IPAddress = _GUICtrlIpAddress_Create($frmNPoste, 152, 52, 177, 25) if $modifnetbios = "ajout" then _GUICtrlIpAddress_Set($IPAddress, "0.0.0.0") Else _GUICtrlIpAddress_Set($IPAddress, $IPAddresse) EndIf if $modifnetbios = "ajout" then $InMAc = GUICtrlCreateInput("", 152, 88, 189, 24) Else $InMAc = GUICtrlCreateInput(StringUpper($MACAddress), 152, 88, 189, 24) EndIf $lblNetbios = GUICtrlCreateLabel("Netbios:", 24, 24, 123, 20, $SS_RIGHT) $lblIP = GUICtrlCreateLabel("IP:", 24, 56, 123, 20, $SS_RIGHT) $lblmac = GUICtrlCreateLabel("MAC Adresse:", 24, 92, 123, 20, $SS_RIGHT) $cmdOK2 = GUICtrlCreateButton("OK", 376, 20, 101, 41, $WS_GROUP) $cmdAnnuler = GUICtrlCreateButton("Annuler", 376, 68, 101, 41, $WS_GROUP) GUISetState(@SW_SHOW) While 1 $nMsg2 = GUIGetMsg() Select Case $nMsg2 = $GUI_EVENT_CLOSE if WinActive("Nouveau poste") Then GUIDelete($frmNPoste) ExitLoop Elseif WinActive("Modifier le poste " & $Netbiosname) Then GUIDelete($frmNPoste) ExitLoop EndIf Case $nMsg2 = $cmdAnnuler if WinActive("Nouveau poste") Then GUIDelete($frmNPoste) ExitLoop Elseif WinActive("Modifier le poste " & $Netbiosname) Then GUIDelete($frmNPoste) ExitLoop EndIf Case $nMsg2 = $cmdOK2 if $modifnetbios = "ajout" Then ;Si ajout d'un nouvel enregistrement $wol = FileOpen(@ScriptDir & "\wol.txt", 0) $n = FileSetPos($wol, 0, $FILE_END) ;Positionnement à la fin du fichier $nb = FileGetPos($wol) ;Position de la fin du fichier FileClose($wol) if $nb <> 0 then ;Si position de la fin du fichier différent de 0 le fichier contient des données $wol = FileOpen(@ScriptDir & "\wol.txt", 1) ;Ajout des données recueillies à la suite des données existantes Else ;Sinon le fichier est vide $wol = FileOpen(@ScriptDir & "\wol.txt", 2) EndIf $ligne = StringUpper(GUICtrlRead($InNetbios)) & "," & StringUpper(GUICtrlRead($InMAc)) & "," & _GUICtrlIpAddress_Get($IPAddress) FileWriteLine($wol, $ligne) FileClose($wol) Else $wol = FileOpen(@ScriptDir & "\wol.txt", 0) ; Vérification de la disponibilité du fichier If $wol = -1 Then Exit EndIf $i = _FileCountLines(@ScriptDir & "\wol.txt") local $Arrlu[$i] ;Déclaration du tableau avec le nombre de lignes ;Stockage dans un tableau des infos lues dans le fichier For $j = 0 to ($i - 1) $line = FileReadLine($wol, $j + 1) $Arrlu[$j] = $line NExt FileClose($wol) ;Fermeture du fichier ;Ouverture du fichier avec effacement des données précédentes $wol = FileOpen(@ScriptDir & "\wol.txt", 2) For $k = 0 to UBound($Arrlu) - 1 $arrwol = _StringExplode($Arrlu[$k], ",", 2) ;Récupération des infos contenues dans la ligne dans un tableau if $arrwol[2] = $modifip Then;Si la ligne en cours contient le nom netbios du formulaire de saisie ;On écrit dans le fichier lles données du formulaire de saisie $ligne = StringUpper(GUICtrlRead($InNetbios)) & "," & StringUpper(GUICtrlRead($InMAc)) & "," & _GUICtrlIpAddress_Get($IPAddress) FileWriteLine($wol, $ligne) Else ;Sinon on réécrit les données du tableau récupérées en lisant le fichier existant FileWriteLine($wol, $Arrlu[$k]) EndIf Next FileClose($wol) ;Fermeture du fichier EndIf Sleep(500) RempliListe() Sleep(500) GUIDelete($frmNPoste) ExitLoop EndSelect WEnd EndFunc ;################################################################################# Func Scan() $arrIPPoste = StringSplit(@IPAddress1, ".") $IPDebut = $arrIPPoste[1] & "." & $arrIPPoste[2] & "." & $arrIPPoste[3] & ".1" $IPFin = $arrIPPoste[1] & "." & $arrIPPoste[2] & "." & $arrIPPoste[3] & ".255" $frmScan = GUICreate("Scanner la plage", 640, 520) GUISetFont(10, 400, 0, "Tahoma") $IPAddress1 = _GUICtrlIpAddress_Create($frmScan, 210, 10, 177, 25) _GUICtrlIpAddress_Set($IPAddress1, $IPDebut) $IPAddress2 = _GUICtrlIpAddress_Create($frmScan, 210, 40, 177, 25) _GUICtrlIpAddress_Set($IPAddress2, $IPFin) $listscan = GUICtrlCreateListView("NetBios | IP | Mac", 20, 100, 500, 380, -1, BitOR($WS_EX_DLGMODALFRAME, $WS_EX_CLIENTEDGE)); Définition des entêtes de colonnes ;Définition de la largeur des colonnes GUICtrlSendMsg(-1, $LVM_SETCOLUMNWIDTH, 0, 140) GUICtrlSendMsg(-1, $LVM_SETCOLUMNWIDTH, 1, 140) GUICtrlSendMsg(-1, $LVM_SETCOLUMNWIDTH, 2, 180) $lblIPAddress1 = GUICtrlCreateLabel("Adresse de début:", 50, 14, 155, 20, $SS_RIGHT) $lblIPAddress2 = GUICtrlCreateLabel("Adresse de fin:", 50, 44, 155, 20, $SS_RIGHT) $lblIPAddress3 = GUICtrlCreateLabel("", 50, 74, 155, 20, $SS_RIGHT) $lblIPAddress4 = GUICtrlCreateLabel("", 210, 74, 155, 20) GUICtrlSetFont(-1, 10, 800) GUICtrlSetColor(-1, 0xff0000) $cmdScan = GUICtrlCreateButton("Scanner", 530, 20, 101, 41, $WS_GROUP) $cmdAjouter = GUICtrlCreateButton("Ajouter à la liste", 220, 485, 140, 30, $WS_GROUP) $cmdAnnuler3 = GUICtrlCreateButton("Annuler", 530, 68, 101, 41, $WS_GROUP) GUICtrlSetState($cmdAjouter, $GUI_HIDE) GUISetState(@SW_SHOW) While 1 $nMsg3 = GUIGetMsg() Select Case $nMsg3 = $GUI_EVENT_CLOSE if WinActive("Scanner la plage") Then GUIDelete($frmScan) ExitLoop EndIf Case $nMsg3 = $cmdAnnuler3 if WinActive("Scanner la plage") Then GUIDelete($frmScan) ExitLoop EndIf Case $nMsg3 = $cmdScan ;Création du fichier qui contiendra le résultat du scan If not FileExists(@ScriptDir & "\scan.txt") Then $filescan = FileOpen(@ScriptDir & "\scan.txt", 10) FileClose($filescan) Else FileDelete(@ScriptDir & "\scan.txt") $filescan = FileOpen(@ScriptDir & "\scan.txt", 10) FileClose($filescan) EndIf $IPDebut = _GUICtrlIpAddress_Get($IPAddress1) $IPFin = _GUICtrlIpAddress_Get($IPAddress2) $arrIPDebut = StringSplit($IPDebut, ".") $arrIPFin = StringSplit($IPFin, ".") $3octetDebut = $arrIPDebut[3] $3octetFin = $arrIPFin[3] $4octetDebut = $arrIPDebut[4] $4octetFin = $arrIPFin[4] For $s = $3octetDebut to $3octetFin For $i = $4octetDebut to $4octetFin $adr = $arrIPDebut[1] & "." & $arrIPDebut[2] & "." & $s & "." & $i GUICtrlSetData($lblIPAddress3, "Adresse scannée:") GUICtrlSetData($lblIPAddress4, $adr) $var = Ping($adr,250) if $var Then ;si réponse au ping $WshShell = ObjCreate("Wscript.shell") $Commnbtsat = "cmd /c nbtstat.exe -a " & $adr & " | find /I ""<00> UNIQUE""" ;exécution de la ligne de commande de nbtstat $Resnbtsat = $WshShell.Run($Commnbtsat, 0, TRUE) ;Exécution nbtsat if $Resnbtsat = 0 then ;Si réponse au nbtstat If FileExists(@ScriptDir & "\result.txt") Then FileDelete(@ScriptDir & "\result.txt") EndIf $fileresult = FileOpen(@ScriptDir & "\result.txt", 10) FileClose($fileresult) $Commnbtsatfic = "cmd /c nbtstat.exe -a " & $adr & " >""" & @ScriptDir & """\result.txt" ;Ligne de commande avec résultat du Nbtstat dans un fichier $ResCommnbtsatfic = $WshShell.Run($Commnbtsatfic, 0, TRUE) ;Exécution de la ligne de commande $nbtstat = FileOpen(@ScriptDir & "\result.txt", 0) ; Vérification de la disponibilité du fichier If $nbtstat = -1 Then Exit EndIf $h = _FileCountLines(@ScriptDir & "\result.txt") local $Arrnbtstat[$h] ;Déclaration du tableau avec le nombre de lignes ;Stockage dans un tableau des infos lues dans le fichier result.txt For $j = 0 to ($h - 1) $lignenbtstat = FileReadLine($nbtstat, $j + 1) $Arrnbtstat[$j] = $lignenbtstat NExt For $k = 0 to UBound($Arrnbtstat) - 1 ;Recherche de la ligne Adresse Mac if StringMid($Arrnbtstat[$k],5,7) = "Adresse" then ;Lecture de la ligne $Adrmac = StringMid($Arrnbtstat[$k],19,17) EndIf ;Recherche de la ligne <00> UNIQUE if StringMid($Arrnbtstat[$k],20,12) = "<00> UNIQUE" then ;Lecture de la ligne $pos = StringInStr($Arrnbtstat[$k], "<",0,1) $Net = Stringleft($Arrnbtstat[$k], $pos - 1) $Netbiosname = StringStripWS($Net, 3) endif Next FileClose($nbtstat) ;Fermeture du fichier ;Affichage dans la listview du scan GUICtrlCreateListViewItem($Netbiosname & "|" & $adr & "|" & $Adrmac, $listscan) $filescan = FileOpen(@ScriptDir & "\scan.txt", 1) ;On écrit dans le fichier les données du scan $lignescan = StringUpper($Netbiosname) & "," & StringUpper($Adrmac) & "," & $adr FileWriteLine($filescan, $lignescan) FileClose($filescan) ;Fermeture du fichier Else ;Affichage dans la listview du scan GUICtrlCreateListViewItem("Nom inconnu |" & $adr & "| ", $listscan) $filescan = FileOpen(@ScriptDir & "\scan.txt", 1) ;On écrit dans le fichier les données du scan $lignescan = "Nom inconnu, ," & $adr FileWriteLine($filescan, $lignescan) FileClose($filescan) ;Fermeture du fichier EndIf EndIf $adr = "" $Netbiosname = "" $Adrmac = "" Next $i = 0 Next GUICtrlSetData($lblIPAddress4, "Fin du scan!") GUICtrlSetState($cmdAjouter, $GUI_SHOW) Case $nMsg3 = $cmdAjouter ;Ajout des données du scan au fichier existant ;Ouverture du fichier wol.txt $wol = FileOpen(@ScriptDir & "\wol.txt", 0) ; Vérification de la disponibilité du fichier If $wol = -1 Then Exit EndIf $i = _FileCountLines(@ScriptDir & "\wol.txt") if $i <> 0 Then local $Arrlu[$i] ;Déclaration du tableau avec le nombre de lignes Endif ;Stockage dans un tableau des infos lues dans le fichier wol.txt For $j = 0 to ($i - 1) $line = FileReadLine($wol, $j + 1) $Arrlu[$j] = $line NExt FileClose($wol) ;Fermeture du fichier ;Ouverture du fichier scan.txt $filescan = FileOpen(@ScriptDir & "\scan.txt", 0) ; Vérification de la disponibilité du fichier If $filescan = -1 Then Exit EndIf $l = _FileCountLines(@ScriptDir & "\scan.txt") if $l <> 0 Then local $Arrluscan[$l] ;Déclaration du tableau avec le nombre de lignes ;Stockage dans un tableau des infos lues dans le fichier du scan dans le tableau $Arrluscan For $m = 0 to ($l - 1) $linescan = FileReadLine($filescan, $m + 1) $Arrluscan[$m] = $linescan NExt FileClose($filescan) ;Fermeture du fichier EndIf ;Ouverture du fichier wol.txt avec effacement des données précédentes $wol = FileOpen(@ScriptDir & "\wol.txt", 2) if $i = 0 then ;Si le fichier wol.txt est vide For $m = 0 to UBound($Arrluscan) - 1 ;On écrit dans le fichier toutes les données issues du scan FileWriteLine($wol, $Arrluscan[$m]) Next Else For $m = 0 to UBound($Arrluscan) - 1 $arrfilescan = _StringExplode($Arrluscan[$m], ",", 2) ;Intégration des infos contenues dans la ligne du scan dans un tableau ;$Netbiosnamescan = $arrfilescan[0] ;Nom netbios scanné $Ipscan = $arrfilescan[2] ;$Trouve = _ArraySearch($Arrlu, $Netbiosnamescan, 0, 0, 0, 1) ;Recherche du Nom Netbios dans le tableau $Trouve = _ArraySearch($Arrlu, $Ipscan, 0, 0, 0, 1) ;Recherche du Nom Netbios dans le tableau ;Si le nom Netbios est trouvé, on écrit les données scannées à la place de celles lues. if $Trouve >= 0 Then FileWriteLine($wol, $Arrluscan[$m]) Else FileWriteLine($wol, $Arrluscan[$m]) EndIf $Netbiosnamescan = "" Next For $n = 0 to UBound($Arrlu) - 1 ;Lecture du tableau du fichier wol.txt $arrfile = _StringExplode($Arrlu[$n], ",", 2) ;Intégration des infos contenues dans la ligne du scan dans un tableau $Netbiosname = $arrfile[0] ;Nom netbios du fichier wol.txt $Trouve2 = _ArraySearch($Arrluscan, $Netbiosname, 0, 0, 0, 1) ;Recherche du Nom Netbios dans le tableau du scan ;Si le nom Netbios n'est pas trouvé, on réécrit les données du fichier wol.txt if $Trouve2 = -1 Then FileWriteLine($wol, $Arrlu[$n]) EndIf $Netbiosnamescan = "" Next EndIf FileClose($wol) ;Fermeture du fichier wol.txt Sleep(500) RempliListe() Sleep(500) GUIDelete($frmScan) ExitLoop EndSelect WEnd EndFunc ;################################################################################# Func Arret($Netbiosname) $frmScan = GUICreate("Arrêt du poste " & $Netbiosname, 510, 180) GUISetFont(10, 400, 0, "Tahoma") GUIStartGroup() $Arreter = GUICtrlCreateRadio("Mettre le poste hors tension", 110, 10, 200, 20) $Reboot = GUICtrlCreateRadio("Redémarrer le poste", 110, 40, 200, 20) GUICtrlSetState($Arreter, $GUI_CHECKED) $ctrltimer = GUICtrlCreateInput("15", 110, 70, 50, 20) $updown = GUICtrlCreateUpdown($ctrltimer) $commentaire = GUICtrlCreateEdit("", 110, 100, 280, 50, $ES_AUTOVSCROLL) $lbltimer = GUICtrlCreateLabel("Délai:", 15, 74, 90, 20, $SS_RIGHT) $lblcommentaire = GUICtrlCreateLabel("Commentaire:", 15, 104, 90, 20, $SS_RIGHT) $cmdGo = GUICtrlCreateButton("Go", 400, 20, 101, 41, BitOR($WS_GROUP, $BS_DEFPUSHBUTTON)) $cmdAnnuler3 = GUICtrlCreateButton("Annuler", 400, 68, 101, 41, $WS_GROUP) GUISetState(@SW_SHOW) While 1 $nMsg3 = GUIGetMsg() Select Case $nMsg3 = $GUI_EVENT_CLOSE if WinActive("Arrêt du poste") Then GUIDelete($frmScan) ExitLoop EndIf Case $nMsg3 = $cmdAnnuler3 if WinActive("Arrêt du poste") Then GUIDelete($frmScan) ExitLoop EndIf Case $nMsg3 = $cmdGo if GUICtrlRead($Arreter) = 1 Then ;Arret choisi $type = "s" Else ;Reboot choisi $type = "r" EndIf $timer = GUICtrlRead($ctrltimer) $WshShell = ObjCreate("Wscript.shell") if GUICtrlRead($commentaire) = "" Then $strShutdown = "shutdown.exe -m \\" & $Netbiosname & " -"& $type & " -t " & $timer & " -f " Else $strShutdown = "shutdown.exe -m \\" & $Netbiosname & " -"& $type & " -c """ & GUICtrlRead($commentaire) & """ -t " & $timer & " -f" EndIf $Rescomm = $WshShell.Run($strShutdown, 0, TRUE) ;Exécution de la ligne de commande if $Rescomm = 0 Then if $type = "s" Then MsgBox(64,"Message de confirmation","La commande d'arrêt a bien été envoyée au poste " & $Netbiosname) Else MsgBox(64,"Message de confirmation","La commande de redémarrage a bien été envoyée au poste " & $Netbiosname) EndIf Else MsgBox(16,"Message important","Une erreur est survenue lors de l'envoi de lacommande Shutdown au poste " & $Netbiosname) EndIf EndSelect WEnd EndFunc ;################################################################################# Func RempliListe() GUICtrlSetData($lblinfo, "Veuillez patienter pendant la mise à jour de la liste SVP!") GUICtrlSetFont($lblinfo, 11, 600, 0, "Tahoma") GUICtrlSetColor($lblinfo, 0xff0000) _GUICtrlListView_DeleteAllItems($listwake) ;Effacement de la listview $wol = FileOpen(@ScriptDir & "\wol.txt", 0) While 1 $ligne = FileReadLine($wol) If @error = -1 Then ExitLoop if $ligne <> "" Then $arrwol = _StringExplode($ligne, ",", 2) For $i = 0 to 2 $Netbios = $arrwol[0] $MACAddresse = $arrwol[1] $IPAddress = $arrwol[2] next $var = Ping($IPAddress,250) if $var Then $up = "OUI" Else $up = "NON" Endif GUICtrlCreateListViewItem($Netbios & "|" & $IPAddress & "|" & $MACAddresse & "|" & $up, $listwake) $Netbios = "" $MACAddresse = "" $IPAddress = "" EndIf Wend FileClose($wol) GUICtrlSetData($lblinfo, "Toutes les informations de la liste sont à jour") GUICtrlSetColor($lblinfo, 0x33CC00) Sleep(2000) if $presencereseau = 0 Then GUICtrlSetData($lblinfo, "ATTENTION votre poste n'est pas sur le réseau") GUICtrlSetColor($lblinfo, 0xff0000) EndIf EndFunc ;################################################################################# Func Supprime($suppr, $supprip) if MsgBox (4096 + 16 + 4, "Confirmation de suppression", "Voulez vous vraiment supprimer le poste " & $suppr & " ?") = 6 then $wol = FileOpen(@ScriptDir & "\wol.txt", 0) ; Vérification de la disponibilité du fichier If $wol = -1 Then Exit EndIf $i = _FileCountLines(@ScriptDir & "\wol.txt") local $Arrlu[$i] ;Déclaration du tableau avec le nombre de lignes ;Stockage dans un tableau des infos lues dans le fichier For $j = 0 to ($i - 1) $line = FileReadLine($wol, $j + 1) $Arrlu[$j] = $line NExt FileClose($wol) ;Fermeture du fichier ;Ouverture du fichier avec effacement des données précédentes $wol = FileOpen(@ScriptDir & "\wol.txt", 2) For $k = 0 to UBound($Arrlu) - 1 $arrwol = _StringExplode($Arrlu[$k], ",", 0) ;Récupération des infos contenues dans la ligne dans un tableau if $arrwol[2] <> $supprip Then ;Si la ligne en cours ne contient pas l'adresse ip du poste que l'on veut supprimer ;On réécrit les données du tableau récupérées en lisant le fichier existant FileWriteLine($wol, $Arrlu[$k]) EndIf Next FileClose($wol) ;Fermeture du fichier Sleep(100) RempliListe() ;Rafraichissement de la listview Sleep(100) EndIf EndFunc