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!