Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

MAC адрес сетевой платы [D6, Win95/98, WinME, NT4, Win2k, WinXP]


O.O ©   (2005-04-22 11:56:00) 

Как узнать MAC адреса сетевых плат своего компьютера ?


dmitry501   (2005-04-25 12:21:00) [1]

O.O   (25.04.05 12:17) [13]
пожалуйста. А проверить очень просто в WinXP. В сетевых подключениях на иконке соединенгия правий кликни и выбери - "Состояние", потом "Поддержка" и "Подробности". Там отражается MAC в строке "Физический адрес"


O.O   (2005-04-25 12:17:00) [2]

Спасибо !!! Всё великолепно получилось.  Радует и то что результат сходится и в VB и в Delphi, значит он правильный


dmitry501   (2005-04-25 11:12:00) [3]

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://www.delphimaster.ru/cgi-bin/forum.pl?n=4&id=1107518050&p=1&&DI=293&IG=9270ab3cf77642df8a8ef22e5f3fe8b3&POS=2&CM=WPU&CE=2&CS=AWP&SR=2


O.O   (2005-04-25 10:38:00) [4]

Работает, у меня две сетевухи на компе вроде показал два разных адреса (правда по 2 раза). Но как это в Delphi использовать?


dmitry501   (2005-04-25 09:29:00) [5]

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 07:26:00) [6]

Чёйто не нашёл ничего у себя в хелпе, у меня D6


Alex Konshin   (2005-04-23 17:05:00) [7]

А ты попробуй. Я именно ее и имел в виду. Там все равно не MAC.


volser   (2005-04-23 14:28:00) [8]

>dmitry501 ©

Второй способ тоже будет пахать, если вместо CoCreateGuid использовать функцию UuidCreateSequential.


O.O   (2005-04-22 12:55:00) [9]

Спасибо, попробую разобраться


dmitry501   (2005-04-22 12:38:00) [10]

Есть еще Win32_NetworkAdapterConfiguration в WMI


Alex Konshin   (2005-04-22 12:33:00) [11]

Ну посмотрите GetAdaptersInfo, по-моему это то, что нужно.


O.O   (2005-04-22 12:28:00) [12]

А примеры для Delphi имеются ?


Alex Konshin   (2005-04-22 12:27:00) [13]

Второй просто неверен начиная с не помню какой версии Windows.
CoCreateUUID уже нельзя использовать для определения MAC-address.
В дополнение появилась другая функция, которая выдает GUID с одними и теми же байтами на месте, где раньше был MAC, но это все равно не MAC.
MAC можно достать используя IPHelper API, если мне память не изменяет. Также можно достать через Winsock2 используя IPX/SPX (если они установлены).
Короче, способов много, но простых, в одну функцию, уже больше нет.


dmitry501   (2005-04-22 12:11:00) [14]

на
http://community.borland.com/article/0,1410,26040,00.html
описано 3 метода


Наверх

Титульная страница Поиск, карта сайта Написать письмо