ищет 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 на изображении). Правильно ли предположить, что из отфильтрованных портов порт с наименьшим индексом является аппаратным портом?
Редактироват на снимке выше адаптера Realtek - единственный физический адаптер в машине. Другой адаптер - это VirtualBox Virtual Ada, Pter. Ответ TLama идентифицирует эти два адаптера, но есть ли способ найти адрес единственного физического (Realtek) адаптера?
Обновление 1 EJP указал, что MAC-адрес можно изменить. Это несколько подрывает мою цель, но, поскольку я ищу решение, подходящее для большинства ситуаций, я решил с этим смириться.
TLama и TOndrej указали на несколько решений. И то, и другое заканчивается тем, что физический адаптер не может быть найден без каких-либо сомнений.
Обновление 2ревосходный список чтения @ TLama показывает, что, вероятно, нет определенного способа определить физический адаптер. В статье, упомянутой в первом пункте, показано, как уменьшить количество адаптеров на основе простых предположений. В статье в третьем пункте показано, как выбрать адаптер, подключенный к шине PCI, и это именно то, что я хотел знать. Есть некоторые странные исключения, упомянутые в статье, но я думаю, что это даст ответ в большинстве случаев.
Спасибо всем за ваш вклад!