Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  | Правила  

Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » CMD/BAT - [решено] Проверка состояния сети.

Ответить
Настройки темы
CMD/BAT - [решено] Проверка состояния сети.

Аватара для Dreamer_UFA

Ветеран


Сообщения: 757
Благодарности: 112


Конфигурация

Профиль | Отправить PM | Цитировать


Изменения
Автор: Dreamer_UFA
Дата: 26-05-2012
Доброго времени суток уважаемые.
Возможно это баян, но что то ничего не нашел. Вернее все отрывисто.

Необходимо сделать батник который бы анализировал состояние сети по 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 Другие темы читал, немного не то. Стороннее ПО не получится - стандарты компании не разрешают ставить. Да и точек очень много.
Нужно просто батник который пользователь нажмет по просьбе СТП и прочитает сообщение выданное ей.

Отправлено: 12:11, 26-05-2012

 

Старожил


Сообщения: 415
Благодарности: 257

Профиль | Отправить PM | Цитировать


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

Отправлено: 20:48, 27-05-2012 | #11



Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети.

Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля.


Аватара для CyberMuesli

Старожил


Сообщения: 207
Благодарности: 18

Профиль | Отправить PM | Цитировать


Цитата Anonymоus:
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 ----------

-------
Кибер Мюсли


Последний раз редактировалось CyberMuesli, 27-05-2012 в 23:54.

Это сообщение посчитали полезным следующие участники:

Отправлено: 23:44, 27-05-2012 | #12


Ветеран


Сообщения: 27449
Благодарности: 8087

Профиль | Отправить PM | Цитировать


, 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

код (чтобы хоть немного представлять ситуацию, и как себя в ней вести)?

Отправлено: 00:07, 28-05-2012 | #13


Аватара для CyberMuesli

Старожил


Сообщения: 207
Благодарности: 18

Профиль | Отправить PM | Цитировать


Цитата Iska:
А хоть что говорит такой:
читать дальше »
код (чтобы хоть немного представлять ситуацию, и как себя в ней вести)? »
у меня зацикленный код для телефона в кастрюле + закрытой потом открытой крышкой говорит следующее

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, я правильно понял?

-------
Кибер Мюсли


Отправлено: 00:20, 28-05-2012 | #14


Старожил


Сообщения: 415
Благодарности: 257

Профиль | Отправить PM | Цитировать


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" в таком случае.

Последний раз редактировалось Anonymоus, 28-05-2012 в 08:21.


Отправлено: 07:52, 28-05-2012 | #15


Ветеран


Сообщения: 27449
Благодарности: 8087

Профиль | Отправить PM | Цитировать


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, спасибо, ясно. Статус именно тот, что Вы приводили выше на скриншоте:
Цитата:
11002 Destination Net Unreachable
(Win32_PingStatus class). Стало быть, будем знать про такую особенность «ping.exe».

Одно только замечание по коду со скриншота…
читать дальше »
Код: Выделить весь код
<command> & echo %Variable%
— он в данном виде непригоден для использования. Дело в том, что «Variable» в этом случае раскрывается до исполнения строки команд и будет возвращать код возврата предыдущей команды, а не «<command>».
Это сообщение посчитали полезным следующие участники:

Отправлено: 08:47, 28-05-2012 | #16


Ветеран


Сообщения: 27449
Благодарности: 8087

Профиль | Отправить PM | Цитировать


Anonymоus, порылся немного. Да, похоже Вы совершенно правы. Вон и Симон рекомендует пользовать исключительно фильтр на TTL (а для полной ясности и вовсе проверять реальную доступность конечного адреса ажник в четыре шага, начиная с localhost и последовательно углубляясь по маршруту): Ping.

Ещё раз спасибо. Будем знать.

Отправлено: 09:04, 28-05-2012 | #17


Аватара для CyberMuesli

Старожил


Сообщения: 207
Благодарности: 18

Профиль | Отправить PM | Цитировать


Цитата Iska:
вынеся собственно подключение к Wbem за рамки цикла. »
а, ну да
Цитата Iska:
Дело в том, что «Variable» в этом случае раскрывается до исполнения строки команд »
плюсану

-------
Кибер Мюсли


Отправлено: 10:31, 28-05-2012 | #18


Аватара для Dreamer_UFA

Ветеран


Сообщения: 757
Благодарности: 112

Профиль | Отправить PM | Цитировать


Уважемые, возник такой вопрос.
Как можно добавить в скрипт предложенный Anonymous использование переменных.
Так как филиалы разные то и ип адреса тоже. Хотелось бы что бы в тело не лезли.... а прописали где нибудь типа settings.ini.
Ну а сам батник конвертнуть в com или exe....

не силен в скриптовых языках... мозг сломал уже

Отправлено: 10:34, 28-05-2012 | #19


Старожил


Сообщения: 415
Благодарности: 257

Профиль | Отправить PM | Цитировать


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
Это сообщение посчитали полезным следующие участники:

Отправлено: 12:13, 28-05-2012 | #20



Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » CMD/BAT - [решено] Проверка состояния сети.

Участник сейчас на форуме Участник сейчас на форуме Участник вне форума Участник вне форума Автор темы Автор темы Шапка темы Сообщение прикреплено

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
Проверка состояния сети. LikeSD AutoIt 6 29-03-2014 09:18
Проверка прав пользователей в сети super_Spartan Хочу все знать 4 10-07-2009 13:02
VBS/WSH/JS - [решено] проверка состояния учетной записи hse2000 Скриптовые языки администрирования Windows 11 19-03-2009 11:40
Программа для отображения состояния сети kazarkin Сетевые технологии 5 06-10-2006 14:09
мониторинг состояния компьютеров в сети XaDex Сетевые технологии 1 26-08-2006 02:05




 
Переход