MAC адресс
От: _dima_  
Дата: 18.07.02 17:52
Оценка:
Подскажите как программно узнать МАС адресс сетевухи
Re: MAC адресс
От: ToShA_2K Россия  
Дата: 19.07.02 03:13
Оценка:
Здравствуйте _dima_, Вы писали:

D>Подскажите как программно узнать МАС адресс сетевухи


Смотри здесь
<a target='_blank' class='m' href='http://support.microsoft.com/default.aspx?scid=kb;EN-US;q118623'>q118623</a>
Re: MAC адресс
От: Andrew S Россия http://alchemy-lab.com
Дата: 22.07.02 11:43
Оценка:
Здравствуйте _dima_, Вы писали:

На самом деле рекомендованый ранее способ (без обид) — один из самых глупых. Его использование проблематично, т.к. нельзя сопоставить имя сетевухт и ее MAC. Более того, нетбиос не всегда установлен.

Есть много вариантов.

1. SNMP (inetmib1.dll) — работает на всех системах win32 с TCP/IP. На самом деле, глубоко внутри то же, что и (2). Его использую я.
2. Inet Helper Api — работает начиная с win98.
3. Raw NDIS call — наиболее правильный способ, однако для 9х систем придется писать драйвер. Более подробно — на pcausa. Зато позволяет определять все, что угодно.
4. IPX Socket — объяснять, надеюсь, не надо.


И еще много-много других способов. Начиная от WMI до мучений с dhcp.vxd (лично расковырял формат данных благодаря ipconfig из 95-х. Формат благополучно утерян ).

Вобщем, успехов. Если надо что подробнее — постараюсь помочь, но не гарантирую. На самом деле я даже этих сведений не имел вначале, так что вперед — к поискам на форумах.

D>Подскажите как программно узнать МАС адресс сетевухи
http://www.rusyaz.ru/pr — стараемся писАть по-русски
Re[2]: MAC адресс
От: TopTiT Украина  
Дата: 23.07.02 11:11
Оценка:
Держи код — специально для ленивых... ж-) я над ним долго работал....

typedef struct _ASTAT_
{
ADAPTER_STATUS adapt;
NAME_BUFFER NameBuff [30];
}ASTAT, * PASTAT;

int _stdcall WINAPI GetMacAddr(int *Num1,int *Num2,int *Num3,int *Num4,int *Num5,int *Num6)
{
ASTAT Adapter;
NCB Ncb;
UCHAR uRetCode;
char NetName[50];
int retcode;

memset( &Ncb, 0, sizeof(Ncb) );
Ncb.ncb_command = NCBRESET;
Ncb.ncb_lana_num = 0;

uRetCode = Netbios( &Ncb );
memset( &Ncb, 0, sizeof (Ncb) );
Ncb.ncb_command = NCBASTAT;
Ncb.ncb_lana_num = 0;
strcpy( (char*)Ncb.ncb_callname, "* " );
Ncb.ncb_buffer = (unsigned char *) &Adapter;
Ncb.ncb_length = sizeof(Adapter);
uRetCode = Netbios( &Ncb );

retcode = 1;

*Num1 = 0;
*Num2 = 0;
*Num3 = 0;

*Num4 = 0;
*Num5 = 0;
*Num6 = 0;

if ( uRetCode == 0 )
{
retcode = 0;

*Num1 = Adapter.adapt.adapter_address[0];
*Num2 = Adapter.adapt.adapter_address[1];
*Num3 = Adapter.adapt.adapter_address[2];
*Num4 = Adapter.adapt.adapter_address[3];
*Num5 = Adapter.adapt.adapter_address[4];
*Num6 = Adapter.adapt.adapter_address[5];

}
return retcode;
}

Толбко установи IPX протокол сначала
Say Hello World!
Re[3]: MAC адресс
От: Аноним  
Дата: 23.07.02 17:38
Оценка:
Здравствуйте TopTiT, Вы писали:

:) Этот код, к сожалению, не требует IPX — а лишь нетбиос. Свое отношение к нему я уже высказал в предыдущем сообщении.

Вот, то что надо, на самом деле:

http://www.codeguru.com/internet/TCPInfo.html — про IP Helper. Как работатет и пример

А вот — по SNMP

http://www.codenet.ru/progr/inet/winsock.php

MIBы для мак адреса и не только:

UINT OID_adEntAddr[] = {1,3,6,1,2,1,2,2,1,6};
UINT OID_adEntDescr[] = {1,3,6,1,2,1,2,2,1,2};
UINT OID_adEntSpeed[] = {1,3,6,1,2,1,2,2,1,5};


Успехов!

TTT>Держи код — специально для ленивых... ж-) я над ним долго работал....


TTT>typedef struct _ASTAT_

TTT>{
TTT>ADAPTER_STATUS adapt;
TTT>NAME_BUFFER NameBuff [30];
TTT>}ASTAT, * PASTAT;

TTT>int _stdcall WINAPI GetMacAddr(int *Num1,int *Num2,int *Num3,int *Num4,int *Num5,int *Num6)

TTT>{
TTT>ASTAT Adapter;
TTT>NCB Ncb;
TTT>UCHAR uRetCode;
TTT>char NetName[50];
TTT>int retcode;

TTT>memset( &Ncb, 0, sizeof(Ncb) );

TTT>Ncb.ncb_command = NCBRESET;
TTT>Ncb.ncb_lana_num = 0;

TTT>uRetCode = Netbios( &Ncb );

TTT>memset( &Ncb, 0, sizeof (Ncb) );
TTT>Ncb.ncb_command = NCBASTAT;
TTT>Ncb.ncb_lana_num = 0;
TTT>strcpy( (char*)Ncb.ncb_callname, "* " );
TTT>Ncb.ncb_buffer = (unsigned char *) &Adapter;
TTT>Ncb.ncb_length = sizeof(Adapter);
TTT>uRetCode = Netbios( &Ncb );

TTT>retcode = 1;


TTT>*Num1 = 0;

TTT>*Num2 = 0;
TTT>*Num3 = 0;

TTT>*Num4 = 0;

TTT>*Num5 = 0;
TTT>*Num6 = 0;

TTT>if ( uRetCode == 0 )

TTT>{
TTT> retcode = 0;
TTT>
TTT> *Num1 = Adapter.adapt.adapter_address[0];
TTT> *Num2 = Adapter.adapt.adapter_address[1];
TTT> *Num3 = Adapter.adapt.adapter_address[2];
TTT> *Num4 = Adapter.adapt.adapter_address[3];
TTT> *Num5 = Adapter.adapt.adapter_address[4];
TTT> *Num6 = Adapter.adapt.adapter_address[5];

TTT>}

TTT> return retcode;
TTT>}

TTT>Толбко установи IPX протокол сначала
Re[2]: MAC адресс
От: observer Россия  
Дата: 25.07.02 08:33
Оценка:
Здравствуйте Andrew S, Вы писали:

AS>На самом деле рекомендованый ранее способ (без обид) — один из самых глупых.


Нельзя ли поподробнее почему же он глуп?
Понятно, что у него свои недостатки, но и у других методо, про которые ты пишешь ниже, они тоже есть, насколько я поинмаю.

AS>Его использование проблематично, т.к. нельзя сопоставить имя сетевухт и ее MAC.


Согласен. но имя не всегда и требуется. Бывает нужен просто ЛЮБОЙ MAC адрес компьютера, например при привязка программы к конкретному компьютеру для лицензирования.

AS>Более того, нетбиос не всегда установлен.


Наверное бывает, но ИМХО это уже экзотика, по крайней мере на серверах.

AS>1. SNMP (inetmib1.dll) — работает на всех системах win32 с TCP/IP. На самом деле, глубоко внутри то же, что и (2).

AS>2. Inet Helper Api — работает начиная с win98.

Отличный способ. Видимо речь идет о GetAdaptersInfo()? Очень удобно и кода меньше чем с Нетбиосом, но, насколько я понимаю, на серверах это работает только с Win2000, т.е. под NT этого нет.

Другими словами, если, например, надо определять любой МАК аддрес на сервере, то получается, что нетбиос все же наиболее простой способ. Поправь пож-та если я не прав.
Re[3]: MAC адресс
От: Andrew S Россия http://alchemy-lab.com
Дата: 25.07.02 12:16
Оценка:
Здравствуйте observer, Вы писали:

Ну хотя бы потому, что этот способ рекомендован майкрософт, однако сами они его нигде не используют. Везде — от netstat до ipconfig используется SNMP. Вот так... А если несколько сетевух? Что, предлагаешь определять все LANA и после этого вызывать нетбиос? Кода еще больше, чем в SNMP ,и проблем в разы больше. А функциональность — никакая.
У всех способов есть недостатки. Пожалуй, только RAW NDIS позволяет узнать все, что надо. Но под 9х — проблематично, драйвер надо писать.

Если требуется привязка к конкретному компютеру — то можно брать серийник, например, биоса, млм еще как. Заменил сетевуху — и что, заново лицензировать. А если ее вообще нет, а есть только PPP адаптер, у которого мак адрес одинаков на всех компутерах? Тогда что делать? Между прочим, в этом случае работает только метод с SNMP и IP Helper. Так что выводы ...

O>Нельзя ли поподробнее почему же он глуп?

O>Понятно, что у него свои недостатки, но и у других методо, про которые ты пишешь ниже, они тоже есть, насколько я поинмаю.

AS>>Его использование проблематично, т.к. нельзя сопоставить имя сетевухт и ее MAC.


O>Согласен. но имя не всегда и требуется. Бывает нужен просто ЛЮБОЙ MAC адрес компьютера, например при привязка программы к конкретному компьютеру для лицензирования.


AS>>Более того, нетбиос не всегда установлен.


O>Наверное бывает, но ИМХО это уже экзотика, по крайней мере на серверах.


AS>>1. SNMP (inetmib1.dll) — работает на всех системах win32 с TCP/IP. На самом деле, глубоко внутри то же, что и (2).

AS>>2. Inet Helper Api — работает начиная с win98.

O>Отличный способ. Видимо речь идет о GetAdaptersInfo()? Очень удобно и кода меньше чем с Нетбиосом, но, насколько я понимаю, на серверах это работает только с Win2000, т.е. под NT этого нет.


O>Другими словами, если, например, надо определять любой МАК аддрес на сервере, то получается, что нетбиос все же наиболее простой способ. Поправь пож-та если я не прав.
http://www.rusyaz.ru/pr — стараемся писАть по-русски
Re[4]: MAC адресс
От: observer Россия  
Дата: 25.07.02 14:53
Оценка:
Здравствуйте Andrew S, Вы писали:

AS>Если требуется привязка к конкретному компютеру — то можно брать серийник, например, биоса, млм еще как.


Параметров привязки обязательно д.б. несколько, причем клиенту необязательно знать каких.

AS>Заменил сетевуху — и что, заново лицензировать.


При промышленной эксплуатации сетевуху никто просто так не меняет. Если есть причины поменять, то можно сгенерить новую лицензию (бесплатно).

AS>А если ее вообще нет, а есть только PPP адаптер, у которого мак адрес одинаков на всех компутерах? Тогда что делать? Между прочим, в этом случае работает только метод с SNMP и IP Helper. Так что выводы ...


Ну у меня речь шла о привязке серверного приложения, а сервер подключенный только по РРР, это странно.

Но в принципе, я согласен про РРР. И вобще не считаю Нетбиос универсальным и идеальным средством. Про его недостатки ты еще раньше все правильно написал. Мое замечание было о том, что идеального средства нет, а среди неидеальных у Нетбиос есть свои достоинства.
Re[5]: MAC адресс
От: Andrew S Россия http://alchemy-lab.com
Дата: 25.07.02 18:18
Оценка:
Вообще то, в первоначальном сабже ничего не сказано про то, где это будет использоваться. Так что...

Единственный, по моему мнению, правильный метод — RAW вызов NDIS. Но он слишком сложен под 9x. Зато работает на любых сетевых протоколах.
А еще есть метод SQUID, кажется... Но тоже для нескольких сетевух не подходит.
Вобщем, я рекомендую использовать SNMP — тем более, что через него же можно получить много другой интересной информации.

(А первое, что я в свое время нашел, и был нетбиос. На самом деле — он ужасен).


В общем, всем успехов.

AS>>Если требуется привязка к конкретному компютеру — то можно брать серийник, например, биоса, млм еще как.


O>Параметров привязки обязательно д.б. несколько, причем клиенту необязательно знать каких.


AS>>Заменил сетевуху — и что, заново лицензировать.


O>При промышленной эксплуатации сетевуху никто просто так не меняет. Если есть причины поменять, то можно сгенерить новую лицензию (бесплатно).


AS>>А если ее вообще нет, а есть только PPP адаптер, у которого мак адрес одинаков на всех компутерах? Тогда что делать? Между прочим, в этом случае работает только метод с SNMP и IP Helper. Так что выводы ...


O>Ну у меня речь шла о привязке серверного приложения, а сервер подключенный только по РРР, это странно.


O>Но в принципе, я согласен про РРР. И вобще не считаю Нетбиос универсальным и идеальным средством. Про его недостатки ты еще раньше все правильно написал. Мое замечание было о том, что идеального средства нет, а среди неидеальных у Нетбиос есть свои достоинства.
http://www.rusyaz.ru/pr — стараемся писАть по-русски
Re[3]: MAC адресс
От: Glindor  
Дата: 01.07.03 13:41
Оценка:
Здравствуйте, TopTiT, Вы писали:

Возможно я заблуждаюсь, но писать
Ncb.ncb_lana_num = 0;
неверно. LAN adapter number может быть и не равен нулю.
Вот у меня сработала строка
Ncb.ncb_lana_num = 1;
Хотя правельнее дольжно писать что то вроде следующего.

LANA_ENUM   lenum;
memset( &Ncb, 0, sizeof(Ncb) );
Ncb.ncb_command = NCBENUM;
Ncb.ncb_buffer = (UCHAR *)&lenum;
Ncb.ncb_length = sizeof(lenum);
uRetCode = Netbios( &Ncb );

memset( &Ncb, 0, sizeof(Ncb) );
Ncb.ncb_command = NCBRESET;
Ncb.ncb_lana_num = lenum.lana[0];


ну т соответственно и далее по текству использовать lenum.lana[0];


TTT>Держи код — специально для ленивых... ж-) я над ним долго работал....


TTT>typedef struct _ASTAT_

TTT>{
TTT>ADAPTER_STATUS adapt;
TTT>NAME_BUFFER NameBuff [30];
TTT>}ASTAT, * PASTAT;

TTT>int _stdcall WINAPI GetMacAddr(int *Num1,int *Num2,int *Num3,int *Num4,int *Num5,int *Num6)

TTT>{
TTT>ASTAT Adapter;
TTT>NCB Ncb;
TTT>UCHAR uRetCode;
TTT>char NetName[50];
TTT>int retcode;

TTT>memset( &Ncb, 0, sizeof(Ncb) );

TTT>Ncb.ncb_command = NCBRESET;
TTT>Ncb.ncb_lana_num = 0;

TTT>uRetCode = Netbios( &Ncb );

TTT>memset( &Ncb, 0, sizeof (Ncb) );
TTT>Ncb.ncb_command = NCBASTAT;
TTT>Ncb.ncb_lana_num = 0;
TTT>strcpy( (char*)Ncb.ncb_callname, "* " );
TTT>Ncb.ncb_buffer = (unsigned char *) &Adapter;
TTT>Ncb.ncb_length = sizeof(Adapter);
TTT>uRetCode = Netbios( &Ncb );

TTT>retcode = 1;


TTT>*Num1 = 0;

TTT>*Num2 = 0;
TTT>*Num3 = 0;

TTT>*Num4 = 0;

TTT>*Num5 = 0;
TTT>*Num6 = 0;

TTT>if ( uRetCode == 0 )

TTT>{
TTT> retcode = 0;

TTT> *Num1 = Adapter.adapt.adapter_address[0];

TTT> *Num2 = Adapter.adapt.adapter_address[1];
TTT> *Num3 = Adapter.adapt.adapter_address[2];
TTT> *Num4 = Adapter.adapt.adapter_address[3];
TTT> *Num5 = Adapter.adapt.adapter_address[4];
TTT> *Num6 = Adapter.adapt.adapter_address[5];

TTT>}

TTT> return retcode;
TTT>}

TTT>Толбко установи IPX протокол сначала
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.