szukanie adresu MAC adaptera fizycznego

Chciałbym użyć unikalnego identyfikatora, aby ustalić, czy moja aplikacja została przeniesiona na inny komputer. Adres MAC wydaje się być odpowiedni do tego celu. Kod, którego używam, jest następujący:

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 //

Mój komputer ma jeden port sieciowy, ale ten kod znajduje 18 portów związanych z siecią / rzeczy / cokolwiek. Wśród nich są cztery adresy MAC. Zakładam, że port sieciowy powinien mieć włączoną obsługę IP, aby pozostawić dwa pozostałe (oznaczone na obrazie MAC). Czy poprawne jest założenie, że z tak przefiltrowanych portów tym, który ma najniższy indeks, jest port sprzętowy?

Edytować w migawce powyżej adaptera Realtek jest jedynym fizycznym adapterem w komputerze. Drugim adapterem jest wirtualny adapter VirtualBox. Odpowiedź TLama identyfikuje te dwa adaptery, ale czy istnieje sposób na znalezienie adresu jedynego adaptera fizycznego (Realtek)?

Aktualizacja 1 EJP wskazał, że adres MAC można zmienić. To nieco podważa mój cel, ale ponieważ szukam rozwiązania pasującego do większości sytuacji, postanowiłem z tym żyć.

TLama i TOndrej wskazali na kilka rozwiązań. Oba kończą się sytuacją, w której fizycznego adaptera nie można znaleźć bez wątpienia.

Aktualizacja 2 Znakomita lista czytelnicza TLamy pokazuje, że prawdopodobnie nie ma określonego sposobu określenia adaptera fizycznego. Artykuł wspomniany w pierwszym punkcie pokazuje, jak zmniejszyć liczbę adapterów w oparciu o proste założenia. Artykuł w trzecim punkcie pokazuje, jak wybrać adapter podłączony do magistrali PCI, co w rzeczywistości jest dokładnie tym, co chciałem wiedzieć. Istnieją pewne dziwne wyjątki wymienione w artykule, ale myślę, że w większości przypadków dostarczy to odpowiedzi.

Dziękuję wszystkim za Twój wkład!

questionAnswers(2)

yourAnswerToTheQuestion