Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Как узнать физический номер сетевой карты? [D5, Win95/98, WinME, NT4, Win2k, WinXP]


Moscower ©   (2002-11-28 20:46:00) 

Здравствуйте!
Известно, что в каждой сетевой карте прожигается ее уникальный номер, который называется MAC-адресом, и известны способы, как его на Windows изменить (через реестр, например).

Есть ли какой-нибудь способ прочитать с сетевой карточки встроенный в нее адрес, а не тот, который показывает система, и который может изменить пользователь? Работать должен под Win9x/ME/NT/2000/XP...

Спасибо


kig   (2002-11-29 23:59:00) [1]

Можно по guid. Последние 6 байтов - мас

в 95/98/Me/NT - UuidCreate (или CoCreateGUID)
в 2000/XP - UuidCreateSequential


Eugenex   (2002-11-29 10:41:00) [2]

Если:
MachiName:="*";
то МАС определяется.

Если я задаю так:
MachiName:="192.16.128.12";
StrLCopy(NCB.ncb_callname, PChar(MachineName),NCBNAMSZ);
StrPCopy(@NCB.ncb_callname[Length(MachineName)],StringOfChar(" ", NCBNAMSZ - Length(MachineName)));
то получаю код ошибки
NRC_BADDR The buffer address was illegal.

Почему?


Moscower   (2002-11-28 23:59:00) [3]

ok

тогда к чему посоветуете привязать программу?


videolord   (2002-11-28 23:20:00) [4]

В некоторых современных сетевых картах адрес зашит в ее флэшку, значит его можно легко изменить (WinXP это делает за 1 сек). Приведенный выше код вернет именно этот MAC, а не тот программный, который прописан в реестре.


Anatoly Podgoretsky   (2002-11-28 21:00:00) [5]

Hi Oleg V.Grinev!

unit MACAddress;

interface

uses SysUtils;

type
TMACAddress = packed array[0..5] of Byte;

ENetBiosError = class( Exception );

function LanAdapterCount : Integer;
// Возвращает количество адаптеров ( если несколько протоколов - то
// произведение их количества на количество адаптеров)

function GetMacAddress( AdapterNum : Integer ) : TMACAddress;
// А это возвращает MAC адрес для выбранного адаптера

implementation

uses NB30, Windows;

resourcestring
sNetBiosError = "NetBIOS error %d";

type
TAStat = record
Adapt : TAdapterStatus;
NameBuff : array[0..30] of TNameBuffer;
end;

function LanAdapterCount : Integer;
var
Ncb : TNCB;
uRetCode : Char;
lEnum : TLanaEnum;
begin
FillChar( NCB, SizeOf(NCB), 0 );
with NCB do begin
ncb_command := Char( NCBENUM );
ncb_buffer := @lEnum;
ncb_length := SizeOf(lEnum);
end;
uRetCode := Netbios( @Ncb );
if uRetCode <> #0 then raise Exception.CreateFmt( sNetBIOSError,
[Ord(uRetCode)] );
Result := Ord(lenum.length);
end;

function GetMacAddress( AdapterNum : Integer ) : TMACAddress;
var
Ncb : TNCB;
uRetCode : Char;
J : Integer;
Adapter : TAStat;
begin
FillChar( NCB, SizeOf(NCB), 0 );
with NCB do begin
ncb_command := Char(NCBRESET);
ncb_lana_num := Char( AdapterNum );
end;
uRetCode := Netbios( @Ncb );
if uRetCode <> #0 then raise Exception.CreateFmt( sNetBIOSError,
[Ord(uRetCode)] );
FillChar( NCB, SizeOf(NCB), 0 );
with NCB do begin
ncb_command := Char(NCBASTAT);
ncb_lana_num := Char( AdapterNum );
StrCopy( ncb_callname, "* " );
ncb_buffer := @Adapter;
ncb_length := sizeof(Adapter);
end;
uRetCode := Netbios( @Ncb );
if uRetCode <> #0 then raise Exception.CreateFmt( sNetBIOSError,
[Ord(uRetCode)] );
for J := 0 to 5 do
Result[J] := Ord( Adapter.Adapt.Adapter_address[J] );
end;

end.

Тенцер А.Л.


Наверх

Титульная страница Поиск, карта сайта Написать письмо