Текущий архив: 2005.08.07;
Скачать: CL | DM;
Вниз
MAC адрес сетевой платы Найти похожие ветки
← →
O.O (2005-04-22 11:56) [0]Как узнать MAC адреса сетевых плат своего компьютера ?
← →
dmitry501 © (2005-04-22 12:11) [1]на
http://community.borland.com/article/0,1410,26040,00.html
описано 3 метода
← →
Alex Konshin © (2005-04-22 12:27) [2]Второй просто неверен начиная с не помню какой версии Windows.
CoCreateUUID уже нельзя использовать для определения MAC-address.
В дополнение появилась другая функция, которая выдает GUID с одними и теми же байтами на месте, где раньше был MAC, но это все равно не MAC.
MAC можно достать используя IPHelper API, если мне память не изменяет. Также можно достать через Winsock2 используя IPX/SPX (если они установлены).
Короче, способов много, но простых, в одну функцию, уже больше нет.
← →
O.O (2005-04-22 12:28) [3]А примеры для Delphi имеются ?
← →
Alex Konshin © (2005-04-22 12:33) [4]Ну посмотрите GetAdaptersInfo, по-моему это то, что нужно.
← →
dmitry501 © (2005-04-22 12:38) [5]Есть еще Win32_NetworkAdapterConfiguration в WMI
← →
O.O (2005-04-22 12:55) [6]Спасибо, попробую разобраться
← →
volser (2005-04-23 14:28) [7]>dmitry501 ©
Второй способ тоже будет пахать, если вместо CoCreateGuid использовать функцию UuidCreateSequential.
← →
Alex Konshin © (2005-04-23 17:05) [8]А ты попробуй. Я именно ее и имел в виду. Там все равно не MAC.
← →
O.O (2005-04-25 07:26) [9]Чёйто не нашёл ничего у себя в хелпе, у меня D6
← →
dmitry501 © (2005-04-25 09:29) [10]O.O (25.04.05 7:26) [9]
Все просто- создай файлик mac.vbs с таким содержимым:set objLocator = WScript.CreateObject("WbemScripting.SWbemLocator")
set objService = objLocator.ConnectServer (server, "", username, password)
strQuery = _
"Select MACAddress from Win32_NetworkAdapterConfiguration where IPEnabled=TRUE"
set objEnumerator = objService.ExecQuery(strQuery)
for each obj in objEnumerator
if Not IsNull(obj.MACAddress) then
WScript.Echo obj.MACAddress(i)
end if
next
И запусти его.
← →
O.O (2005-04-25 10:38) [11]Работает, у меня две сетевухи на компе вроде показал два разных адреса (правда по 2 раза). Но как это в Delphi использовать?
← →
dmitry501 © (2005-04-25 11:12) [12]O.O (25.04.05 10:38) [11]
Вот нашел на форуме и переделал:program Mac_address;
{$APPTYPE CONSOLE}
uses
Windows, SysUtils;
const
IPHelper = "iphlpapi.dll";
MAX_ADAPTER_NAME_LENGTH = 256;
MAX_ADAPTER_DESCRIPTION_LENGTH = 128;
MAX_ADAPTER_ADDRESS_LENGTH = 8;
type
time_t = Longint;
// Структуры для выполнения GetAdaptersInfo
PIP_MASK_STRING = ^IP_MASK_STRING;
IP_ADDRESS_STRING = record
S: array [0..15] of Char;
end;
IP_MASK_STRING = IP_ADDRESS_STRING;
PIP_ADDR_STRING = ^IP_ADDR_STRING;
IP_ADDR_STRING = record
Next: PIP_ADDR_STRING;
IpAddress: IP_ADDRESS_STRING;
IpMask: IP_MASK_STRING;
Context: DWORD;
end;
PIP_ADAPTER_INFO = ^IP_ADAPTER_INFO;
IP_ADAPTER_INFO = record
Next: PIP_ADAPTER_INFO;
ComboIndex: DWORD;
AdapterName: array [0..MAX_ADAPTER_NAME_LENGTH + 3] of Char;
Description: array [0..MAX_ADAPTER_DESCRIPTION_LENGTH + 3] of Char;
AddressLength: UINT;
Address: array [0..MAX_ADAPTER_ADDRESS_LENGTH - 1] of BYTE;
Index: DWORD;
Type_: 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: time_t;
LeaseExpires: time_t;
end;
// При помощи данной функции мы определим наличие сетевых интерфейсов
// на локальном компьютере и информацию о них
function GetAdaptersInfo(pAdapterInfo: PIP_ADAPTER_INFO; var pOutBufLen: ULONG): DWORD; stdcall; external IPHelper;
function Dim2Hex(what:array of byte;len:integer):string;
var i : integer;
b : byte;
begin
Result:="";
for i:=0 to len-1 do begin
b:=what[i];
Result := Result+inttohex(b,2)+".";
end;
Delete(Result,Length(Result),1);
end;
var
InterfaceInfo,
TmpPointer: PIP_ADAPTER_INFO;
IP: PIP_ADDR_STRING;
Len: ULONG;
begin
// Читаем все IP адреса со всех присутствующих
// в системе сетевых интерфейсов
// Смотрим сколько памяти нам требуется?
if GetAdaptersInfo(nil, Len) = ERROR_BUFFER_OVERFLOW then
begin
// Берем нужное кол-во
GetMem(InterfaceInfo, Len);
try
// выполнение функции
if GetAdaptersInfo(InterfaceInfo, Len) = ERROR_SUCCESS then
begin
// Перечисляем все сетевые интерфейсы
TmpPointer := InterfaceInfo;
repeat
// перечисляем все IP адреса каждого интерфейса
IP := @TmpPointer.IpAddressList;
repeat
Writeln(Format("%s - %s - %s",
[IP.IpAddress.S, Dim2Hex(TmpPointer.Address,TmpPointer.AddressLength),TmpPointer.Description]));
IP := IP.Next;
until IP = nil;
TmpPointer := TmpPointer.Next;
until TmpPointer = nil;
end;
finally
// Освобождаем занятую память
FreeMem(InterfaceInfo);
end;
end;
end.
Этот код базируется на коде Rouse_ © http://delphimaster.net/view/6-1107518050/&&DI=293&IG=9270ab3cf77642df8a8ef22e5f3fe8b3&POS=2&CM=W PU&CE=2&CS=AWP&SR=2
← →
O.O (2005-04-25 12:17) [13]Спасибо !!! Всё великолепно получилось. Радует и то что результат сходится и в VB и в Delphi, значит он правильный
← →
dmitry501 © (2005-04-25 12:21) [14]O.O (25.04.05 12:17) [13]
пожалуйста. А проверить очень просто в WinXP. В сетевых подключениях на иконке соединенгия правий кликни и выбери - "Состояние", потом "Поддержка" и "Подробности". Там отражается MAC в строке "Физический адрес"
Страницы: 1 вся ветка
Текущий архив: 2005.08.07;
Скачать: CL | DM;
Память: 0.51 MB
Время: 0.03 c