Определение типа сетевого адаптера через 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 для второго.

Ответ 4

select * from Win32_NetworkAdapter where NetConnectionID LIKE "%Wireless%" or NetConnectionID LIKE "%Wi-Fi%"