Как определить, является ли интерфейс физическим портом локальной сети на ПК с Windows? - PullRequest
5 голосов
/ 15 октября 2008

Я ищу способ точно определить, является ли интерфейс физическим портом Ethernet 802.3 на компьютере в Windows.

Используя ipconfig / all, я могу перечислить все интерфейсы, и когда я делаю это на моем компьютере, здесь могут быть перечислены несколько записей, включая VPN, Bluetooth, Wifi и физический интерфейс Ethernet.

Я ищу что-то вроде "isPhysical (interface)". (Можно использовать несколько физических сетевых портов, я просто хочу знать, физический это порт или нет).

ОБНОВЛЕНИЕ:

Джей и Крис, спасибо!

(Недостаточно места в комментариях, поэтому я опубликую здесь)

В настоящее время я рассматриваю использование WMI Win32_NetworkAdapter. Тем не менее, он показывает 4 интерфейса с AdapterType = "Ethernet 802.3".

У меня только 1 физический порт на моем компьютере, остальные имеют имя «Драйвер сетевых служб виртуальной машины». (Я предполагаю, что они установлены моей компанией по какой-то гнусной причине)

Я нашел нужный мне атрибут в интерфейсе, но он не доступен в winXP !!!

PhysicalAdapter Тип данных: логическое значение Тип доступа: только для чтения

Указывает, является ли адаптер физический или логический адаптер. Если Правда адаптер физический. Windows Server 2003, Windows XP, Windows 2000, и Windows NT 4.0: это свойство нет в наличии.

Есть ли способ определить, является ли это физическим портом, кроме выполнения текстового фильтра для слова "Виртуальный" в имени?

ОБНОВЛЕНИЕ 12/08

Похоже, что виртуальные интерфейсы добавляются, когда у вас установлена ​​виртуальная машина.

Вот некоторые подробности о виртуальном адаптере: http://blogs.msdn.com/virtual_pc_guy/archive/2005/04/01/404816.aspx

Найдена проблема, из-за которой, если у пользователя нет прав администратора, интерфейс WMI не возвращает необходимые данные. Итак, теперь посмотрим на метод GetAdapterInfo. Однако, похоже, что к описанию фактического адаптера добавлен «драйвер служб виртуальной машины», что делает проверку «виртуальной» текста недействительной.

И структура, возвращаемая GetAdapterInfo:

http://msdn.microsoft.com/en-us/library/aa366062(VS.85).aspx

Ответы [ 5 ]

4 голосов
/ 15 октября 2008

Вызовите GetIfEntry и найдите dwType IF_TYPE_ETHERNET_CSMACD в структуре MIB_IFROW .

Или в .NET найдите System.Net.NetworkInformation.NetworkInterface с NetworkInterfaceType Ethernet.

2 голосов
/ 15 октября 2008

Лучший способ, который я когда-либо видел в любой системе Windows 2000 SP2 и выше, - это использование WMI.

http://msdn.microsoft.com/en-us/library/aa394582(VS.85).aspx

Win32_NetworkAdapter http://msdn.microsoft.com/en-us/library/aa394216(VS.85).aspx

И вы можете использовать пространство имен System.Net.NetworkInformation, которое упоминал Джей. Вот ссылка для определения того, какие сетевые карты подключены или отключены:

http://felizk.dk/?p=43

0 голосов
/ 22 октября 2008

Проверьте интерфейс через: Вызовите GetIfEntry и найдите dwType IF_TYPE_ETHERNET_CSMACD в возвращенной структуре MIB_IFROW.

Или в .NET найдите System.Net.NetworkInformation.NetworkInterface с типом NetworkInterfaceType Ethernet.

И проверьте, содержит ли имя текст «Виртуальный».

--- Это похоже на неудачный способ проверки, но пока это единственный способ игнорировать эти виртуальные адаптеры 802.3.

0 голосов
/ 15 октября 2008

Я не уверен в ответе - но имейте в виду, что возможно иметь несколько интерфейсов Ethernet.

0 голосов
/ 15 октября 2008

Если у машины есть две сетевые карты, как вы выберете, какая из них подходит? Единственный способ сделать это - дать пользователю выпадающий список с IP-адресом каждого интерфейса. См. Wireshark для примера -

Если есть другие решения, я бы хотел их услышать -

...