Определение MAC-адреса сетевой карты - IP Helper
Определение mac-адреса сетевой карты с помощью функции
GetAdaptersInfo из библиотеки Iphlpapi.dll.
Этот метод работает под 95/98/Me/NT/2000/XP, а также
работает (в отличие от распространенного метода получения
mac-адреса через NetBIOS), если компьютер реально не
подключен к сети.
Исправлена неточность в описании структуры IP_ADAPTER_INFO.
Спасибо Alekos
Sotiropulos
Дата исправления: 28.05.2003
Исправлена ошибка, связанная с перечислением всех сетевых
адаптеров.
Спасибо Anatoly Biriuk
Дата исправления: 26.03.2004
program mac;
{$APPTYPE CONSOLE}
uses
Windows, SysUtils;
const
MAX_ADAPTER_NAME_LENGTH = 256;
MAX_ADAPTER_DESCRIPTION_LENGTH = 128;
MAX_ADAPTER_ADDRESS_LENGTH = 8;
type
//------IP address structures---------------------------------------------------
PIP_ADDRESS_STRING = ^IP_ADDRESS_STRING;
IP_ADDRESS_STRING = array[0..15] of char; // IP as string
PIP_ADDR_STRING = ^IP_ADDR_STRING;
IP_ADDR_STRING = record
Next: PIP_ADDR_STRING;
IpAddress: IP_ADDRESS_STRING;
IpMask: IP_ADDRESS_STRING;
Context: DWORD;
end;
//------ADAPTER INFO STRUCTURES-------------------------------------------------
PIP_ADAPTER_INFO = ^IP_ADAPTER_INFO;
IP_ADAPTER_INFO = record
Next: PIP_ADAPTER_INFO;
ComboIndex: DWORD;
AdapterName: array[1..MAX_ADAPTER_NAME_LENGTH + 4] of char;
Description: array[1..MAX_ADAPTER_DESCRIPTION_LENGTH + 4] of char;
AddressLength: UINT;
Address: array[1..MAX_ADAPTER_ADDRESS_LENGTH] of byte;
Index: DWORD;
aType: UINT;
DHCPEnabled: UINT;
CurrentIPAddress: PIP_ADDR_STRING;
IPAddressList: IP_ADDR_STRING;
GatewayList: IP_ADDR_STRING;
DHCPServer: IP_ADDR_STRING;
HaveWINS: BOOL;
PrimaryWINSServer: IP_ADDR_STRING;
SecondaryWINSServer: IP_ADDR_STRING;
LeaseObtained: LongInt;
LeaseExpires: LongInt;
SpareStuff: array [1..200] of char;
end;
function GetAdaptersInfo(pAdapterInfo: PIP_ADAPTER_INFO;
pOutBufLen: PULONG): DWORD; stdcall;
external 'Iphlpapi.dll' name 'GetAdaptersInfo';
const
OutBufLen: ULONG = 2000;
AddrLen = 6;
var
AdapterInfo: IP_ADAPTER_INFO;
Result: DWORD;
i: integer;
Next: PIP_ADAPTER_INFO;
begin
writeln;
writeln('-----------------------------');
writeln('Network adapter Info');
writeln('-----------------------------');
Result:= GetAdaptersInfo(@AdapterInfo, @OutBufLen);
if Result = 0 then
begin
Next:= @AdapterInfo;
repeat
writeln('Description: ', Next^.Description);
write('MAC address: ');
for i := 0 to AddrLen do
begin
write(IntToHex(Next^.Address[i], 2));
if i <> AddrLen then write('-');
end;
Next:= Next^.Next; // переходим к следующему адаптеру
writeln; writeln;
until Next = nil;
end
else writeln('Error. Result code: ', Result);
write('Press <Enter> to continue...');
readln;
end.
|