Sources
Delphi Russian Knowledge Base
DRKB - это самая большая и удобная в использовании база знаний по Дельфи в рунете, составленная Виталием Невзоровым

Как определить MAC адрес NIC?

01.01.2007

Вот на что наткнулся в одном из ФАКов:

Вариант1:

From : Sergey Gazimagomedov 2:453/11.13

Мне нужен был МАС адpес, так я его получал, пользуясь NetBIOS.

Добавляешь имя NetBIOS и посылаешь на имя станции, нужной для опpеделения(можно

и своей) датагpамный пакет с заполненным NCB.

Вот исходник моей функции для опpеделения МАС адpеса.

UCHAR MYLIBAPI GetAdapterID(char *Name,
UINT lana_num
,
CARDID
*ID)
{
UCHAR rc
= 0;
UCHAR
Status[256];
while( lstrlen(Name) - 15)
lstrcat
(Name, " ");
memset
(&SNcb, 0, sizeof(NCB));
SNcb.ncb_command = NCBASTAT;
SNcb.ncb_buffer = (LPSTR)Status;
SNcb.ncb_length = 256;
lstrcpy
(SNcb.ncb_callname, Name);
SNcb.ncb_lana_num = lana_num;
rc
= Netbios( &SNcb );
if(rc ==0){
memcpy
(ID, Status, 6);
}
return(SNcb.ncb_cmd_cplt);
}

Это под Win32. Конечно должен быть пpотокол NetBIOS, но он в фоpточках и так

необходим.

Взято с Vingrad.ru https://forum.vingrad.ru

Вариант2:

From : Alexey Grachyov

void main()
{
int iAdapters,iOpt=sizeof(iAdapters),iSize=sizeof(SOCKADDR_IPX);
SOCKET skNum
;
SOCKADDR_IPX
Addr;
WSADATA
Wsa;
if(WSAStartup(0x0101,&Wsa)) return;
if((skNum=socket(AF_IPX,SOCK_DGRAM,NSPROTO_IPX))!=INVALID_SOCKET)
{
memset
(&Addr,0,sizeof(Addr));
Addr.sa_family=AF_IPX;
if(bind(skNum,(SOCKADDR *)&Addr,iSize)!=SOCKET_ERROR)
{
if(getsockopt(skNum,NSPROTO_IPX,IPX_MAX_ADAPTER_NUM,
(char *)&iAdapters,&iOpt)!=SOCKET_ERROR)
{
while(iAdapters)
{
IPX_ADDRESS_DATA
Data;
memset
(&Data,0,sizeof(Data));
Data.adapternum=iAdapters-1;
iOpt
=sizeof(Data);
if(getsockopt(skNum,NSPROTO_IPX,IPX_ADDRESS,(char
*)&Data,&iOpt)!=SOCKET_ERROR)
{
printf
("Addr: %02X%02X%02X%02X:%02X%02X%02X%02X%02X%02X\n",
(int)Data.netnum[0],(int)Data.netnum[1],(int)Data.netnum[2],
(int)Data.netnum[3],(int)Data.netnum[4],(int)Data.netnum[5],
(int)Data.netnum[6],(int)Data.netnum[7],(int)Data.netnum[8],
(int)Data.netnum[9]);
}
iAdapters
--;
}
}
}
closesocket
(skNum);
}
WSACleanup();
}

Взято с Vingrad.ru https://forum.vingrad.ru

Вариант3:

From: MSDN

typedef struct _ASTAT_
{
ADAPTER_STATUS adapt
;
NAME_BUFFER
NameBuff [30];
}ASTAT, * PASTAT;
ASTAT
Adapter;
void main (void)
{
NCB
Ncb;
UCHAR uRetCode
;
char NetName[50];
memset
( &Ncb, 0, sizeof(Ncb) );
Ncb.ncb_command = NCBRESET;
Ncb.ncb_lana_num = 0;
uRetCode
= Netbios( &Ncb );
printf
( "The NCBRESET return code is: 0x%x \n", uRetCode );
memset
( &Ncb, 0, sizeof (Ncb) );
Ncb.ncb_command = NCBASTAT;
Ncb.ncb_lana_num = 0;
strcpy
( Ncb.ncb_callname, "* " );
Ncb.ncb_buffer = (char *) &Adapter;
Ncb.ncb_length = sizeof(Adapter);
uRetCode
= Netbios( &Ncb );
printf
( "The NCBASTAT return code is: 0x%x \n", uRetCode );
if ( uRetCode == 0 )
{
printf
( "The Ethernet Number is: %02x%02x%02x%02x%02x%02x\n",
Adapter.adapt.adapter_address[0],
Adapter.adapt.adapter_address[1],
Adapter.adapt.adapter_address[2],
Adapter.adapt.adapter_address[3],
Adapter.adapt.adapter_address[4],
Adapter.adapt.adapter_address[5] );
}
}

Автор: Garik

Взято с Vingrad.ru https://forum.vingrad.ru


Автор: Daniel Wischnewski

Для того, чтобы этот код работал, необходимо включить в проект юнит NB30. Простой вызов функции GetMACAddress возвращает адрес первого установленного сетевого адаптера.

Совместимость: Delphi 3.x (или выше)

Данный пример был составлен на основе статьи на сайте  Borland:

https://community.borland.com/article/0,1410,26040,00.html

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;

Взято из https://forum.sources.ru