Connaitre Adresse MAC

Résolu
nabil-bago Messages postés 289 Statut Membre -  
nabil-bago Messages postés 289 Statut Membre -
Bonjour a tous,
je me trouve sur un petit souci, je cherche comment connaitre/afficher l'adresse MAC sur delphi.
j'ai cherché et j'ai trouvé des function mais ça ne marche pas

Merci a vous

3 réponses

  1. Nessdarth Messages postés 40 Statut Membre 3
     
    Bonjour,

    Tu devrais donner ce que tu as trouvé, il y a peut-être une petite erreur.
    1
  2. nabil-bago Messages postés 289 Statut Membre 13
     
    function GetMACAdress: string;
    var
      NCB: PNCB;
      Adapter: PAdapterStatus;
    
      URetCode: PChar;
      RetCode: char;
      I: integer;
      Lenum: PlanaEnum;
      _SystemID: string;
      TMPSTR: string;
    begin
      Result    := '';
      _SystemID := '';
      Getmem(NCB, SizeOf(TNCB));
      Fillchar(NCB^, SizeOf(TNCB), 0);
    
      Getmem(Lenum, SizeOf(TLanaEnum));
      Fillchar(Lenum^, SizeOf(TLanaEnum), 0);
    
      Getmem(Adapter, SizeOf(TAdapterStatus));
      Fillchar(Adapter^, SizeOf(TAdapterStatus), 0);
    
      Lenum.Length    := chr(0);
      NCB.ncb_command := chr(NCBENUM);
      NCB.ncb_buffer  := Pointer(Lenum);
      NCB.ncb_length  := SizeOf(Lenum);
      RetCode         := Netbios(NCB);
    
      i := 0;
      repeat
        Fillchar(NCB^, SizeOf(TNCB), 0);
        Ncb.ncb_command  := chr(NCBRESET);
        Ncb.ncb_lana_num := lenum.lana[I];
        RetCode          := Netbios(Ncb);
    
        Fillchar(NCB^, SizeOf(TNCB), 0);
        Ncb.ncb_command  := chr(NCBASTAT);
        Ncb.ncb_lana_num := lenum.lana[I];
        // Must be 16
        Ncb.ncb_callname := '*               ';
    
        Ncb.ncb_buffer := Pointer(Adapter);
    
        Ncb.ncb_length := SizeOf(TAdapterStatus);
        RetCode        := Netbios(Ncb);
        //---- calc _systemId from mac-address[2-5] XOR mac-address[1]...
        if (RetCode = chr(0)) or (RetCode = chr(6)) then
        begin
          _SystemId := IntToHex(Ord(Adapter.adapter_address[0]), 2) + '-' +
            IntToHex(Ord(Adapter.adapter_address[1]), 2) + '-' +
            IntToHex(Ord(Adapter.adapter_address[2]), 2) + '-' +
            IntToHex(Ord(Adapter.adapter_address[3]), 2) + '-' +
            IntToHex(Ord(Adapter.adapter_address[4]), 2) + '-' +
            IntToHex(Ord(Adapter.adapter_address[5]), 2);
        end;
        Inc(i);
      until (I >= Ord(Lenum.Length)) or (_SystemID <> '00-00-00-00-00-00');
      FreeMem(NCB);
      FreeMem(Adapter);
      FreeMem(Lenum);
      GetMacAdress := _SystemID;
    end;
    

    les erreurs :
    au niveau des ligne 28,35 et45
    [dcc32 Erreur] Unit6.pas(53): E2010 Types incompatibles : 'Char' et 'AnsiChar'
    0
    1. Nessdarth Messages postés 40 Statut Membre 3
       
      Bonjour,

      Tu changes juste cela : RetCode: AnsiChar;

      J'ai testé et cela fonctionne
      0
      1. nabil-bago Messages postés 289 Statut Membre 13 > Nessdarth Messages postés 40 Statut Membre
         
        Re-Bonjour,
        ça fonctionne,
        Merci beaucoup NessDarth pour votre aide
        0
  3. nabil-bago Messages postés 289 Statut Membre 13
     
    y en a aussi celle là
    type
      TAdapterStatus = record
        adapter_address: array [0..5] of char;
        filler: array [1..4 * SizeOf(char) + 19 * SizeOf(Word) + 3 * SizeOf(DWORD)] of
        Byte;
      end;
    
      THostInfo = record
        username: PWideChar;
        logon_domain: PWideChar;
        oth_domains: PWideChar;
        logon_server: PWideChar;
      end;{record}
    
    
    function IsNetConnect: Boolean;
    begin
      if GetSystemMetrics(SM_NETWORK) and $01 = $01 then Result := True
      else
        Result := False;
    end;{function}
    
    function AdapterToString(Adapter: TAdapterStatus): 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;{function}
    
    function GetMacAddresses(const Machine: string;
      const Addresses: TStrings): Integer;
    const
      NCBNAMSZ = 16;        // absolute length of a net name
      MAX_LANA = 254;       // lana's in range 0 to MAX_LANA inclusive
      NRC_GOODRET = $00;       // good return
      NCBASTAT = $33;       // NCB ADAPTER STATUS
      NCBRESET = $32;       // NCB RESET
      NCBENUM = $37;       // NCB ENUMERATE LANA NUMBERS
    type
      PNCB = ^TNCB;
      TNCBPostProc = procedure(P: PNCB);
      stdcall;
      TNCB = record
        ncb_command: Byte;
        ncb_retcode: Byte;
        ncb_lsn: Byte;
        ncb_num: Byte;
        ncb_buffer: PChar;
        ncb_length: Word;
        ncb_callname: array [0..NCBNAMSZ - 1] of char;
        ncb_name: array [0..NCBNAMSZ - 1] of char;
        ncb_rto: Byte;
        ncb_sto: Byte;
        ncb_post: TNCBPostProc;
        ncb_lana_num: Byte;
        ncb_cmd_cplt: Byte;
        ncb_reserve: array [0..9] of char;
        ncb_event: THandle;
      end;
      PLanaEnum = ^TLanaEnum;
      TLanaEnum = record
        Length: Byte;
        lana: array [0..MAX_LANA] of Byte;
      end;
      ASTAT = record
        adapt: TAdapterStatus;
        namebuf: array [0..29] of TNameBuffer;
      end;
    var
      NCB: TNCB;
      Enum: TLanaEnum;
      I: integer;
      Adapter: ASTAT;
      MachineName: string;
    begin
      Result := -1;
      Addresses.Clear;
      MachineName := UpperCase(Machine);
      if MachineName = '' then    MachineName := '*';
      FillChar(NCB, SizeOf(NCB), #0);
      NCB.ncb_command := NCBENUM;
      NCB.ncb_buffer  := Pointer(@Enum);
      NCB.ncb_length  := SizeOf(Enum);
      if Word(NetBios(@NCB)) = NRC_GOODRET then
      begin
        Result := Enum.Length;
        for I := 0 to Ord(Enum.Length) - 1 do
        begin
          FillChar(NCB, SizeOf(TNCB), #0);
          NCB.ncb_command  := NCBRESET;
          NCB.ncb_lana_num := Enum.lana[I];
          if Word(NetBios(@NCB)) = NRC_GOODRET then
          begin
            FillChar(NCB, SizeOf(TNCB), #0);
            NCB.ncb_command  := NCBASTAT;
            NCB.ncb_lana_num := Enum.lana[i];
            StrLCopy(NCB.ncb_callname, PChar(MachineName), NCBNAMSZ);
            StrPCopy(@NCB.ncb_callname[Length(MachineName)],
              StringOfChar(' ', NCBNAMSZ - Length(MachineName)));
            NCB.ncb_buffer := PChar(@Adapter);
            NCB.ncb_length := SizeOf(Adapter);
            if Word(NetBios(@NCB)) = NRC_GOODRET then
              Addresses.Add(AdapterToString(Adapter.adapt));
          end;
        end;
      end;
    end;
    
    procedure TForm6.Button1Click(Sender: TObject);
    begin
    label1.Caption := GetMacAddresses;
    end;
    
    

    erreur au niveau de la derniere ligne ( label1.Caption := GetMacAddresses; )
    [dcc32 Erreur] Unit6.pas(138): E2035 Pas assez de paramètres originaux
    0