![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Как узнать физический номер сетевой карты? [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.
Тенцер А.Л.