区分VMware网络适配器与物理网络适配器 - 或 - 检测虚拟网络适配器

时间:2010-06-17 14:33:41

标签: c windows networking vmware nic

我必须使用任何Windows API来区分真实地址和VM地址。 我正在使用GetAdaptersAddresses API来填充本地计算机的IP地址列表。除了与VMware网络适配器关联的地址和其他地址(自动配置和隧道适配器地址)之外,我只需要提取“真实”地址。我无法找到任何API或任何标志来区分它。有什么方法可以做到吗?

PS IfType返回的IP_ADAPTER_ADDRESSES结构中的GetAdaptersAddresses标记无法帮助我区分VMware地址和实际地址。

3 个答案:

答案 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;
        }