Vorrei utilizzare un identificatore univoco per determinare se la mia applicazione è stata spostata su un altro computer. L'indirizzo MAC sembra adatto a questo scopo. Il codice che uso è questo:cercare un indirizzo MAC di un adattatore fisico
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 //
La mia macchina ha una porta di rete, ma questo codice trova 18 porte di rete correlati/cose/qualunque cosa. Tra questi ci sono quattro indirizzi MAC. Presumo che una porta di rete debba essere abilitata per IP in modo da lasciare due left (etichettati MAC nell'immagine). È corretto assumere che delle porte così filtrate, quella con l'indice più basso sia la porta hardware?
Modifica nell'istantanea sopra l'adattatore Realtek è l'unica scheda fisica nella macchina. L'altro adattatore è l'adattatore virtuale VirtualBox. La risposta di TLama identifica questi due adattatori, ma esiste un modo per trovare l'indirizzo dell'unico adattatore fisico (Realtek)?
Aggiornamento 1 EJP ha sottolineato che l'indirizzo MAC può essere modificato. Questo in qualche modo mina il mio scopo, ma mentre sto cercando una soluzione adatta alla maggior parte delle situazioni ho deciso di conviverci.
TLama e TOndrej hanno indicato diverse soluzioni. Entrambe finiscono con una situazione in cui non è stato possibile trovare un adattatore fisico senza alcun dubbio.
Aggiornamento 2 L'eccellente elenco di lettura di TLama mostra che probabilmente non esiste un determinato modo per determinare l'adattatore fisico. L'articolo menzionato nel primo punto mostra come ridurre la quantità di adattatori in base a semplici presupposti. L'articolo nel terzo punto mostra come selezionare l'adattatore connesso al bus PCI, che è in effetti esattamente quello che volevo sapere. Ci sono alcune strane eccezioni menzionate nell'articolo, ma penso che questo fornirà una risposta nella maggior parte dei casi.
Grazie a tutti per i vostri contributi!
Buon punto, ho adottato il tuo suggerimento. Grazie. – Arnold
L'indirizzo MAC non è adatto a questo scopo. Può essere modificato dall'utente. – EJP
@EJP, qualsiasi puntatore a quello? – Arnold