一、判断网卡是物理网卡,或者是虚拟网卡,有以下方式:
WMI方式:
/// <summary>
/// Get:是否为物理网络适配器(WMI方式)
/// </summary>
/// <param name="nicKey">适配器标识值</param>
/// <returns></returns>
public static bool? IsPhysicalNICByWMI(string nicKey)
{
string queryString = $"SELECT * FROM Win32_NetworkAdapter WHERE Guid ='{nicKey}' ";
using (var _searcher = new ManagementObjectSearcher(queryString))
{
foreach (ManagementObject item in _searcher.Get())
{
//var _PhysicalAdapter = item["PhysicalAdapter"];
var _value = item["PhysicalAdapter"];
if (_value == null) { continue; }
var _valueString = _value.ToString().ToUpper();
return _valueString == "TRUE";
}
}
return null;
}
注册表方式:
/// <summary>
/// Get:是否为物理网络适配器(Registry方式)
/// </summary>
/// <param name="nicKey">适配器标识值</param>
/// <returns></returns>
public static bool? IsPhysicalNICByRegistry(string nicKey)
{
const string C_REGISTRY_NETWORK_PATH = @"SYSTEM\CurrentControlSet\Control\Network\{4D36E972-E325-11CE-BFC1-08002BE10318}";
var _rootPath = $@"{C_REGISTRY_NETWORK_PATH}\{nicKey}";
#region Characteristics
{
//const string C_REGISTRY_NETWORK_PATH = @"SYSTEM\CurrentControlSet\Control\Network\{4D36E972-E325-11CE-BFC1-08002BE10318}";
//var _path = $@"{C_REGISTRY_NETWORK_PATH}\{nicKey}";
var _path = _rootPath;
var _rKey = Registry.LocalMachine.OpenSubKey(_path, false);
if (_rKey != null)
{
//说明组件是个虚拟适配器
const int NCF_VIRTUAL = 0x1;
//说明组件是一个物理适配器
const int NCF_PHYSICAL = 0x4;
var _value = _rKey.GetValue("Characteristics");
if (_value != null)
{
if (int.TryParse(_value.ToString(), out int _number))
{
if ((_number & NCF_PHYSICAL) == NCF_PHYSICAL)
{
return true;
}
else if ((_number & NCF_PHYSICAL) == NCF_VIRTUAL)
{
return false;
}
else
{
return false;
}
}
}
}
}
#endregion
#region PnpInstanceID
{
var _path = $@"{_rootPath}\Connection";
var _rKey = Registry.LocalMachine.OpenSubKey(_path, false);
if (_rKey != null)
{
// 区分 PnpInstanceID
// 如果前面有 PCI 就是本机的真实网卡
string _pnpInstanceID = _rKey.GetValue("PnpInstanceID", "").ToString();
var _pnp = _pnpInstanceID.Remove(_pnpInstanceID.IndexOf('\\')).ToUpper();
switch (_pnp)
{
case "PCI":
case "USB": { return true; }
default:
{
if (!string.IsNullOrWhiteSpace(_pnpInstanceID)) { return false; }
}
break;
}
}
}
#endregion
return null;
}
二、判断网卡是否为无线网卡
/// <summary>
/// Get:是否为无线网络适配器(Registry方式)
/// </summary>
/// <param name="nicKey">适配器标识值</param>
/// <returns></returns>
public static bool? IsWirelessNICByRegistry(string nicKey)
{
const string C_REGISTRY_NETWORK_PATH = @"SYSTEM\CurrentControlSet\Control\Network\{4D36E972-E325-11CE-BFC1-08002BE10318}";
var _path = $@"{C_REGISTRY_NETWORK_PATH}\{nicKey}\Connection";
var _rKey = Registry.LocalMachine.OpenSubKey(_path, false);
if (_rKey != null)
{
// MediaSubType 为 01 则是常见网卡,02为无线网卡。
int _MediaSubType = Convert.ToInt32(_rKey.GetValue("MediaSubType", 0));
switch (_MediaSubType)
{
case 1: { return false; }
case 2: { return true; }
}
}
return null;
}