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

Posted

技术标签:

【中文标题】将 VMware 网络适配器与物理网络适配器区分开来 - 或 - 检测虚拟网络适配器【英文标题】:Differentiate VMware network adapter from physical network adapters -or- Detect Virtual Network Adaptor 【发布时间】:2011-03-05 00:07:17 【问题描述】:

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

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

【问题讨论】:

请参考以下链接了解更多详情。 codesanitize.com/2021/04/… 【参考方案1】:

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

编辑 更清楚地说,如果一个接口的MAC address 以上述任何给定的字符串开头,那么它就是虚拟的。

【讨论】:

只是想添加一些链接:使用此链接 - standards.ieee.org/regauth/oui/index.shtml 查找 id 预订。可以在这里进行反向操作:coffer.com/mac_find 这并不能完全回答这个问题:我们如何从公司名称中知道它是否是虚拟的? “来自公司名称”是什么意思? 为什么 VirtualBox MAC 地址没有在任何地方列出? VBox 5 使用的0A:00:27 没有在任何地方列出!旧的08:00:27 被列为“Cadmus 计算机系统”。 code.wireshark.org/review/… 详情请参考以下链接。 codesanitize.com/2021/04/…【参考方案2】:

在阅读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),我会认为它是虚拟网络适配器。

【讨论】:

如何处理非英文的“描述”?【参考方案3】:

您可以在下面的方法中传递 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;
        

【讨论】:

以上是关于将 VMware 网络适配器与物理网络适配器区分开来 - 或 - 检测虚拟网络适配器的主要内容,如果未能解决你的问题,请参考以下文章

VMware网络适配器设置

ESXi6.5设置 iSCSI 网络

VMware网络适配器的选择

VMware虚拟机网络适配器使用记录

VMware虚拟机网络适配器使用记录

vsphere网络