15

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

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

4

3 回答 3

17

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 地址以上述任何给定的字符串开头,那么它是虚拟的。

于 2010-06-17T14:47:39.537 回答
3

在阅读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

最后,我更喜欢从其“网卡描述”中检测虚拟网络适配器。如果我在描述中看到“虚拟”或“VMWare”字样(C++:IP_ADAPTER_INFO::Description),我会假设它是虚拟网络适配器。

于 2016-01-01T14:43:01.577 回答
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;
        }
于 2020-12-01T12:11:32.203 回答