Господа, подскажите, как программно определить уникальный номер сетевой карты(Ethernet Address).
Здравствуйте, bono007, Вы писали:
B>Нет, я прошу не MAC-адрес!
B>Прошу Ethernet Address!
Нет никакого Ethernet Address. У каждой платы Ethernet есть гарантированно уникальный шестибайтовый номер. Именно он используется при адресации пакетов (точнее, фреймов) в сетях Ethernet.
Способ с GUID ненадежен, т.к. он может генерироваться несколькими алгоритмами.
Получить доступ к информации об установленных в системе адаптерах можно несколькими способами. Если ты работаешь на винде моложе 2000, то проще всего воспользоваться IP Helper API, в частности функцией
GetAdaptersInfo.
... << RSDN@Home 1.1.4 beta 5 rev. 395>>
Здравствуйте, c-smile, Вы писали:
CS>Здравствуйте, bono007, Вы писали:
B>>Господа, подскажите, как программно определить уникальный номер сетевой карты(Ethernet Address).
CS>Какая-то из частей GUID возвращаемого функцией UuidCreateSequential
CS>является MAC адресом сетевой карты. См. в Гугле детали.
Пальцем в небо
В принципе, на любой вопрос достаточно будет ответить "См. в Гугле детали".
Как вариант, я за 30 сек в MSDN нашел статью
Q118623 "HOWTO: Get the MAC Address for an Ethernet Adapter".
Поищите и обрящите. На всякий случай вот оттеда кусок кода
Sample Code
#include <windows.h>
#include <wincon.h>
#include <stdlib.h>
#include <stdio.h>
#include <time.h>
typedef struct _ASTAT_
{
ADAPTER_STATUS adapt;
NAME_BUFFER NameBuff [30];
}ASTAT, * PASTAT;
ASTAT Adapter;
void main (void)
{
NCB Ncb;
UCHAR uRetCode;
char NetName[50];
LANA_ENUM lenum;
int i;
memset( &Ncb, 0, sizeof(Ncb) );
Ncb.ncb_command = NCBENUM;
Ncb.ncb_buffer = (UCHAR *)&lenum;
Ncb.ncb_length = sizeof(lenum);
uRetCode = Netbios( &Ncb );
printf( "The NCBENUM return code is: 0x%x \n", uRetCode );
for(i=0; i < lenum.length ;i++)
{
memset( &Ncb, 0, sizeof(Ncb) );
Ncb.ncb_command = NCBRESET;
Ncb.ncb_lana_num = lenum.lana[i];
uRetCode = Netbios( &Ncb );
printf( "The NCBRESET on LANA %d return code is: 0x%x \n",
lenum.lana[i], uRetCode );
memset( &Ncb, 0, sizeof (Ncb) );
Ncb.ncb_command = NCBASTAT;
Ncb.ncb_lana_num = lenum.lana[i];
strcpy( Ncb.ncb_callname, "* " );
Ncb.ncb_buffer = (char *) &Adapter;
Ncb.ncb_length = sizeof(Adapter);
uRetCode = Netbios( &Ncb );
printf( "The NCBASTAT on LANA %d return code is: 0x%x \n",
lenum.lana[i], uRetCode );
if ( uRetCode == 0 )
{
printf( "The Ethernet Number on LANA %d is:
%02x%02x%02x%02x%02x%02x\n",
lenum.lana[i],
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] );
}
}
}
Еще можно попробовать через WMI.
... << RSDN@Home 1.1.4 beta 6a rev. 436>>
Здравствуйте, Spaider, Вы писали:
S>Пальцем в небо В принципе, на любой вопрос достаточно будет ответить "См. в Гугле детали".
S>Как вариант, я за 30 сек в MSDN нашел статью Q118623 "HOWTO: Get the MAC Address for an Ethernet Adapter".
S>Поищите и обрящите. На всякий случай вот оттеда кусок кода
Статья забавная, но надо обратить внимание на следующий ахтунг: она сработает только если для адаптера установлен биндинг NetBIOS. У меня, если я не разучился читать окошко пропертей сетевого подключения, вроде как ни на одном из адаптеров этого биндинга нету.
... << RSDN@Home 1.1.4 beta 5 rev. 395>>