Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2003.01.27;
Скачать: CL | DM;

Вниз

Как узнать физический номер сетевой карты?   Найти похожие ветки 

 
Moscower ©   (2002-11-28 20:46) [0]

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

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

Спасибо


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

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.

Тенцер А.Л.


 
videolord ©   (2002-11-28 23:20) [2]

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


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

ok

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


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

Если:
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.

Почему?


 
kig ©   (2002-11-29 23:59) [5]

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

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




Страницы: 1 вся ветка

Текущий архив: 2003.01.27;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.022 c
14-87056
ZiLot
2003-01-08 14:11
2003.01.27
Help (.hlp)


1-86938
Vetalb
2003-01-16 20:33
2003.01.27
Не получается работать с COM-обьектом из dll-ки


1-86927
waw
2003-01-16 16:27
2003.01.27
TIdCoderMD5


1-86846
Gamar
2003-01-19 15:51
2003.01.27
Прерывание затяжной функции


1-86965
DDS
2003-01-17 10:03
2003.01.27
Я создаю VCL от Shape, что сделать, чтобы выполнялось OnClick