Trouver l'adresse MAC lors de la connexion

Codes specifiques à Linux
f1roe
Messages : 34
Inscription : dim. 04/sept./2005 22:10
Localisation : Lyon 3ème

Trouver l'adresse MAC lors de la connexion

Message 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   
Cls
Messages : 620
Inscription : mer. 22/juin/2005 8:51
Localisation : Nantes

Message 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 ;)
f1roe
Messages : 34
Inscription : dim. 04/sept./2005 22:10
Localisation : Lyon 3ème

Message 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
Cls
Messages : 620
Inscription : mer. 22/juin/2005 8:51
Localisation : Nantes

Message 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. ;)
f1roe
Messages : 34
Inscription : dim. 04/sept./2005 22:10
Localisation : Lyon 3ème

Message 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
Avatar de l’utilisateur
Progi1984
Messages : 2659
Inscription : mar. 14/déc./2004 13:56
Localisation : France > Rennes
Contact :

Message par Progi1984 »

J'ai trouvé une URL pour trouver l'adresse MAC du poste : http://support.microsoft.com/kb/118623
Avatar de l’utilisateur
Le psychopathe
Messages : 764
Inscription : jeu. 03/mars/2005 19:23

Message 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é ;)
f1roe
Messages : 34
Inscription : dim. 04/sept./2005 22:10
Localisation : Lyon 3ème

Message 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é ;)
Cls
Messages : 620
Inscription : mer. 22/juin/2005 8:51
Localisation : Nantes

Message 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..
f1roe
Messages : 34
Inscription : dim. 04/sept./2005 22:10
Localisation : Lyon 3ème

Message 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
Répondre