Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Скриптовые языки администрирования Windows (http://forum.oszone.net/forumdisplay.php?f=102)
-   -   Win32_PingStatus или что-нибудь другое (http://forum.oszone.net/showthread.php?t=255643)

semen77 06-03-2013 14:37 2105491

Win32_PingStatus или что-нибудь другое
 
Везде, где только не искал, проверка доступности интернета (VBS+WMI) производится с помощью:
Код:

"...FROM Win32_PingStatus..."
Вопрос: а есть другие варианты?
Потому что этот, так же как и, просто CMD-команда:
Код:

ping www.google.com
Не будут корректно работать если ОС находится за NAT-ом.
Задача: проверить доступность www.google.com
Условие: компьютер находится за NAT

Пример скрипта:
Код:

iPing = Ping("www.google.com")

If iPing=0 Then
  WScript.Echo "Интернет есть"
Else
  WScript.Echo "Интернета НЕТ"
End If

Function Ping (strTarget)
  Set objWMIService = GetObject("winmgmts:\\.\root\cimv2")
  Set colPings = objWMIService.ExecQuery ("Select * From Win32_PingStatus where Address = '" & strTarget & "'")

  For Each objPing in colPings
    Ping = objPing.StatusCode
  Next
End Function


Iska 06-03-2013 15:31 2105524

Цитата:

Цитата semen77
Потому что этот, так же как и, просто CMD-команда:
Код:

ping www.google.com
Не будут корректно работать если ОС находится за NAT-ом. »

Почему Вы так решили?

P.S. Лучше использовать такой код:
читать дальше »
Код:

Option Explicit

If IsConnected("www.google.com") Then
        ' Place your code here…
End If

WScript.Quit 0
'=============================================================================

'=============================================================================
Function IsConnected(strAddress)
        Dim objSWbemObjectEx
       
        IsConnected = False
       
        For Each objSWbemObjectEx In GetObject( _
                "winmgmts:{impersonationLevel=impersonate}!\\.\root\cimv2").ExecQuery( _
                "SELECT * FROM Win32_PingStatus WHERE Address = '" & strAddress & "'")
               
                With objSWbemObjectEx
                        If Not IsNull(.StatusCode) And .StatusCode = 0 Then
                                IsConnected = True
                        End If
                End With
               
                Exit For
        Next
       
        Set objSWbemObjectEx = Nothing
End Function
'=============================================================================


semen77 06-03-2013 15:47 2105531

Цитата:

Цитата Iska
Почему Вы так решили? »

Я тестировал оба варианта на виртуалках с nat-ом
P.S.: а вот и ваш вариант:


Знаю, что проблема связана с трансляцией ICMP-пакетов, но может быть уже кто-то решил её?

Iska 06-03-2013 15:55 2105540

semen77, ну, так дело ж не в NAT получается, а в непрохождении пакетов определённого вида, как Вы верно заметили. Пинайте своего администратора.

semen77 06-03-2013 16:05 2105551

Цитата:

Цитата Iska
а в непрохождении пакетов определённого вида »

Это "стандартная болезнь" архитектуры NAT, которая умеет правильно транслировать только TCP и UDP пакеты.
Поэтому и спрашивал - может кто-то уже придумал "костыли"...


Время: 11:05.

Время: 11:05.
© OSzone.net 2001-