none
Статус сетевого соединения & WMI RRS feed

  • Общие обсуждения

  •  

    Как получить статус сетевого соединения?

     

    Пробовал так:

    Code Snippet

     

    PS c:\>gwmi win32_networkadapter | where ?{ $_.servicename -match 'pppoe' } | select *status*

     

    Availability        : 3
    Name                : Минипорт WAN (PPPoE)
    Status              :
    StatusInfo          :
    DeviceID            : 6
    NetConnectionStatus :

     

     

     

    Предположим, что производитель позаботился о сохранении данных в соответствующих свойствах.

    По какми причинам wmi может не получить значение некоторых свойств?

    22 марта 2008 г. 19:34

Все ответы

  • Наверное ServiceName должен быть "RasPppoe"
    22 марта 2008 г. 21:47
  • Надо посмотреть как работает оператор -match.

    Без всякого 'наверное'.

    23 марта 2008 г. 1:26
  • Status у меня тоже не показывает, ни на один.
    Что так:

    get-wmiobject win32_networkadapter  |  select-object  -property  ServiceName,Status

    что  так:

    wmic path win32_networkadapter get ServiceName,Status

    cnic  -s  тоже  всегда  возвращает  errorlevel  5  (ошибка)
    23 марта 2008 г. 16:24
  • Если верить статье из MSDN
    http://msdn2.microsoft.com/en-us/library/aa394216(VS.85).aspx

    То поле Status носит совершенно другое предназначение. А для определения состояния адаптера стоит использовать поле NetConnectionStatus.

    23 марта 2008 г. 20:10
  • Да,
    wmic nic get netconnectionstatus,servicename работает
    24 марта 2008 г. 6:05
  • Меня или глючит, или тут поменялся приведенный код.

    Вообщем, насколько я понимаю интересует именно состояние соединение PPPoE, а не просто любого сетевого подключения.

    Так как PPPoE находится в ведении службы RAS, то стоит её и спрашивать о состоянии подключения. Минипорт WAN (PPPoE) это всего лишь виртуальный интерфейс, который помогает общаться службе RAS и сетевому интерфейсу. Он всегда будет в единичном экземпляре независимо от количества подключений.

    Теперь по поводу самой службы RAS. Никаких методов получить состояние подключений через WMI нету, можно воспользоваться методами WinAPI из библиотеки RASAPI32.DLL.

    Как вариант, можно ещё посмотреть в сторону пространства root\wmi, и классов MSNdis_*, например MSNdis_MediaConnectStatus. Но как их привязывать к чему-либо не очень понятно.

    И немного в сторону. Возможно интереусет просто проверка на наличие подключение к интернету. В таком случае есть функция InternetGetConnectedState из WinAPI.
    24 марта 2008 г. 8:13
  • Не глючит - действительно поменялся.

     

    Изначальный вопрос делится на два:

     

    1. Причины по которым wmi может не получить значения некоторых свойств;

     

    2. Определение факта подключения к сети в общем случае.

     

    Используем wmi, powershell, vbs.

    Исключим из рассмотрения варианты с пингом гугля и использующие функции из wininet.dll.

    25 марта 2008 г. 8:32
  •  ajax76 написано:

    1. Причины по которым wmi может не получить значения некоторых свойств;


    Я уже ответил на этот вопрос касательное интерфейсов PPPoE. Если вас интересует другой тип устройств и/или какие-то другие свойства, то уточните их пожалуйста.

     ajax76 написано:

    2. Определение факта подключения к сети в общем случае.

    Используем wmi, powershell, vbs.
    Исключим из рассмотрения варианты с пингом гугля и использующие функции из wininet.dll.


    Если вы хотите остаться в рамках WMI, то у меня есть ещё одно предложение. Определять наличие записи в таблице маршрутизации, например:

    Code Snippet

    if (Get-WmiObject -Class Win32_IP4RouteTable | Where-Object { $_.Destination -eq "0.0.0.0" }) {
      Write-Host "Found a default route entry"
    }


    Если это тоже не подойдёт и вы передумаете относительно системных фунеций, то вот ссылки, на то как дергать системные функции в PowerShell-е:
    http://www.leeholmes.com/blog/GetTheOwnerOfAProcessInPowerShellPInvokeAndRefOutParameters.aspx
    http://www.leeholmes.com/blog/MorePInvokeInPowerShell.aspx

    И по поводу возможных способов определения наличия подключения:
    http://www.ndis.com/faq/QA05040101.htm

    25 марта 2008 г. 15:58
  •  

    Спасибо за ссылки. Попробовал все варианты.

    Вывод такой:

    Нет простого и универсального способа определить факт доступности сети.
    В самом общем случае, то есть когда требуется определить наличие какого-нибудь соединенния с какой-нибудь сетью, требуется:

    1. определить наличие поднятых сетевых интерфейсов;
    2. проверить доступность другого узла в сети.

     

    Решение этой задачи на C++ с использованием API функций лежит здесь:

    http://rsdn.ru/Forum/Message.aspx?mid=658828&only=1

     

    Следующий код на powershell работает по той-же схеме, но использует классы .NET:

     

    Code Snippet

     

    if ( [Net.NetworkInformation.NetworkInterface]::GetIsNetworkAvailable() )
    {
        ( ( New-Object Net.NetworkInformation.Ping ).Send('google.com').Status )
    }else
    {
        "not available"
    }

     

     

    2 апреля 2008 г. 12:14