скрыть

скрыть

  Форум  

Delphi FAQ - Часто задаваемые вопросы

| Базы данных | Графика и Игры | Интернет и Сети | Компоненты и Классы | Мультимедиа |
| ОС и Железо | Программа и Интерфейс | Рабочий стол | Синтаксис | Технологии | Файловая система |



Google  
 

Получить MAC адрес



Оформил: DeeCo

uses NB30;

 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;



 procedure TForm1.Button1Click(Sender: TObject);
 begin
   label1.Caption := GetMACAdress;
 end;



 //*************************************************** 
// Another Code from 
// http://delphi.vitpc.com/treasury/lan.htm 
//*************************************************** 

uses
   NB30;

 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;{function}





Copyright © 2004-2016 "Delphi Sources". Delphi World FAQ




Группа ВКонтакте   Ссылка на Twitter   Группа на Facebook