gpt4 book ai didi

c# - 通过 WMI 确定网络适配器类型

转载 作者:可可西里 更新时间:2023-11-01 09:13:50 25 4
gpt4 key购买 nike

我正在使用 WMI (Win32_NetworkAdapter) 并尝试获取连接的有线或无线物理网络适配器的详细信息,并避免使用虚拟适配器等。

阅读 this article它解释说您必须对 WMI 进行一些巧妙的查询以消除虚拟适配器并尝试仅返回真实的物理适配器。

阅读 this post它解释说,您可以比较网络适配器“描述”中的文本,看它是否包含“无线”、“802.11”或“WLAN”,如果包含,则很可能该适配器是无线适配器。

随着今天的 .Net 版本和其他进步,这些真的是在 Windows XP+ 上确定网络适配器是有线还是无线并且不是来自 VM 软件或类似软件的虚拟适配器的仅有的两种方法吗?如果不是,请解释。

最佳答案

您可以在 'root\StandardCimv2' 命名空间中使用新的 WMI 类 MSFT_NetAdapter。此类是在 Windows 8 中引入的。

我们可以使用属性 ConnectorPresent 仅过滤物理适配器。接下来我们必须消除 Wi-Fi 适配器(存在于物理适配器中),我们可以使用 InterfaceType 和/或 NdisPhysicalMedium 属性。

InterfaceType 由互联网名称分配机构 (IANA) 定义,对于所有类似以太网的接口(interface),值为 ethernetCsmacd (6)(参见 https://www.iana.org/assignments/ianaiftype-mib/ianaiftype-mib)。

NdisPhysicalMedium 中用于以太网适配器值 0802.3 (14)

所以我在 C# 中的解决方案是:

try
{
var objectSearcher = new ManagementObjectSearcher("root\\StandardCimv2", $@"select Name, InterfaceName, InterfaceType, NdisPhysicalMedium from MSFT_NetAdapter where ConnectorPresent=1"); //Physical adapter

int count = 0;
foreach (var managementObject in objectSearcher.Get())
{
//The locally unique identifier for the network interface. in InterfaceType_NetluidIndex format. Ex: Ethernet_2.
string interfaceName = managementObject["InterfaceName"]?.ToString();
//The interface type as defined by the Internet Assigned Names Authority (IANA).
//https://www.iana.org/assignments/ianaiftype-mib/ianaiftype-mib
UInt32 interfaceType = Convert.ToUInt32(managementObject["InterfaceType"]);
//The types of physical media that the network adapter supports.
UInt32 ndisPhysicalMedium = Convert.ToUInt32(managementObject["NdisPhysicalMedium"]);

if (!string.IsNullOrEmpty(interfaceName) &&
interfaceType == 6 && //ethernetCsmacd(6) --for all ethernet-like interfaces, regardless of speed, as per RFC3635
(ndisPhysicalMedium == 0 || ndisPhysicalMedium == 14)) //802.3
{
count++;
}
}

return count;
}
catch (ManagementException)
{
//Run-time requirements WMI MSFT_NetAdapter class is included in Windows 8 and Windows Server 2012
}

关于c# - 通过 WMI 确定网络适配器类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10114455/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com