Get MAC (Ethernet) Address of NIC

Lord Soth 1 Tallied Votes 1K Views Share

In case there are mote than one NIC (Network Interface Card) the coe gives the MAC of the first adapter. You can change the 0 on the line qoted below to take the MAC of other NICs if present.

"Result := GetAdapterInfo(AdapterList.lana[0]) "

uses NB30;

function GetAdapterInfo(Lana: Char): String;
var
 Adapter: TAdapterStatus;
 NCB: TNCB;
begin
 FillChar(NCB, SizeOf(NCB), 0);
 NCB.ncb_command := Char(NCBRESET);
 NCB.ncb_lana_num := Lana;
 if Netbios(@NCB) <> Char(NRC_GOODRET) then
 begin
   Result := 'mac not found';
   Exit;
 end;

 FillChar(NCB, SizeOf(NCB), 0); 
 NCB.ncb_command := Char(NCBASTAT); 
 NCB.ncb_lana_num := Lana; 
 NCB.ncb_callname := '*'; 

 FillChar(Adapter, SizeOf(Adapter), 0);
 NCB.ncb_buffer := @Adapter; 
 NCB.ncb_length := SizeOf(Adapter); 
 if Netbios(@NCB) <> Char(NRC_GOODRET) then 
 begin 
   Result := 'mac not found'; 
   Exit; 
 end; 
 Result := 
   IntToHex(Byte(Adapter.adapter_address[0]), 2) + '-' +
   IntToHex(Byte(Adapter.adapter_address[1]), 2) + '-' + 
   IntToHex(Byte(Adapter.adapter_address[2]), 2) + '-' + 
   IntToHex(Byte(Adapter.adapter_address[3]), 2) + '-' + 
   IntToHex(Byte(Adapter.adapter_address[4]), 2) + '-' + 
   IntToHex(Byte(Adapter.adapter_address[5]), 2); 
end; 

function GetMACAddress: string;
var
 AdapterList: TLanaEnum; 
 NCB: TNCB; 
begin 
 FillChar(NCB, SizeOf(NCB), 0); 
 NCB.ncb_command := Char(NCBENUM); 
 NCB.ncb_buffer := @AdapterList; 
 NCB.ncb_length := SizeOf(AdapterList); 
 Netbios(@NCB); 
 if Byte(AdapterList.length) > 0 then
   Result := GetAdapterInfo(AdapterList.lana[0]) 
 else 
   Result := 'mac not found'; 
end; 

// usage
procedure TForm1.Button1Click(Sender: TObject);
begin
  ShowMessage(GetMACAddress);
end;