我想使用唯一标识符来确定我的应用程序是否移动到另一台计算机。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 虚拟适配器。TLama 的答案识别了这两个适配器,但是有没有办法找到唯一的物理(Realtek)适配器的地址?
Update 1 EJP 指出可以更改 MAC 地址。这在某种程度上破坏了我的目的,但是当我正在寻找适合大多数情况的解决方案时,我决定接受它。
TLama 和 TOndrej 指出了几种解决方案。两者最终都会出现毫无疑问无法找到物理适配器的情况。
Update 2 TLama 的优秀阅读列表显示,可能没有确定物理适配器的方法。第一个项目符号中提到的文章展示了如何基于一些简单的假设来缩减适配器的数量。第三个项目中的文章展示了如何选择连接到 PCI 总线的适配器,这实际上正是我想知道的。文章中提到了一些奇怪的例外,但我认为这将在大多数情况下提供答案。
感谢大家的贡献!