Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
KANSoftWare

Постоянный MAC-Адрес в Windows 7: Стабильность и Кросс-Платформенность

Delphi , Интернет и Сети , Сеть

Вопрос получения MAC-адреса на компьютере с операционной системой Windows 7 является актуальным для многих разработчиков, особенно в контексте использования MAC-адреса в качестве уникального идентификатора устройства. Однако, стоит отметить, что использование MAC-адреса для идентификации устройства может быть нестабильным, так как в некоторых случаях, например после перезагрузки системы, этот адрес может изменяться.

Проблема

Исходный код, представленный пользователем, использует функцию UuidCreateSequential для получения последовательного GUID, который на некоторых операционных системах, включая Windows 7, может изменяться после перезагрузки системы. Это делает полученное значение непостоянным и непригодным для использования в качестве постоянного идентификатора устройства.

Решение

Для получения постоянного MAC-адреса на компьютере с Windows 7 можно использовать WMI (Windows Management Instrumentation) и класс Win32_NetworkAdapterConfiguration. Пример кода на Object Pascal (Delphi) для получения MAC-адреса представлен ниже:

program WMI_MAC;
{$APPTYPE CONSOLE}
uses
  SysUtils
  ,ActiveX
  ,ComObj
  ,Variants;

function VarToStrNil(Value: Variant): string;
begin
  if VarIsNull(Value) then
    Result := ''
  else
    Result := VarToStr(Value);
end;

procedure GetMacAddress;
var
  objWMIService: OLEVariant;
  colItems: OLEVariant;
  colItem: OLEVariant;
  oEnum: IEnumVariant;
  iValue: LongWord;
  wmiHost, root, wmiClass: string;
function GetWMIObject(const objectName: String): IDispatch;
var
  chEaten: Integer;
  BindCtx: IBindCtx;
  Moniker: IMoniker;
begin
  OleCheck(CreateBindCtx(0, BindCtx));
  OleCheck(MkParseDisplayName(BindCtx, StringToOleStr(objectName), chEaten, Moniker));
  OleCheck(Moniker.BindToObject(BindCtx, nil, IDispatch, Result));
end;
begin
  wmiHost := '.';
  root := 'root\CIMV2';
  wmiClass := 'Win32_NetworkAdapterConfiguration';
  objWMIService := GetWMIObject(Format('winmgmts:\\%s\%s', [wmiHost, root]));
  colItems := objWMIService.ExecQuery(Format('SELECT * FROM %s WHERE IPEnabled = TRUE', [wmiClass]), 'WQL', 0);
  oEnum := IUnknown(colItems._NewEnum) as IEnumVariant;
  while oEnum.Next(1, colItem, iValue) = 0 do
  begin
    if VarToStrNil(colItem.MACAddress) <> '' then
    begin
      WriteLn('MAC address: ', VarToStrNil(colItem.MACAddress));
      // Вы можете остановить выполнение цикла после первого найденного MAC-адреса
      // Break;
    end;
  end;
end;
begin
  try
    CoInitialize(nil);
    try
      GetMacAddress;
      Readln;
    finally
      CoUninitialize;
    end;
  except
    on E: Exception do
    begin
      Writeln(E.Classname, ': ', E.Message);
      Readln;
    end;
  end;
end.

Этот код позволяет получить MAC-адрес активного сетевого адаптера. Обратите внимание, что для работы с WMI необходимо инициализировать COM-библиотеки с помощью CoInitialize.

Альтернативное решение

Если вам необходимо получить MAC-адрес удаленного компьютера, можно использовать функцию GetRemoteMacAddress, которая реализует протокол ARP (Address Resolution Protocol). Вот пример такой функции на Object Pascal:

function GetRemoteMacAddress(const IP: AnsiString): TSockData;
var
  // ... (остальная часть кода)
begin
  // ... (реализация функции)
end;

Эта функция предназначена для использования в сетевых приложениях и требует наличия библиотеки iphlpapi.dll.

Заключение

Для получения постоянного MAC-адреса на компьютере с Windows 7 следует использовать WMI и класс Win32_NetworkAdapterConfiguration. Это обеспечит стабильность и кросс-платформенность решения, так как MAC-адрес, полученный таким образом, будет постоянным на одном устройстве, за исключением случаев, когда пользователь сознательно изменяет настройки сетевого оборудования.

Создано по материалам из источника по ссылке.

Запрос заключается в поиске способа получения постоянного MAC-адреса в операционной системе Windows 7 для обеспечения стабильности и кросс-платформенности идентификации устройства.


Комментарии и вопросы

Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS




Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.


:: Главная :: Сеть ::


реклама


©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-12-22 20:14:06
2025-02-05 08:58:03/0.0033040046691895/0