1. 概述
用C#/.Netframework检索计算机网卡,通常有两种方法:
- 使用静态方法 System.Net.NetworkInformation.GetAllNetworkInterfaces( )获取网络接口信息;
- 使用System.Management.ManagementObjectSearcher类枚举系统安装的网络适配器;
采用第1种方法的缺点是GetAllNetworkInterfaces无法获取被禁用的网卡;
2. 使用ManagementObjectSearcher检索物理网卡
2.1 查询Win32_NetworkAdapter类
MSDN文档明确表明不鼓励使用Win32_NetworkAdapter(原文The Win32_NetworkAdapter class is deprecated)。如果仍然想用Win32_NetworkAdapter检索物理网卡信息,代码如下:
using System.Management; // 需要添加引用System.Management程序集
string qry = @"SELECT * FROM Win32_NetworkAdapter WHERE Manufacturer!='Microsoft' AND NOT PNPDeviceID LIKE 'ROOT\\%'";
ManagementObjectSearcher mos = new ManagementObjectSearcher(qry3);
ManagementObjectCollection moc = mos.Get();
foreach (ManagementObject mo in moc)
{
bool enabled = Convert.ToBoolean(mo["NetEnabled"] ?? false)
string connectionId = mo["NetConnectionID"]?.ToString();
string name = mo["Name"]?.ToString();
string manufacturer = mo["Manufacturer"]?.ToString();
Console.WriteLine("-----------------------");
Console.WriteLine($"连接名称:{connectionId}");
Console.WriteLine($"驱动程序:{name}");
Console.WriteLine($" 启用:{enabled}");
Console.WriteLine($" 制造商:{manufacturer}");
}
运行结果
上述代码关键在查询字符串中WHERE子句给出的查询条件
1)Manufacturer != 'Microsoft' 排除了Microsoft提供的 tunneling, miniport, WAN等类型的虚拟网卡;
2)通常,在Windows系统中,非物理(虚拟)设备的PNPDeviceID以"ROOT\"开始;真实设备的PNPDeviceID以"PCI\"开始。因此 NOT PNPDeviceID LIKE 'ROOT\\%'" 排除了非物理(虚拟)网卡
2.2 查询MSFT_NetAdapter类
MSDN推荐使用MSFT_NetAdapter类查询网卡信息,代码如下:
using System.Management // 需要引用System.Management程序集
string qry = "SELECT * FROM MSFT_NetAdapter WHERE Virtual=False"
ManagementScope scope = new ManagementScope(@"\\.\ROOT\StandardCimv2");
ObjectQuery query = new ObjectQuery(qry);
ManagementObjectSearcher mos = new ManagementObjectSearcher(scope, query);
ManagementObjectCollection moc = mos.Get();
foreach (ManagementObject mo in moc)
{
string name = mo["Name"]?.ToString();
string driverDescription = mo["DriverDescription"]?.ToString();
uint mediaConnectState = Convert.ToUInt32(mo["MediaConnectState"] ?? 0);
uint state = Convert.ToUInt32(mo["State"] ?? 0);
Console.WriteLine("-----------------------");
Console.WriteLine($"连接名称:{name}");
Console.WriteLine($"驱动程序:{driverDescription}");
Console.WriteLine($"网线状态:{mediaConnectState}");
Console.WriteLine($" 启用:{state}");
}
注意查询字串中WHERE子句给出的查询条件"Virtual=False"非常直接且明确地排除了所有虚拟网卡!
运行结果
1)网线连接状态 MediaConnectState命名字段的类型为UInt32:0="未知";1="已连接";2="已断开"
2)网卡状态State命名字段的类型UInt32:0="未知";1="已存在";2="已启用";3="已禁用";
有关MSFT_NetAdapter类中各命名字段的含义,请参考MSDN
3. 总结
- 使用ManagementObjectSearcher查询MSFT_NetAdapter类,可以非常直接且明确地获得物理网卡(真实网卡)信息;
- 使用ManagementObjectSearcher查询Win32_NetworkAdapter类,虽然能够获取物理网卡信息,但是查询条件比较晦涩,而且,MSDN也不推荐使用Win32_NetworkAdapter类来查询网卡信息。