VBS/WSH/JS - Win32_PingStatus или что-нибудь другое

Ответить
Аватара пользователя
semen77

VBS/WSH/JS - Win32_PingStatus или что-нибудь другое

Сообщение semen77 »

Везде, где только не искал, проверка доступности интернета (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

Re: VBS/WSH/JS - Win32_PingStatus или что-нибудь другое

Сообщение Iska »

Цитата semen77:



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



Код:

Код: Выделить всё

ping www.google.com

Не будут корректно работать если ОС находится за NAT-ом.
VBS/WSH/JS - Win32_PingStatus или что-нибудь другое




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



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

Re: VBS/WSH/JS - Win32_PingStatus или что-нибудь другое

Сообщение semen77 »

Цитата Iska:



Почему Вы так решили?
VBS/WSH/JS - Win32_PingStatus или что-нибудь другое




Я тестировал оба варианта на виртуалках с nat-ом

P.S.: а вот и ваш вариант:



Изображение

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

Re: VBS/WSH/JS - Win32_PingStatus или что-нибудь другое

Сообщение Iska »

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

Re: VBS/WSH/JS - Win32_PingStatus или что-нибудь другое

Сообщение semen77 »

Цитата Iska:



а в непрохождении пакетов определённого вида
VBS/WSH/JS - Win32_PingStatus или что-нибудь другое




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

Поэтому и спрашивал - может кто-то уже придумал "костыли"...
Ответить

Вернуться в «Скриптовые языки администрирования Windows»