Определение типа сетевого адаптера через WMI
Я использую WMI (Win32_NetworkAdapter) и пытаюсь получить информацию о подключенных физических сетевых адаптерах как проводными, так и беспроводными и избегать виртуальных адаптеров и т.д.
Чтение в этой статье объясняет, что вам нужно сделать некоторые умные запросы на WMI для устранения виртуальных адаптеров и попытаться вернуть только реальные физические адаптеры.
Чтение этого сообщения в нем объясняется, что вы можете сравнить текст в "описании" сетевого адаптера, чтобы узнать, включает ли он "Wireless", "802.11" или "WLAN", если это так, то, скорее всего, адаптер является беспроводным адаптером.
С сегодняшними версиями .Net и другими достижениями, действительно ли это единственные два способа определения в Windows XP +, если сетевой адаптер подключен или подключен к беспроводной сети и не является виртуальным адаптером из программного обеспечения VM или тому подобного? Если нет, объясните.
Ответы
Ответ 1
Вы можете использовать новое пространство имен WMI MSFT_NetAdapter в "root\StandardCimv2. Этот класс был представлен в Windows 8.
Мы можем использовать свойство ConnectorPresent для фильтрации только для физических адаптеров.
Затем мы должны устранить адаптеры Wi-Fi (которые присутствуют между физическими адаптерами), мы можем использовать свойства InterfaceType и/или NdisPhysicalMedium.
InterfaceType определяется полномочиями назначенных им ресурсов Интернета (IANA), а для всех интерфейсов, подобных Ethernet, значение ethernetCsmacd (6) (см. https://www.iana.org/assignments/ianaiftype-mib/ianaiftype-mib).
В NdisPhysicalMedium для сетевых адаптеров значения 0 или 802.3 (14).
Итак, мое решение для этого в С#:
try
{
var objectSearcher = new ManagementObjectSearcher("root\\StandardCimv2", [email protected]"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
}
Ответ 2
Я вижу, что это старый вопрос, но я нашел ответ в другом месте в Интернете, в котором дается описание того, как это можно сделать (прокрутите весь путь до комментариев).
Метод comment-er позволяет идентифицировать интерфейсы WiFi и Bluetooth, где все остальные типы могут быть сгруппированы вместе. Если целью является только разделение Wi-Fi от адаптеров Ethernet, этого должно быть достаточно.
Запросы (образец Powershell):
$nics = Get-WmiObject -Namespace "root/CIMV2" -Query "SELECT * FROM Win32_NetworkAdapter"
$types = Get-WmiObject -Namespace "root/WMI" -Query "SELECT * FROM MSNdis_PhysicalMediumType"
Первый запрос - это общий подход, который предоставит список адаптеров. Как уже отмечалось ранее, его можно фильтровать только для включения действительных физических устройств по ряду других критериев выбора.
Второй запрос возвращает объект WMI с свойством NdisPhysicalMediumType
, который согласно связанному сайту имеет значение 9 для WiFi, 10 для Bluetooth и 0 для Ethernet и большинства других типов адаптеров.
Похоже, что объединение этих двух запросов должно выполняться вручную в script с использованием свойств Name
или Description
для первого запроса и свойства InstanceName
для второго.
Ответ 3
Возможно, это поможет вам
http://weblogs.sqlteam.com/mladenp/archive/2010/11/04/find-only-physical-network-adapters-with-wmi-win32_networkadapter-class.aspx, чтобы определить тип сетевого адаптера через WMI, используя класс ManagementObjectSearcher
Ответ 4
select * from Win32_NetworkAdapter where NetConnectionID LIKE "%Wireless%" or NetConnectionID LIKE "%Wi-Fi%"