用 C#/.Net Framework 获取系统真实物理网卡

1. 概述

用C#/.Netframework检索计算机网卡,通常有两种方法:

  1. 使用静态方法 System.Net.NetworkInformation.GetAllNetworkInterfaces( )获取网络接口信息;
  2. 使用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. 总结

  1. 使用ManagementObjectSearcher查询MSFT_NetAdapter类,可以非常直接且明确地获得物理网卡(真实网卡)信息;
  2. 使用ManagementObjectSearcher查询Win32_NetworkAdapter类,虽然能够获取物理网卡信息,但是查询条件比较晦涩,而且,MSDN也不推荐使用Win32_NetworkAdapter类来查询网卡信息。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值