Suche nach einer MAC-Adresse eines physischen Adapters

Ich möchte eine eindeutige Kennung verwenden, um festzustellen, ob meine Anwendung auf einen anderen Computer verschoben wurde. Die MAC-Adresse scheint für diesen Zweck geeignet zu sein. Der Code, den ich benutze, ist folgender:

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

Mein Computer hat einen Netzwerkanschluss, aber dieser Code findet 18 netzwerkbezogene Anschlüsse / Dinge / was auch immer. Darunter befinden sich vier MAC-Adressen. Ich gehe davon aus, dass ein Netzwerkport IP-fähig sein sollte, sodass zwei übrig bleiben (im Bild mit MAC gekennzeichnet). Ist es richtig anzunehmen, dass von den so gefilterten Ports der mit dem niedrigsten Index der Hardware-Port ist?

Bearbeiten In der obigen Momentaufnahme ist der Realtek-Adapter der einzige physische Adapter auf dem Computer. Der andere Adapter ist der virtuelle VirtualBox-Adapter. Die Antwort von TLama identifiziert diese beiden Adapter. Gibt es eine Möglichkeit, die Adresse des einzigen physischen Adapters (Realtek) zu ermitteln?

Update 1 EJP wies darauf hin, dass die MAC-Adresse geändert werden kann. Dies untergräbt etwas meinen Zweck, aber da ich nach einer Lösung suche, die für die meisten Situationen geeignet ist, habe ich mich entschlossen, damit zu leben.

TLama und TOndrej wiesen auf verschiedene Lösungen hin. Beides führt dazu, dass ein physischer Adapter ohne Zweifel nicht gefunden werden konnte.

Update 2 Die ausgezeichnete Leseliste von TLama zeigt, dass es wahrscheinlich keinen bestimmten Weg gibt, den physischen Adapter zu bestimmen. Der im ersten Aufzählungszeichen erwähnte Artikel zeigt, wie die Anzahl der Adapter auf der Grundlage einiger einfacher Annahmen verringert werden kann. Der Artikel im dritten Punkt zeigt, wie man den Adapter auswählt, der an den PCI-Bus angeschlossen ist, was genau das ist, was ich wissen wollte. Es gibt einige seltsame Ausnahmen, die im Artikel erwähnt werden, aber ich denke, dies wird in den meisten Fällen eine Antwort liefern.

Vielen Dank für Ihre Beiträge!

Antworten auf die Frage(2)

Ihre Antwort auf die Frage