Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Сети";
Текущий архив: 2005.08.07;
Скачать: [xml.tar.bz2];

Вниз

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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.51 MB
Время: 0.037 c
10-1098889890
ИМХО
2004-10-27 19:11
2005.08.07
OLE-автоматизация собственной программы


9-1113934613
HPR
2005-04-19 22:16
2005.08.07
микширование звуков


6-1113420960
god
2005-04-13 23:36
2005.08.07
Vortex 2.9.5 IRC PRIVMSG ???


6-1114289325
Keal
2005-04-24 00:48
2005.08.07
Чат или как найти все серверы?


1-1121440783
dedelta
2005-07-15 19:19
2005.08.07
Подскажите как коректно внести и сохранить изменения в system.ini





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский