Конференция "Сети" » Список сетевых соединений в XP, отключение/включение адаптеров [D7, WinXP]
 
  • Dmitry (11.03.16 00:00) [0]
    Доброго времени суток, Уважаемые. Заранее прошу прощения за многабукаф, решил в одном посте три вопроса соединить.
    Очень простая задача - перечислить все активные сетевые соединения и определить через какие из них есть выход в интернет. Казалось бы все просто, но: нужно чтобы работало начиная с XP до Win10. Разбираюсь уже недели две. Собственно проблемы три.
    1. В XP SP3 что через выходные структуры GetAdaptersInfo(), что через структуры GetAdaptersAddresses() получаю тип интерфейса №6 (IF_TYPE_ETHERNET_CSMACD), хоть об стенку убейся. XP лицензионная, версия iphlpapi.dll - 5.1.2600.5512.
    "КОД ПОКАЖИ !" - да хотя бы пример Rouse_  netifenum отсюда http://rouse.drkb.ru/network.php. Только в нем все-таки нужно добавить

     // Типы адаптеров
     MIB_IF_TYPE_IEEE80211 = 71;
     MIB_IF_TYPE_WWANPP = 243;  // Mobile Broadband devices based on GSM technology
     MIB_IF_TYPE_WWANPP2 = 244; // Mobile Broadband devices based on CDMA technology

               MIB_IF_TYPE_IEEE80211 : AdapterType := 'MIB_IF_TYPE_IEEE80211';
               MIB_IF_TYPE_WWANPP :    AdapterType := 'MIB_IF_TYPE_WWANPP';
               MIB_IF_TYPE_WWANPP2  :  AdapterType := 'MIB_IF_TYPE_WWANPP2';


    Данный пример на XP SP3 кроме того что все интерфейсы показывает как MIB_IF_TYPE_ETHERNET так еще после каждого имени сетевой карты добавляет фразу "Минипорт планировщика пакетов" (например, D-Link AirPlus Xtreme G DWL-G132 Wireless USB Adapter(rev.A) - Минипорт планировщика пакетов). Хотя, если перейти в реестр по GUID (AdapterName), то никакого добавления к имени адаптера не видим. Как с этим бороться ? Может сам Александр aka Rouse_ что-нибудь дельное подскажет ?
    2. Сделал выключение/включение адаптеров (это если два и более) для XP при помощи SetIfEntry() и MIB_IF_ADMIN_STATUS_UP/DOWN, поскольку для Win7 и выше это не работает, реализовал при помощи WMI. Помучался с 64-бит правда, но вроде бы все работает, но есть одно НО: Ethernet соединение после включения восстанавливается нормально, а Wi-Fi может отвалиться от роутера, если не установлена галочка "Подключаться автоматически". Ну и с 3G модемами могут быть проблемы.
    После недели экспериментов и поисков в интернете нашел способ сделать при помощи SetupAPI (нашел пример на Си, перевести не проблема, тем более что с SetupAPI знаком), нашел упоминание что можно сделать при помощи Net Shell. Собственно вопрос: коммутируемые соединения в этих случаях так же разрываются (это если кто пробовал) ? Ведь нормально же XP "переносит" SetIfEntry() и MIB_IF_ADMIN_STATUS_UP/DOWN, ничего не "отваливается"....
    3. В структуре IP_ADAPTER_ADDRESSES

    IP_ADAPTER_ADDRESSES = record
     union: record
       case Integer of
         0: (Alignment: LongInt);
         1: (Length: LongInt; IfIndex: DWORD);
       end;
     Next : PIP_ADAPTER_ADDRESSES;
     AdapterName : PCHAR;
     FirstUnicastAddress : PIP_ADAPTER_UNICAST_ADDRESS;
     FirstAnycastAddress : PIP_ADAPTER_ANYCAST_ADDRESS;
     FirstMulticastAddress : PIP_ADAPTER_MULTICAST_ADDRESS;
     FirstDnsServerAddress : PIP_ADAPTER_DNS_SERVER_ADDRESS;
     DnsSuffix : PWCHAR;
     Description : PWCHAR;
     FriendlyName : PWCHAR;
     PhysicalAdress : PhysAddrArray;
     PhysicalAdressLength : DWORD;
     Flags : DWORD;
     Mtu : DWORD;
     IfType : DWORD;
     OperStatus : IF_OPER_STATUS;
     Ipv6IfIndex : DWORD;
     ZoneIndices : array[0..15] of DWORD;
     FirstPrefix : PIP_ADAPTER_PREFIX;
     TransmitLinkSpeed : Int64;
     ReceiveLinkSpeed : Int64;
    // FirstWinsServerAddress: PIP_ADAPTER_WINS_SERVER_ADDRESS_LH;
     FirstGatewayAddress : PIP_ADAPTER_GATEWAY_ADDRESS_LH;
     Ipv4Metric : LongInt;
     Ipv6Metric : LongInt;
    // Luid : IF_LUID;
     Dhcpv4Server : SOCKET_ADDRESS;
    // CompartmentId : NET_IF_COMPARTMENT_ID; [This member is not currently supported and is reserved for future use]
    // NetworkGuid : NET_IF_NETWORK_GUID;
     ConnectionType : NET_IF_CONNECTION_TYPE;
    // TunnelType : TUNNEL_TYPE;
     Dhcpv6Server : SOCKET_ADDRESS;
     Dhcpv6ClientDuid : array[0..MAX_DHCPV6_DUID_LENGTH - 1] of BYTE;
     Dhcpv6ClientDuidLength: LongInt;
     Dhcpv6Iaid : LongInt;
    // FirstDnsSuffix : PIP_ADAPTER_DNS_SUFFIX;
    end;


    есть FriendlyName - это название сетевого подключения. Но в системе (Win7 и выше - Центр управления сетями и общим доступом) есть еще и сетевое имя подключения, как правило это SSID Wi-Fi сети и название оператора 3G-сети, хотя его пользователь может и изменить. А это "Имя сети" откуда можно достать, не используя реестр ? Хотя я уже все равно манифест в ресурсы прописал (WMI требуют права админа), но все же, не люблю я копаться реестре почему-то...
  • Eraser © (11.03.16 00:13) [1]
    первое что нашел в гугле https://msdn.microsoft.com/en-us/library/windows/desktop/aa370803(v=vs.85).aspx

    подходит?

    для виста и выше вроде.
  • Rouse_ © (11.03.16 01:56) [2]
    Я точно ничего не подскажу, 10 лет прошло как демку писал, нужно поподробней взглянуть что поменялось
  • Dmitry (11.03.16 08:53) [3]
    [1]: Спасибо, попробую разобраться. Насколько я понял, нужно создавать COM-объект.
    [2]: Да ничего вроде бы не поменялось, кроме новых типов сетевых интерфейсов. Ну разве что вы пробовали на XP SP1, я сейчас такую и не найду даже, разве что дистрибутив пиратский где-нибудь в интернете завалялся...

    И еще один глюк с XP. Индекс сетевого соединения IfIndex для интерфейсов, отличающихся от MIB_IF_TYPE_ETHERNET выходит за пределы DWORD, т.е. может быть например 65540. Может мне кто-нибудь объяснить как работает данная конструкция в выходной структуре IP_ADAPTER_ADDRESSES функции GetAdaptersAddresses ?

     union: record
      case Integer of
         0: (Alignment: LongInt);
         1: (Length: LongInt; IfIndex: DWORD);
       end;


    Что такое case и record я знаю, конечно :-)
  • Eraser © (11.03.16 16:43) [4]

    > Dmitry   (11.03.16 08:53) [3]

    https://theroadtodelphi.wordpress.com/
  • Dmitry (14.03.16 16:22) [5]
    С NLM API в общем-то все понятно, на Win7 работает, на XP, как видно из кода примера (да и реально) - не работает. Тем не менее XP пишет в хинте при наведении на значок сетевого соединения в трее - и FriendlyName и (в скобках) SSID Wi-Fi сети.
    Хорошо. Значок в трее - сидящий в памяти процесс. Процесс - это программа, которая использует API, предоставляемые системными dll. Какими dll ??? Пока решаю - реализовывать или нет (точно так же - FriendlyName + (в скобках) SSID Wi-Fi сети.
    А по поводу п.1 исходного вопроса - никто ничего не знает ? Нашел один способ, но кривоооой ужасно... Единообразие мне нужно - пользователю должно быть пофиг какая у него ОС, у него на экране вне зависимости от ОС должна быть одна и та же информация.
  • имя (21.04.16 14:51) [6]
    Удалено модератором
  • имя (21.04.16 15:02) [7]
    Удалено модератором
  • имя (21.04.16 15:11) [8]
    Удалено модератором
  • имя (21.04.16 15:33) [9]
    Удалено модератором
 
Конференция "Сети" » Список сетевых соединений в XP, отключение/включение адаптеров [D7, WinXP]
Есть новые Нет новых   [118456   +60][b:0][p:0.002]