ищу MAC-адрес физического адаптера

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

Procedure TForm4.GetMacAddress;
var item: TListItem;
    objWMIService : OLEVariant;
    colItems      : OLEVariant;
    colItem       : OLEVariant;
    oEnum         : IEnumvariant;
    iValue        : LongWord;
    wmiHost, root, wmiClass: string;
    i: Int32;

  function GetWMIObject(const objectName: String): IDispatch;
  var
    chEaten: Integer;
    BindCtx: IBindCtx;//for access to a bind context
    Moniker: IMoniker;//Enables you to use a moniker object
  begin
    OleCheck(CreateBindCtx(0, bindCtx));
    OleCheck(MkParseDisplayName(BindCtx, StringToOleStr(objectName), chEaten, Moniker));//Converts a string into a moniker that identifies the object named by the string
    OleCheck(Moniker.BindToObject(BindCtx, nil, IDispatch, Result));//Binds to the specified object
  end;

begin
   wmiHost       := '.';
   root          := 'root\CIMV2';
   wmiClass      := 'Win32_NetworkAdapterConfiguration';
   objWMIService := GetWMIObject(Format('winmgmts:\\%s\%s',[wmiHost,root]));
   colItems      := objWMIService.ExecQuery(Format('SELECT * FROM %s',[wmiClass]),'WQL',0);
   oEnum         := IUnknown(colItems._NewEnum) as IEnumVariant;
   i := 0;
   while oEnum.Next(1, colItem, iValue) = 0 do
   begin
      Item := View.Items.Add;
      item.Caption := Copy (colItem.Caption, 2, 8);

      Item.SubItems.Add (colItem.Description);
      Item.SubItems.Add (colItem.ServiceName);
      Item.SubItems.Add (VarToStrNil (colItem.MACAddress));
      if (VarToStrNil(colItem.MACAddress) <> '')
         then Item.SubItems.Add ('yes')
         else Item.SubItems.Add ('no');
      if colItem.IPEnabled
         then Item.SubItems.Add ('yes')
         else Item.SubItems.Add ('no');
     Item.SubItems.Add (VarToStrNil (colItem.SettingID));
     Item.SubItems.Add (IntToStr (colItem.InterfaceIndex));
   end; // if
end; // GetMacAddress //

Моя машина имеет один сетевой порт, но этот код находит 18 связанных с сетью портов/вещей/независимо от того. Среди них четыре MAC-адреса. Я предполагаю, что сетевой порт должен иметь IP-адрес, чтобы осталось два (обозначены MAC на изображении). Правильно ли предположить, что из отфильтрованных таким образом портов порт с наименьшим индексом является аппаратным портом?

enter image description here

Редактироватьна снимке выше: адаптер Realtek — единственный физический адаптер на машине. Другой адаптер — это виртуальный адаптер VirtualBox. Ответ TLama идентифицирует эти два адаптера, но есть ли способ найти адрес единственного физического (Realtek) адаптера?

Обновление 1EJP указал, что MAC-адрес может быть изменен. Это несколько подрывает мою цель, но поскольку я ищу решение, подходящее для большинства ситуаций, я решил жить с ним.

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

Обновление 2Превосходный список чтения TLama показывает, что, вероятно, не существует определенного способа определения физического адаптера.В статье, упомянутой в первом пункте, показано, как уменьшить количество адаптеров на основе некоторых простых предположений. В статье в третьем пункте показано, как выбрать адаптер, подключенный к шине PCI, что, собственно, я и хотел узнать. В статье упоминаются некоторые странные исключения, но я думаю, что в большинстве случаев это даст ответ.

Спасибо всем за участие!

6
задан Arnold 16 May 2012 в 08:13
поделиться