Форум: "Сети";
Текущий архив: 2003.01.27;
Скачать: [xml.tar.bz2];
ВнизКак узнать физический номер сетевой карты? Найти похожие ветки
← →
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;
Скачать: [xml.tar.bz2];
Память: 0.45 MB
Время: 0.009 c