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

Previous  Top  Next

    
 

 

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

 

Вариант1:

From : Sergey Gazimagomedov 2:453/11.13

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

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

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

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

 

Code:

UCHAR MYLIBAPI GetAdapterID(char *Name, // NetBIOS ??? ???????

UINT lana_num,

CARDID *ID) // 6 ???????? ??????

{

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точках и так

необходим.

©Drkb::03290

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

 

 

Вариант2:

From : Alexey Grachyov

Code:

#include

#include

#include

#include

#include

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();

}

 

©Drkb::03291

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

 

 

Вариант3:

From: MSDN

Code:

#include

#include

#include

#include

#include

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

©Drkb::03292

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

 


 

Автор: Daniel Wischnewski

 

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

 

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

 

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

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

 

Code:

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;

 

©Drkb::03293

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