Показать полную графическую версию : [решено] Проверка состояния сети.
Dreamer_UFA
26-05-2012, 12:11
Доброго времени суток уважаемые.
Возможно это баян, но что то ничего не нашел. Вернее все отрывисто.
Необходимо сделать батник который бы анализировал состояние сети по 5 контрольным точкам потом бы выдавал проблемное место.
Батник для запуска пользователем, когда он позвонит в ТП. У нас множество удаленных точек и уже порядком поднадоело "подрываться" из за глупых ошибок пользователя.
Наваял сейчас простенький батни. Пингует точки, если пинг не проходит - пишет недоступность. А мне в идеале вывести в конце теста мессадж бокс с примерным содержанием содержанием:
1. Сервер 1 - Доступен
2. Сервер 2 - Доступен
3. Сервер 3 - НЕ доступен
4. Сервер 4 - НЕ доступен
5. Сервер 5 - Доступен
От этого можем отталкиваться уже и анализировать проблему.
Вот батник который сейчас наваял :)
@echo oFF
ping 192.168.140.1 | find "TTL=" > nul
if errorlevel 1 (
msg * "SERVER IBMD NE DOSTUPEN"
) else (
echo "IBMD NE DOSTUPEN"
)
ping 192.168.1.1 | find "TTL=" > nul
if errorlevel 1 (
msg * "MODEM NE DOSTUPEN"
) else (
echo "MODEM DOSTUPEN"
)
ping 77.94.124.70 | find "TTL=" > nul
if errorlevel 1 (
msg * "PDC FILIALA NE DOSTUPEN"
) else (
echo "PDC FILIALA DOSTUPEN"
exit /b
)
как то так. Поделитесь соображениями пожалуйста кому не лень...
PS Другие темы читал, немного не то. Стороннее ПО не получится - стандарты компании не разрешают ставить. Да и точек очень много.
Нужно просто батник который пользователь нажмет по просьбе СТП и прочитает сообщение выданное ей.
Anonymоus
26-05-2012, 13:50
Dreamer_UFA, добавление новых серверов очень простое, посмотрите, как это сделано в примере. Вашим пользователям останется только нажать Ctrl+C на появившемся месседжбоксе и отправить результат вашей техподдержке.
@Echo Off
SetLocal EnableDelayedExpansion
:: Адреса серверов в формате IP:Описание
:: Название переменной - _PointНомер, где номер идет с приращением в 1
Set _Point1=192.168.50.1:Billing server
Set _Point2=192.168.50.5:VPN server
Set _Point3=192.168.72.11:FTP
Set _Point4=127.0.0.1:Loopback
Set _Point5=209.85.148.113:Google.com
Set i=5
Set MsgString="Status:"
:: Получаем набор адресов
Echo Wait...
For /F "tokens=2 delims==" %%A In ('Set _Point') Do (
For /F "tokens=1,2 delims=:" %%B In ("%%A") Do (
Echo Checking "%%B"
:: Проверяем на доступность сервера и стабильный пинг к нему
For /F %%I In ('Ping -n %i% %%B^|Find /C "TTL="') Do (
If %%I==%i% (Set Result=Online) Else (Set Result=Unstable connection)
If %%I==0 Set Result=Not responding
)
:: Составляем строку с данными для MsgBox'а
Set MsgString=!MsgString! + vbCrLf + "%%C - !Result!"
)
)
:: Генерируем и запускаем vbs-скрипт, выводящий данные
Echo MsgBox %MsgString%>"%Temp%\statusmsg.vbs"
"%Temp%\statusmsg.vbs"
CyberMuesli
27-05-2012, 17:24
Ping -n 2 %%B|Find "TTL=" »
сто раз видел | find "TTL=", но имхо, это какое-то списывание друг у друга.
Во-первых, ping прекрасно сам устанавливает errorlevel и не нужно дополнительно анализировать вывод, как это требуется например для nslookup, которая этот errorlevel не устанавливает. Команда
Ping -n 2 %%B|Find "TTL=">nul&&Set Result=Online
полностью эквивалентна
Ping -n 2 %%B &&Set Result=Online
Во-вторых, цель пинга определить возможные проблемы и лучше искать хотя бы одну потерю, а не хотя бы один успех. И вот уже для этой цели, поскольку при хотя бы одном успехе errorlevel будет ноль, надо писать
ping -n 10 %%B | find "(0%"
что будет означать 100% успех
Anonymоus
27-05-2012, 17:42
сто раз видел | find "TTL=", но имхо, это какое-то списывание друг у друга. »
Если вы не видите в дополнительной проверке смысла, это не значит, что его там нету. Ping некорректно возвращает ErrorLevel в некоторых случаях. На скриншоте - один из них.
http://rghost.ru/38314252/image.png
Dreamer_UFA
27-05-2012, 18:33
Anonymоus : Большое спасибо. Ваш пример с небольшой доработкой то что надо. На первых порах будем испоользовать это.
А вообще сейчас пишу небольшую утилитку на дельфи которая постоянно мониторит соединения. В случае обрыва - выводит пользователю сообщение. В любое время можно навести курсор мыши на ярлык в трее - будет отчет по всем соединениям. Планы такие пока.
"|FIND TTL=" честно списал. Мне показалось достаточным того что при первых откликах на пинг система считала связь нормальной.
Ping некорректно возвращает ErrorLevel в некоторых случаях. На скриншоте - один из них. »
Поясните скриншот.
Anonymоus
27-05-2012, 19:32
Iska, согласно technet (http://technet.microsoft.com/ru-ru/library/cc737478%28v=ws.10%29.aspx):
Сообщение «Заданная сеть недоступна» означает, что отсутствует маршрут к сети назначения. Необходимо проверить таблицу маршрутизации на маршрутизаторе, адрес которого указан в сообщении «Заданная сеть недоступна». Дополнительные сведения о таблице маршрутизации см. в разделе Общее представление о таблице IP-маршрутизации.
При этом, хотя фактически пинг не прошел - ErrorLevel остается нулевым. Разбор вывода с помощью «Find "TTL="» всегда позволяет определить, прошел ли хоть один пинг, вместо того, чтобы слепо полагаться на возвращаемый ErrorLevel.
Anonymоus, так, а почему отчего на скриншоте есть сообщение о полученном пакете?
Anonymоus
27-05-2012, 20:03
Вот этого я не скажу, подозреваю, что пакет вернул маршрутизатор, а не указанный узел 192.168.70.1. Но то, что туда от меня пакеты не приходили - это факт.
А что в ICMP-пакете содержится?
Anonymоus
27-05-2012, 20:48
Iska,
Протокол : ICMP
Локальный адрес : 10.3.3.230
Удалённый адрес : xx.xx.xx.xxx
Пакеты : 1 {0 ; 1}
Объём данных : 60 байт {0 ; 60}
Общий размер : 176 байт {0 ; 176}
Время захвата : 27.05.2012 19:42:41:078
Время последнего пакета: 27.05.2012 19:42:41:078
Данные:
00000000 45 00 00 3C 15 67 00 00 7F 01 75 C8 0A 03 03 E6 E..<.g.. .u.....
00000010 5C A8 46 01 08 00 34 5C 03 00 16 00 61 62 63 64 \.F...4\ ....abcd
00000020 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70 71 72 73 74 efghijkl mnopqrst
00000030 75 76 77 61 62 63 64 65 66 67 68 69 uvwabcde fghi
CyberMuesli
27-05-2012, 23:44
Ping некорректно возвращает ErrorLevel в некоторых случаях. »
Спасибо, Вы правы. Я смог смоделировать эту ситуацию.
На вайфайке есть host и guest зона, между ними настроена маршрутизация
Компьютер в host зоне, телефон в guest зоне
Телефон помещаем в бидон, бидон в кастрюлю, открываем и закрываем крышку кастрюли, пингуем, пинги то есть, то нет
При этом сообщения об ошибке могут быть разные: узел недоступен, превышен интервал ожидания запроса
При этом errorlevel 0
find "TTL" действительно самый дешевый способ. Но мне он не нравится тем, что если из 10 пингов 1 пройдет, эта команда нам скажет, что всё в порядке, тогда как цель такого мониторинга выявить проблемы.
Набросал вот. Алгоритм следующий: мы просим find не просто найти TTL, а подсчитать количество таких строк. Эту цифру мы можем считать и сравнить с той, которую передавали ранее пингу в параметре -n. Если хотя бы один пинг не прошел - операция считается неудачной
@echo off
setlocal enabledelayedexpansion
call :TestPing[] -debug %1 %2
echo ----------- errorlevel: %errorlevel% ----------
goto :eof
:TestPing[]
:: Parameters: [-debug] IP [PingCount]
if "%1"=="-debug" (
set TestPing.Debug=Yes
shift
)
set TestPing.PingCount=%2
if "%TestPing.PingCount%"=="" (
set TestPing.PingCount=2
)
set TestPing.Out2=B%random%.tmp
set TestPing.Out3=C%random%.tmp
>%TestPing.Out2% (ping -n %TestPing.PingCount% %1)
set TestPing.PingErrorLevel=!errorlevel!
>%TestPing.Out3% (find /C "TTL=" <%TestPing.Out2%)
for /f %%i in (%TestPing.Out3%) do (
set TestPing.SuccessCount=%%i
)
if %TestPing.PingCount%==%TestPing.SuccessCount% (
set TestPing.Result=Yes
if %TestPing.PingErrorLevel%==0 (
set TestPing.PingErrorLevelResult={valid}
) else (
set TestPing.PingErrorLevelResult={INVALID}
)
) else (
if not %TestPing.PingErrorLevel%==0 (
set TestPing.PingErrorLevelResult={valid}
) else (
set TestPing.PingErrorLevelResult={INVALID}
)
)
if "%TestPing.Debug%"=="Yes" (
type %TestPing.Out2%
echo ------------- results: -------------
echo Ping count : %TestPing.PingCount%
echo Success count : %TestPing.SuccessCount%
echo Ping errorLevel: %TestPing.PingErrorLevel% %TestPing.PingErrorLevelResult%
if "%TestPing.Result%"=="Yes" (
echo Ping is successful
) else (
echo There is ping error
)
)
del %TestPing.Out2%
del %TestPing.Out3%
if "%TestPing.Result%"=="Yes" (
exit /b 0
)
exit /b 1
goto :eof
Результаты работы в эксперименте с бидоном
192.168.0.1 - wifi роутер в host зоне, 192.168.1.100 - телефон в guest зоне
C>TestPing.bat 192.168.1.100 15
Обмен пакетами с 192.168.1.100 по 32 байт:
Ответ от 192.168.0.1: Заданный узел недоступен.
Ответ от 192.168.0.1: Заданный узел недоступен.
Ответ от 192.168.1.100: число байт=32 время=2205мс TTL=64
Ответ от 192.168.1.100: число байт=32 время=5мс TTL=64
Превышен интервал ожидания для запроса.
Превышен интервал ожидания для запроса.
Превышен интервал ожидания для запроса.
Превышен интервал ожидания для запроса.
Превышен интервал ожидания для запроса.
Ответ от 192.168.1.100: число байт=32 время=12мс TTL=64
Ответ от 192.168.1.100: число байт=32 время=408мс TTL=64
Ответ от 192.168.1.100: число байт=32 время=228мс TTL=64
Ответ от 192.168.1.100: число байт=32 время=107мс TTL=64
Ответ от 192.168.1.100: число байт=32 время=109мс TTL=64
Ответ от 192.168.1.100: число байт=32 время=325мс TTL=64
Статистика Ping для 192.168.1.100:
Пакетов: отправлено = 15, получено = 10, потеряно = 5 (33% потерь),
Приблизительное время приема-передачи в мс:
Минимальное = 5мсек, Максимальное = 2205 мсек, Среднее = 339 мсек
------------- results: -------------
Ping count : 15
Success count : 8
Ping errorLevel: 0 {INVALID}
There is ping error
----------- errorlevel: 1 ----------
:(, Anonymоus, чувствую себя тем неграмотным волком из анекдота про волка, лошадь и её задние копыта.
А хоть что говорит такой:
Option Explicit
Dim objSWbemObjectEx
For Each objSWbemObjectEx In WScript.CreateObject("WbemScripting.SWbemLocator").ConnectServer(".", "root\cimv2").ExecQuery( _
"SELECT * FROM Win32_PingStatus WHERE ADDRESS = '192.168.70.1'")
With objSWbemObjectEx
If Not IsNull(.StatusCode) Then
If .StatusCode = 0 Then
WScript.Echo .Address & vbTab & "On" & vbTab & "Response time: " & .ResponseTime & " ms"
Else
WScript.Echo .Address & vbTab & "Off" & vbTab & "Status code: " & .StatusCode
End If
Else
WScript.Echo .Address & vbTab & "Not found"
End If
End With
Next
WScript.Quit 0
код (чтобы хоть немного представлять ситуацию, и как себя в ней вести)?
CyberMuesli
28-05-2012, 00:20
А хоть что говорит такой:
читать дальше »
код (чтобы хоть немного представлять ситуацию, и как себя в ней вести)? »
у меня зацикленный код для телефона в кастрюле + закрытой потом открытой крышкой говорит следующее
192.168.1.100 Off Status code: 11010
192.168.1.100 Off Status code: 11003
192.168.1.100 Off Status code: 11010
192.168.1.100 Off Status code: 11003
192.168.1.100 Off Status code: 11010
192.168.1.100 On Response time: 5 ms
192.168.1.100 On Response time: 232 ms
192.168.1.100 On Response time: 186 ms
192.168.1.100 On Response time: 212 ms
192.168.1.100 On Response time: 12 ms
192.168.1.100 On Response time: 218 ms
зы. начало цикла надо делать до CreateObject, я правильно понял?
Anonymоus
28-05-2012, 07:52
Iska,
192.168.70.1 Off Status code: 11002
CyberMuesli, как вариант, использовать вот такую конструкцию, где будет дополнительно проверяться и наличие потерь:
Set IP=192.168.70.1&Set i=3
For /F %%I In ('Ping -n %i% %IP%^|Find /C "TTL="') Do (If %%I==%i% Echo Пинг прошел, потерь нету)
Из минусов - слишком громоздко, cтоит использовать лишь там, где процент потерь при пинге действительно нужно учитывать.
Отредактировал второй пост, поправил скрипт, чтобы он учитывал частично прошедший пинг и добавлял статус "Unstable connection" в таком случае.
CyberMuesli, можно так:
Option Explicit
Dim strComputer
Dim objSWbemLocator
Dim objSWbemServicesEx
Dim objSWbemObjectEx
strComputer = "."
Set objSWbemLocator = WScript.CreateObject("WbemScripting.SWbemLocator")
Set objSWbemServicesEx = objSWbemLocator.ConnectServer(strComputer, "root\cimv2")
Do
For Each objSWbemObjectEx In objSWbemServicesEx.ExecQuery( _
"SELECT * FROM Win32_PingStatus WHERE Address = '192.168.70.1'")
With objSWbemObjectEx
If Not IsNull(.StatusCode) Then
If .StatusCode = 0 Then
WScript.Echo .Address & vbTab & "On" & vbTab & "Response time: " & .ResponseTime & " ms"
Else
WScript.Echo .Address & vbTab & "Off" & vbTab & "Status code: " & .StatusCode
End If
Else
WScript.Echo .Address & vbTab & "Not found"
End If
End With
Next
Loop
Set objSWbemServicesEx = Nothing
Set objSWbemLocator = Nothing
WScript.Quit 0
вынеся собственно подключение к Wbem за рамки цикла.
Anonymоus, спасибо, ясно. Статус именно тот, что Вы приводили выше (http://forum.oszone.net/post-1923447.html#post1923447) на скриншоте:
11002 Destination Net Unreachable
(Win32_PingStatus class (http://msdn.microsoft.com/en-us/library/windows/desktop/aa394350(v=vs.85).aspx)). Стало быть, будем знать про такую особенность «ping.exe».
Одно только замечание по коду со скриншота…
<command> & echo %Variable%
— он в данном виде непригоден для использования. Дело в том, что «Variable» в этом случае раскрывается до исполнения строки команд и будет возвращать код возврата предыдущей команды, а не «<command>».
Anonymоus, порылся немного. Да, похоже Вы совершенно правы. Вон и Симон рекомендует пользовать исключительно фильтр на TTL (а для полной ясности и вовсе проверять реальную доступность конечного адреса ажник в четыре шага, начиная с localhost и последовательно углубляясь по маршруту): Ping (http://ss64.com/nt/ping.html).
Ещё раз спасибо. Будем знать.
CyberMuesli
28-05-2012, 10:31
вынеся собственно подключение к Wbem за рамки цикла. »
а, ну да
Дело в том, что «Variable» в этом случае раскрывается до исполнения строки команд »
плюсану
Dreamer_UFA
28-05-2012, 10:34
Уважемые, возник такой вопрос.
Как можно добавить в скрипт предложенный Anonymous использование переменных.
Так как филиалы разные то и ип адреса тоже. Хотелось бы что бы в тело не лезли.... а прописали где нибудь типа settings.ini.
Ну а сам батник конвертнуть в com или exe....
не силен в скриптовых языках... мозг сломал уже :(
Anonymоus
28-05-2012, 12:13
Dreamer_UFA, сам скрипт:
@Echo Off
SetLocal EnableDelayedExpansion
If Not Exist "settings.ini" Echo Settings not found&Pause&Exit 1
For /F "usebackq eol=# tokens=1,2* delims==" %%A In ("settings.ini") Do (
If Not "%%B"=="" Set %%A=%%B
)
Set MsgString="Status:"
:: Получаем набор адресов
Echo Wait...
For /F "tokens=2 delims==" %%A In ('Set Point_') Do (
For /F "tokens=1,2 delims=:" %%B In ("%%A") Do (
Echo Checking "%%B"
:: Проверяем на доступность сервера и стабильный пинг к нему
For /F %%I In ('Ping -n %PacketCount% %%B^|Find /C "TTL="') Do (
If %%I==%PacketCount% (Set Result=Online) Else (Set Result=Unstable connection)
If %%I==0 Set Result=Not responding
)
:: Составляем строку с данными для MsgBox'а
Set MsgString=!MsgString! + vbCrLf + "%%C - !Result!"
)
)
:: Генерируем и запускаем vbs-скрипт, выводящий данные
Echo MsgBox %MsgString%>"%Temp%\statusmsg.vbs"
"%Temp%\statusmsg.vbs"
Он же, упакованный в exe - http://dl.dropbox.com/u/11632454/dev/random/Pinger.rar
Содержимое файла настроек Settings.ini:
# Адреса серверов в формате IP:Отображаемое имя
Point_1=192.168.50.1:Billing server
Point_2=192.168.50.5:VPN server
Point_3=192.168.72.11:FTP
Point_4=127.0.0.1:Loopback
Point_5=209.85.148.113:Google.com
Point_6=87.250.250.203:Yandex.ru
# Количество пакетов для команды пинга
PacketCount=5
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.