Главная страница
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.012 c
4-87205
kofman
2002-12-12 00:14
2003.01.27
Как после восстановления проги из трея расположит ее поверх всех?


1-86955
ivansv
2003-01-16 05:17
2003.01.27
Как узнать число видимых строк в TRichEdit


1-86892
Andrew_p
2003-01-16 11:29
2003.01.27
Вызов формы с DLL в адрес программы


1-86916
МитяЙ2
2003-01-14 22:00
2003.01.27
Возврат из процедуры (функции)


1-86828
kpo
2003-01-19 11:27
2003.01.27
как удалить