Вопрос по .net, c# – Определите тип сетевого адаптера через WMI

10

Я использую WMI (Win32_NetworkAdapter) и пытаюсь получить подробную информацию о подключенных физических сетевых адаптерах, проводных или беспроводных, и избегать виртуальных адаптеров и т. Д.

чтениеЭта статья это объясняет, что вам нужно выполнить некоторые умные запросы к WMI, чтобы исключить виртуальные адаптеры и попытаться вернуть только реальные физические адаптеры.

чтениеэта почта это объясняет, что вы можете сравнить текст в & quot; Описание & quot; сетевого адаптера, чтобы увидеть, включает ли он «Wireless», «802.11» или «WLAN», если он есть, то, скорее всего, адаптер является беспроводным адаптером.

С сегодняшними версиями .Net и другими усовершенствованиями, действительно ли они являются единственными двумя способами определения в Windows XP +, является ли сетевой адаптер проводным или беспроводным, и не является ли виртуальный адаптер от программного обеспечения VM или подобного? Если нет, пожалуйста, объясните.

Вы ищете только решения, связанные с WMI? M.Babcock
msdn.microsoft.com/en-us/library/windows/desktop/… Win32_NetworkAdapter.PhysicalAdapter Windows Server 2003, Windows XP, Windows 2000 и Windows NT 4.0: это свойство недоступно. AdapterTypeID не является надежным, поскольку у меня есть ноутбук, и WMI возвращает его как не беспроводной. ScottN
Желательно да. Мой существующий проект использует WMI с .Net достаточно широко, чтобы получить информацию об адаптере, как он есть. Если есть другие варианты, я хотел бы знать, но не уверен, что буду реализовывать. ScottN
Используя WMI, вы не можете просто фильтровать на основеWin32_NetworkAdapter.PhysicalAdapter (должно быть ложным, если интерфейс виртуальный), а затем использоватьAdapterTypeID определить, является ли он проводным или беспроводным? Я просмотрел статью, которую вы опубликовали, и их критерии необоснованны. M.Babcock

Ваш Ответ

3   ответа
0


http://weblogs.sqlteam.com/mladenp/archive/2010/11/04/find-only-physical-network-adapters-with-wmi-win32_networkadapter-class.aspx  определить тип сетевого адаптера через WMI, используя класс ManagementObjectSearcher

Error: User Rate Limit Exceeded ScottN
2

MSFT_NetAdapter в'root\StandardCimv2' Пространство имен. Этот класс был введен вWindows 8.

Мы можем использовать собственностьConnectorPresent фильтровать только по физическим адаптерам. Далее мы должны устранить Wi-Fi адаптеры (которые присутствуют среди физических адаптеров), мы можем использоватьInterfaceType и / илиNdisPhysicalMedium свойства.

InterfaceType определено Internet Assigned Names Authority (IANA) и для всех Ethernet-подобных интерфейсов имеет значениеethernetCsmacd (6) (увидетьhttps://www.iana.org/assignments/ianaiftype-mib/ianaiftype-mib).

ВNdisPhysicalMedium для значений адаптеров Ethernet0 или же802.3 (14).

Так что мое решение для этого в C #:

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
}
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded ScottN
1

нашел ответ в другом месте в интернете, который дает описание того, как это можно сделать (прокрутите все до комментариев).

Метод комментария позволяет идентифицировать интерфейсы WiFi и Bluetooth, где все другие типы могут быть сгруппированы вместе. Если цель состоит только в том, чтобы отделить WiFi от адаптеров 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 и большинства других типов адаптеров.

Похоже, что объединение этих двух запросов должно быть сделано вручную в сценарии, используяName или жеDescription свойство первого запроса иInstanceName собственность вторая.

Похожие вопросы