我想用一个唯一的标识符,以确定我的应用程序是否移动到不同的计算机。 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的答案识别这两个适配器,但有没有办法找到的唯一的物理(瑞昱)适配器的地址?
更新1 EJP指出的MAC地址可以被改变。 这一定程度上破坏了我的目的,但我正在寻找一个适合我决定住它大多数情况下的解决方案。
TLama和TOndrej指出了几种解决方案。 无论最终与物理适配器不能毫无疑问地发现的情况。
更新2 TLama出色的阅读清单显示,有可能是没有一定的方法来确定物理适配器。 在第一颗子弹文章提到了如何收缩适配器基于一些简单的假设量。 在第三颗子弹的文章展示了如何选择连接到PCI总线,这实际上正是我想知道的适配器。 有文章中提到一些奇怪的例外情况,但我认为这将提供在大多数情况下的答案。
感谢大家的贡献!