我必须使用任何Windows API来区分真实地址和VM地址。
我正在使用GetAdaptersAddresses
API来填充本地计算机的IP地址列表。除了与VMware网络适配器关联的地址和其他地址(自动配置和隧道适配器地址)之外,我只需要提取“真实”地址。我无法找到任何API或任何标志来区分它。有什么方法可以做到吗?
PS :IfType
返回的IP_ADAPTER_ADDRESSES
结构中的GetAdaptersAddresses
标记无法帮助我区分VMware地址和实际地址。
答案 0 :(得分:16)
mac地址的开头(前3个段)显示接口是否为虚拟:
"00:05:69"; //vmware1
"00:0C:29"; //vmware2
"00:50:56"; //vmware3
"00:1C:42"; //parallels1
"00:03:FF"; //microsoft virtual pc
"00:0F:4B"; //virtual iron 4
"00:16:3E"; //red hat xen , oracle vm , xen source, novell xen
"08:00:27"; //virtualbox
EDIT
更清楚的是,如果一个接口的MAC address以任何上面给定的字符串开头,那么它就是虚拟的。
答案 1 :(得分:3)
我在找到clyfe回答后找到了一个网站,可以获得更完整的MAC地址前缀列表。
请访问:Vendor/Ethernet/Bluetooth MAC Address Lookup and Search
例如:VirtualBox has 17 MAC prefix!
Prefix Vendor
000F4B Virtual Iron Software, Inc. (was: Katana Technology)
001307 Paravirtual Corporation (was: Accenia, Inc.)
0013BE Virtual Conexions
0021F6 Virtual Iron Software
00240B Virtual Computer Inc.
00A0B1 First Virtual Corporation
00E0C8 virtual access, ltd.
545200 linux kernal virtual machine (kvm)
000F4B Virtual Iron Software, Inc. (was: Katana Technology)
001307 Paravirtual Corporation (was: Accenia, Inc.)
0013BE Virtual Conexions
0021F6 Oracle Corporation (was: Virtual Iron Software)
00240B Virtual Computer Inc.
00A0B1 First Virtual Corporation
00E0C8 virtual access, ltd.
18922C Virtual Instruments
3CF392 Virtualtek. Co. Ltd
最后,我更喜欢从“网卡描述”中检测虚拟网络适配器。 如果我在其描述中看到“虚拟”或“VMWare”字样(C ++:IP_ADAPTER_INFO :: Description),我将假设它是虚拟网络适配器。
答案 2 :(得分:1)
您可以通过以下方法传递NetworkInterface,它将返回布尔值以指示NIC是否为物理。
private static bool IsPhysicalAdapter(NetworkInterface ni)
{
bool isPhysical = false;
ManagementObjectSearcher searcher = new
ManagementObjectSearcher(@"root\CIMV2",
string.Format(@"SELECT * FROM Win32_NetworkAdapter
WHERE GUID='{0}' AND NOT PNPDeviceID LIKE 'ROOT\\%'",
ni.Id));
foreach (ManagementObject share in searcher.Get())
{
isPhysical =
Convert.ToBoolean(share.Properties["PhysicalAdapter"].Value);
break;
}
return isPhysical;
}