IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Delphi Discussion :

Lister les adresses MAC d'un réseau


Sujet :

Delphi

  1. #1
    Membre à l'essai
    Homme Profil pro
    Analyse système
    Inscrit en
    Août 2015
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Analyse système

    Informations forums :
    Inscription : Août 2015
    Messages : 11
    Points : 12
    Points
    12
    Par défaut Lister les adresses MAC d'un réseau
    Bonjour;

    J'aimerais l'aide de tout le monde afin de corriger ce code, je veux l'adresse Mac d'un ensemble d'ordinateurs de mon réseau dont les uns sont sous l'Unix et les autres sur Win (1------------255 adresse IP). Le code compile mais toutefois dès qu'il rencontre une adresse IP qui n'est pas associée à une machine dans l’intervalle (1---255), le code se plante et s'arrête du coup.

    Je veux votre aide c'est pour un devoir à rendre ce vendredi.

    Merci

    CHARLES

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    unit Unit1;
     
    interface
     
    uses
      Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
      StdCtrls, Buttons;
     
    type
     
        TForm1 = class(TForm)
        MemoMAC: TMemo;
        Edit1: TEdit;
        SpeedButton1: TSpeedButton;
        ListBox1: TListBox;
        procedure SpeedButton1Click(Sender: TObject);
      private
        { Private declarations }
      public
        { Public declarations }
      end;
    function GetMACAdresses(const Adresses:TStrings;const MachineName:string=''):integer;
    function GetMACAdress(const MachineName:string=''):string;
     
     var
      Form1: TForm1;
     
    implementation
     
    {$R *.DFM}
     
    uses
    NB30;
     
    type
     ENetBIOSError=class(Exception);
     
    function NetBiosCheck(const b:char):char;
    begin
      if b<>chr(NRC_GOODRET) then raise ENetBIOSError.create('NetBios error'#13#10'Error code '+inttostr(ord(b)));
      result:=b;
    end;
     
    function AdapterToString(const Adapter:PAdapterStatus):string;
    begin
      with Adapter^ do Result
      :=Format('%2.2x-%2.2x-%2.2x-%2.2x-%2.2x-%2.2x',[Integer(adapter_address[0]),
      Integer(adapter_address[1]),Integer(adapter_address[2]),
      Integer(adapter_address[3]),Integer(adapter_address[4]),
      Integer(adapter_address[5])]);
    end;
     
     
    procedure MachineNameToAdapter(Name:string;var AdapterName:array of char);
    begin
      if Name='' then Name:='*' else Name:=ansiuppercase(Name);
      Name:=Name+StringOfChar(' ',length(AdapterName)-Length(Name));
      move(Name[1],AdapterName[0],length(AdapterName));
    end;
     
     
    function GetMACAdresses(const Adresses:TStrings;const MachineName:string=''):integer;
    var
        i:integer;
        NCB: PNCB;
        Adapter:PAdapterStatus;
        Lenum:PLanaEnum;
        RetCode:char;
    begin
      Adresses.clear;
      New(NCB);
      New(Adapter);
      New(Lenum);
     try
       Fillchar(NCB^,SizeOf(TNCB),0);
       fillchar(Lenum^,SizeOf(TLanaEnum),0);
       NCB.ncb_command:=chr(NCBENUM);
       NCB.ncb_buffer:=Pointer(Lenum);
       NCB.ncb_length:=SizeOf(Lenum^);
       NetBiosCheck(Netbios(NCB));
       result:=ord(Lenum.Length);
     
       for i:=0 to result-1 do
       begin
         Fillchar(NCB^,SizeOf(TNCB),0);
         Ncb.ncb_command:=chr(NCBRESET);
         Ncb.ncb_lana_num:=lenum.lana[i];
         NetBiosCheck(Netbios(Ncb));
     
         FillChar(NCB^,SizeOf(TNCB),0);
         FillChar(Adapter^,SizeOf(TAdapterStatus),0);
     
         Ncb.ncb_command:=chr(NCBASTAT);
         Ncb.ncb_lana_num:=lenum.lana[i];
         MachineNameToAdapter(MachineName,Ncb.ncb_callname);
         Ncb.ncb_buffer:=Pointer(Adapter);
         Ncb.ncb_length:=SizeOf(TAdapterStatus);
         RetCode:=Netbios(NCB);
         if RetCode in [chr(NRC_GOODRET),chr(NRC_INCOMP)] then
         Adresses.add(AdapterToString(Adapter));
       end;
     finally
         Dispose(NCB);
         Dispose(Adapter);
         Dispose(Lenum);
      end;
    end;
     
     
    function GetMACAdress(const MachineName:string=''):string;
      var stringlist:tstringlist;
    begin
       stringlist:=tstringlist.create;
       try
         if GetMACAdresses(stringlist,MachineName)=0 then result:='' else
         result:=stringlist[0];
       finally
         Stringlist.Free();
       end;
    end;
     
    procedure TForm1.SpeedButton1Click(Sender: TObject);
    begin
      MemoMAC.Clear();
      GetMACAdresses(MemoMAC.Lines,Edit1.Text);
    end;
     
    end.

  2. #2
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 459
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 459
    Points : 24 873
    Points
    24 873
    Par défaut
    Le code compile mais toutefois qu'il rencontre une adresse IP qui n'est pas associée à une machine dans l’intervalle (1---255), le code se plante et s'arrête du coup.
    Oui mais où ?

    As-tu mis des points d'arrêt pour voir où cela s'arrête ?
    As-tu tenté d'utiliser un try except pour capturer l'exception ?


    ton code semble inspiré du second exemple de cette page Torry
    La "Comment obtenir l'adresse MAC d'une carte réseau ?" ne semble ne fournir que celle du poste local


    Il y a de la manipulation d'API et de Char !
    Est-ce du Delphi 7 Ansi ?
    ou une version comme XE... donc Unicode qui aurait un impact notable sur le Move
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  3. #3
    Expert confirmé
    Avatar de anapurna
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2002
    Messages
    3 420
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 420
    Points : 5 819
    Points
    5 819
    Par défaut
    salut

    effectivement cette routine te permet d'obtenir la mac adresse local
    il faut utilsé la function SendARP de la dll "iphlpapi dll"

    les paramettre de cette dll sont :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    function SendARP(DestIp: DWORD; srcIP: DWORD; pMacAddr: pointer; PhyAddrLen: Pointer): DWORD;
    Nous souhaitons la vérité et nous trouvons qu'incertitude. [...]
    Nous sommes incapables de ne pas souhaiter la vérité et le bonheur, et sommes incapables ni de certitude ni de bonheur.
    Blaise Pascal
    PS : n'oubliez pas le tag

  4. #4
    Membre à l'essai
    Homme Profil pro
    Analyse système
    Inscrit en
    Août 2015
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Analyse système

    Informations forums :
    Inscription : Août 2015
    Messages : 11
    Points : 12
    Points
    12
    Par défaut
    Oui avec TRY EXCEPT, la code fonction mais trop lent (escargo frenchement)

Discussions similaires

  1. Réponses: 6
    Dernier message: 25/06/2010, 18h37
  2. Obtenir l'adresse mac de sa carte reseau
    Par kivoch dans le forum C++Builder
    Réponses: 4
    Dernier message: 19/11/2009, 18h30
  3. Réponses: 10
    Dernier message: 26/07/2005, 14h38
  4. recuperer adresse MAC d'un pc sur un reseau local
    Par LineLe dans le forum Développement
    Réponses: 3
    Dernier message: 25/03/2005, 16h37
  5. Comment récupérer une adresse MAC ?
    Par psau dans le forum Développement
    Réponses: 7
    Dernier message: 19/07/2002, 17h26

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo