Page 1 sur 1

Trouver l'adresse MAC lors de la connexion

Publié : dim. 03/mai/2009 18:30
par f1roe
Bonjour à tous,

Je cherchais a trouver l'adresse MAC des clients lors de leurs connexions. N'ayant pas d'identifant propre à la connexion et l'adresse IP pouvant changer à chaque connexion, il n'y avait que l'adresse MAC pour l'identification.

Le code ci dessous fonctionne sur linux et windows. toutefois
- la commande ARP sous linux fonctionne uniquement en compte root sur ma config.
- la notation de l'adresse MAC est différente entre les deux systèmes : linux avec séparateur ":" et windows avec séparateur "-".

Code : Tout sélectionner



If InitNetwork() = 0
  PrintN("Impossible d'initialiser le réseau :")
  End
EndIf

Port = 10002
*Buffer = AllocateMemory(1000)
Dim Result$(0)

If CreateNetworkServer(0, Port)
OpenConsole()
 PrintN("PureBasic - Server  Server created (Port "+Str(Port)+")")
    
  Repeat
      
    SEvent = NetworkServerEvent()
  
    If SEvent
    
      ClientID = EventClient()
  
      Select SEvent
      
        Case 1
          PrintN( " Serveur :  Connexion d'un nouveau client !")
          ; Adresse IP du nouveau client
          AdresseIP$ = IPString(GetClientIP(clientID))
          PrintN( AdresseIP$)
          ; Appel de la commande arp 
          adresse = RunProgram("arp", " -a " + AdresseIP$, "", #PB_Program_Open|#PB_Program_Read)
            If adresse
              While ProgramRunning(adresse)
                Sortie$ + ReadProgramString(adresse) + Chr(13)
              Wend
              Sortie$ + Chr(13) + Chr(13)
              Sortie$ + "Code de retour : " + Str(ProgramExitCode(adresse))
            EndIf
          PrintN(sortie$)
          ;Pour extraire l'adresse mac de la chaine retournée par la commande ARP
          ;Attention sous linux ":" et sous windows "-" entre les valeurs de l'adresse mac
          If CreateRegularExpression(1, "[A-Za-z0-9][A-Za-z0-9]:[A-Za-z0-9][A-Za-z0-9]:[A-Za-z0-9][A-Za-z0-9]:[A-Za-z0-9][A-Za-z0-9]:[A-Za-z0-9][A-Za-z0-9]:[A-Za-z0-9][A-Za-z0-9]")
              If  MatchRegularExpression(1, sortie$) ; Will be 1
                  NbFound = ExtractRegularExpression(1, sortie$, Result$())
                  PrintN(Result$(0)) 
                  sortie$=""
              EndIf
          EndIf
  
        Case 4
          ;MessageRequester("PureBasic - Server", "Client "+Str(ClientID)+" has closed the connexion...", 0)
          Quit = 1
    
      EndSelect
    EndIf
    
  Until Quit = 1 
  
  ;MessageRequester("PureBasic - Server", "Click to quit the server.", 0)
  
  CloseNetworkServer(0)
Else
  ;MessageRequester("Error", "Can't create the server (port in use ?).", 0)
EndIf

  
End   

Publié : dim. 03/mai/2009 23:30
par Cls
A noter que l'adresse MAC ne peut être déterminée que sur un réseau local, que ce soit Windows ou Linux ;)

Publié : lun. 04/mai/2009 14:09
par f1roe
Cls a écrit :A noter que l'adresse MAC ne peut être déterminée que sur un réseau local, que ce soit Windows ou Linux ;)
Effectivement ça ne fonctionne pas depuis un réseau extérieur. Pas de change !
Si quelqu'un à une solution, je suis preneur.

Cordialement

Sébastien

Publié : lun. 04/mai/2009 14:16
par Cls
Si j'ai bien compris ton problème, tu souhaites identifier de manière unique une machine se connectant à ton serveur (sur lequel tourne ton appli PB) ?

Je suppose que tu as également codé le client en PB. Tu peux faire envoyer cette adresse MAC à la connexion de ta machine. Le serveur la reçoit, l'analyse puis l'accepte ou non. Je ne sais pas trop ce que tu souhaites faire (authentification d'une machine, sauvegarde persistante des données propres à une machine, etc.) mais il y a forcément une multitude de solutions. ;)

Publié : lun. 04/mai/2009 16:32
par f1roe
Cls a écrit :Si j'ai bien compris ton problème, tu souhaites identifier de manière unique une machine se connectant à ton serveur (sur lequel tourne ton appli PB) ?

Je suppose que tu as également codé le client en PB. Tu peux faire envoyer cette adresse MAC à la connexion de ta machine. Le serveur la reçoit, l'analyse puis l'accepte ou non. Je ne sais pas trop ce que tu souhaites faire (authentification d'une machine, sauvegarde persistante des données propres à une machine, etc.) mais il y a forcément une multitude de solutions. ;)
Je n'ai pas d'ordi en face mais un convertisseur série/Ethernet qui assure la connexion sans plus. Je vais demander au constructeur du périphérique série s'il est possible d'implanter un numéro distinctif, le serveur se chargent à la connexion de faire la demande de ce numéro.
Pour le moment je n'ai pas d'autre idée.
Merci pour l'aide.

Cordialement

Publié : lun. 04/mai/2009 19:17
par Progi1984
J'ai trouvé une URL pour trouver l'adresse MAC du poste : http://support.microsoft.com/kb/118623

Publié : lun. 04/mai/2009 19:59
par Le psychopathe
Pourquoi tu codes pas la prise de l'adresse mac dans le client et non le serveur.
Avec un runprogram ipconfig /all

Un peu dans le style de ce program :

Code : Tout sélectionner

EnableExplicit 
Define ping.l = RunProgram("ping", "127.0.0.1", "", #PB_Program_Open|#PB_Program_Read) 
Define Output.s = "" 
If ping 
  While ProgramRunning(ping) 
    Output = ReadProgramString(ping) 
    If FindString(Output,"Paq",1) 
     Break 
    EndIf 
  Wend 
  CloseProgram(ping) 
  MessageRequester("ping", Output) 
EndIf
Voir de créer ton fichier temps comme ceci :
ipconfig /all >c:\result.txt
après tu lis le fichier ;)
Voilà voilà, cela fonctionne j'ai déjà testé ;)

Publié : lun. 04/mai/2009 22:02
par f1roe
C'est que le client n'est pas un ordinateur mais un simple convertisseur série/Ethernet ! qui fonctionne en client ou en serveur suivant le besoin. Dans mon cas le port com1 est configuré en serveur et le com2 en client... voir cette doc :

http://www.lantronix.com/device-network ... s2100.html

Cordialement
Sébastien
Le psychopathe a écrit :Pourquoi tu codes pas la prise de l'adresse mac dans le client et non le serveur.
Avec un runprogram ipconfig /all

Un peu dans le style de ce program :

Code : Tout sélectionner

EnableExplicit 
Define ping.l = RunProgram("ping", "127.0.0.1", "", #PB_Program_Open|#PB_Program_Read) 
Define Output.s = "" 
If ping 
  While ProgramRunning(ping) 
    Output = ReadProgramString(ping) 
    If FindString(Output,"Paq",1) 
     Break 
    EndIf 
  Wend 
  CloseProgram(ping) 
  MessageRequester("ping", Output) 
EndIf
Voir de créer ton fichier temps comme ceci :
ipconfig /all >c:\result.txt
après tu lis le fichier ;)
Voilà voilà, cela fonctionne j'ai déjà testé ;)

Publié : mar. 05/mai/2009 19:10
par Cls
Progi1984 a écrit :J'ai trouvé une URL pour trouver l'adresse MAC du poste : http://support.microsoft.com/kb/118623
Le problème c'est que ça ne marche qu'en local via NetBIOS (réseau Microsoft).
C'est que le client n'est pas un ordinateur mais un simple convertisseur série/Ethernet !
Comme tu n'as pas de client programmé en face, il n'y a pas beaucoup de solutions :( Si aucun numéro unique n'est implémenté dans leur boîtier, je crains que ça ne soit pas possible..

Publié : mar. 05/mai/2009 19:41
par Progi1984

Publié : mer. 06/mai/2009 9:12
par f1roe
J'avais commencé à regardé de ce coté. Mes connaissances en C n'étant top, as-tu la possiblité de convertir l'exemple qui se trouve dans ce lien ?

http://www.linuxquestions.org/questions ... m-c-38217/

Il y a aussi sur le forum anglais un exemple :
http://www.purebasic.fr/english/viewtop ... octl+linux

Cordialement

Sébastien