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

16

我需要使用任何Windows API来区分真实地址和VM地址。

我正在使用GetAdaptersAddresses API为本地计算机填充IP地址列表。我需要提取“真实”地址,而不是与VMware网络适配器和其他地址(自动配置和隧道适配器地址)相关联的地址。我没有找到任何API或任何标志来区分这一点。是否有任何方法可以实现这一点?

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


请参考以下链接获取更多详细信息。http://www.codesanitize.com/2021/04/c-how-to-get-network-adapter-status.html - Tony Stark
3个回答

17

MAC地址的前三段(即OUI)可以显示接口是否为虚拟接口:

"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

编辑
更加清晰地说,如果接口的MAC地址以上述任何字符串之一开头,则它是虚拟的。


2
只想添加一些链接:使用此链接 - http://standards.ieee.org/regauth/oui/index.shtml 查找ID保留。 反向操作可以在此处执行:http://coffer.com/mac_find/ - Andrey
这并不完全回答了问题:我们如何从公司名称中知道它是否是虚拟的? - Gyuri
“从公司名称”是什么意思? - clyfe
1
为什么VirtualBox的MAC地址没有在任何地方列出?VBox 5使用的“0A:00:27”没有在任何地方列出!旧的“08:00:27”被列为“Cadmus Computer Systems”。 https://code.wireshark.org/review/gitweb?p=wireshark.git;a=blob_plain;f=manuf - Ajay
请参考以下链接以获取更多详细信息:http://www.codesanitize.com/2021/04/c-how-to-get-network-adapter-status.html - Tony Stark

3

您可以将NetworkInterface传递给以下方法,它将返回一个布尔值来指示该网卡是否是物理网卡。

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

请注意内存泄漏:ManagementObjectSearcher是可处理的。 - DAG
为什么在我们只需要获取第一个值时,foreach会直接中断呢?如果是这样的话,最好使用FirstOrDefault来获取它。 - undefined

2
我在阅读clyfe的回答后找到了一个获取更完整的MAC地址前缀列表的网站。
请访问:供应商/以太网/蓝牙MAC地址查询和搜索 例如:VirtualBox有17个MAC前缀!
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

最后,我更倾向于从“网络适配器描述”中检测虚拟网络适配器。如果我在它的描述(C++:IP_ADAPTER_INFO::Description)中看到“Virtual”或“VMWare”一词,我会假定它是虚拟网络适配器。

1
如何处理非英语“描述”? - Ajay

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接