Пинг (ping) из 1С

18. AganinEvgeniy 2 14.07.16 21:58 Сейчас в теме
Всем доброго времени суток!
Есть вопрос про пинг ...

Процедура КнопкаВыполнитьНажатие(Кнопка)
    Адр="80.252.128.110";
    Если wss = Неопределено Тогда 
        wss=Новый COMОбъект("WScript.Shell");
    КонецЕсли;
    Перем1 = Не wss.Run("ping -w 1500 -n 1 "+Адр,0,Истина);
КонецПроцедуры


По логике вещей, если у меня в роутере вытащена симкарта, через которую идёт доступ в интернет, то перем1 должна получить булево "Ложь", однако она его не получает! "Ложь" присваивается только если я выдираю лан кабель из роутера или из компа, на котором 1С крутится. А если идёт обрыв связи на линии (имеется ввиду уже где-то у провайдера), или провайдер заблокировал симку за неуплату и т.д., то в переменную попадает значение "Истина"! Кто-нибудь с таким сталкивался? Соответственно по факту интернета нет, но 1С думает, что всё ок.
Если при этом я запускаю из командной строки пинг сервера, то получаю, что превышен интервал ожидания для запроса. Если физически вытаскиваю сетевой кабель из компа, то получаю сообщение, что сеть не доступна или что-то типа того. Никто с таким не сталкивался и куда нужно копать в данном случае?
+
По теме из базы знаний
Ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
19. EVGEN_CV 22.04.17 09:07 Сейчас в теме
(18) логичнее всего в Вашем случае нужно проверять не доступность Вашего роутера или шлюза провайдера, а устройства которое находится за пределами сети провайдера. Попробуйте к примеру адрес 8.8.8.8
+
20. sound 535 11.04.09 18:09 Сейчас в теме
Решился таки вынести в отдельную ветку. Вопрос думаю понятен: нужна функция для 1С (желательно 8.1, но совсем не обязательно) реализующая ping, желательно со всеми параметрами, присущими стандартным средствам ОС.

Условия:
1) По ссылке не отсылать:
http://www.infostart.ru/forum/messages/forum9/topic4959/message36862/
2) Не предлагать ересь типа: ping 192.168.0.1 > C:\Result.txt, а потом его ручками..
3) Внешние компоненты не юзать.
4) Хочется чтобы пинговалось быстро и достоверно, как говорится: и рыбку съесть и овцы целы :)

Вот попытался поюзать WMI:

Function Avaible(IP) Export
   Try
      ServicesSet = GetCOMObject("winmgmts:{impersonationLevel=impersonate}");
      Items = ServicesSet.ExecQuery("SEL ECT StatusCode fr om Win32_PingStatus WHERE address = '" + IP + "' AND Timeout=10");
   Except
      Return Undefined;
   EndTry;
   For Each Item In Items Do
      If Item.StatusCode = 0 Then
         Return True;
      Else
         Return False;
      EndIf;
   EndDo;
EndFunction
Показать


Принимаю критику, комменты, предложения...
+
21. Душелов 4017 11.04.09 19:04 Сейчас в теме
22. sound 535 11.04.09 19:10 Сейчас в теме
Ну пусть будет не ересь, но хочется как то покрасивее чтоли...
+
23. Душелов 4017 11.04.09 19:16 Сейчас в теме
Покрасивее - ВК. Чем не устраивает?

Скрипты - что-то такое:

 

A. The Windows Management Instrumentation (WMI) classes in Windows XP and later provide a Win32_PingStatus object that you can use to ping a machine. The following script, which you can download at http://www.windowsitpro.com/articles/download/vbpinging.zip uses this object to ping a passed hostname or IP address. Because of space constraints, some lines wrap to two lines.



Option Explicit

Dim strHost

' Check that all arguments required have been passed.
If Wscript.Arguments.Count < 1 Then
    Wscript.Echo "Arguments <Host> required. For example:" & vbCrLf _
    & "cscript vbping.vbs savdaldc01"
    Wscript.Quit(0)
End If

strHost = Wscript.Arguments(0)

if Ping(strHost) = True then
    Wscript.Echo "Host " & strHost & " contacted"
Else
    Wscript.Echo "Host " & strHost & " could not be contacted"
end if

Function Ping(strHost)

    dim objPing, objRetStatus

    set objPing = GetObject("winmgmts:{impersonationLevel=impersonate}").ExecQuery _
      ("sel ect * fr om Win32_PingStatus where address = '" & strHost & "'")

    for each objRetStatus in objPing
        if IsNull(objRetStatus.StatusCode) or objRetStatus.StatusCode<>0 then
    Ping = False
            'WScript.Echo "Status code is " & objRetStatus.StatusCode
        else
            Ping = True
            'Wscript.Echo "Bytes = " & vbTab & objRetStatus.BufferSize
            'Wscript.Echo "Time (ms) = " & vbTab & objRetStatus.ResponseTime
            'Wscript.Echo "TTL (s) = " & vbTab & objRetStatus.ResponseTimeToLive
        end if
    next
End Function 
Показать
+
24. sound 535 11.04.09 19:23 Сейчас в теме
Что мне дает проверка?
IsNull(objRetStatus.StatusCode) 

Вернее не так: а разве проверки objRetStatus.StatusCode<>0 недостаточно? Что там еще может быть?
+
25. sound 535 11.04.09 19:26 Сейчас в теме
по моему у меня вышло почти тоже самое?
+
26. Душелов 4017 11.04.09 19:31 Сейчас в теме
Ну как бы функция пинга-то одна.
+
27. sound 535 11.04.09 19:36 Сейчас в теме
Ну я тоже на это надеюсь :)
+
28. coder1cv8 3470 12.04.09 08:24 Сейчас в теме
Чего-то я не понял... А чем WMI не устроил?
Еще, я прошлой ветке предлагал сделать через командную строку, но без сохранения в файл. StdOut доступен если запускать Exec-ом, через WSH, насколько я помню...
+
29. sound 535 12.04.09 15:17 Сейчас в теме
(9) Вот я и говорю, что хочу посмотреть как бы это реализовали другие. Я как то код лучше воспринимаю, конечно если не трудно
+
30. coder1cv8 3470 12.04.09 18:24 Сейчас в теме
(10) Я бы реализовал через WMI.
+
31. sound 535 13.04.09 08:53 Сейчас в теме
32. coder1cv8 3470 13.04.09 09:02 Сейчас в теме
(12) В (0) все нормально, я имею ввиду, что сделал бы также.
+
33. vovan519 276 13.04.09 12:40 Сейчас в теме
Использовал пинг в http://www.infostart.ru/projects/1352/
  scrptCtrl=СоздатьОбъект("MSScriptControl.ScriptControl");
  scrptCtrl.language="vbscript";
  scrptCtrl.addcode("
|Function Avaible()
|Set objWMIService = GetObject(""winmgmts:{impersonationLevel=impersonate}"")
|Set objPing = objWMIService.ExecQuery(""sel ect * fr om Win32_PingStatus where address = '"+name+"'"")
|For Each objStatus in objPing
|If IsNull(objStatus.StatusCode) Or objStatus.StatusCode <> 0 Then
|	Avaible = 0
|Else
|	Avaible = 1
|End If
|Next
|End function
|");
Рез = ScrptCtrl.Run("Avaible");
Показать
Seneka7608; +1
34. sound 535 14.04.09 10:19 Сейчас в теме
WMI так WMI. Ну, вообщем, всем респект, вопрос исчерпан :)
+
35. DimaP 63 28.04.09 20:10 Сейчас в теме
Это мощно, я в файлик и потом 1с читает его, формирует табличку приглядного вида.
Подскажите, пожалуйста, а как мне это запихунть и использовать в 1с?
Такая ситуация: Список пользователей в 1с (локалка у нас), мне нужно запустить обработку, которая пингует компы, смотрит МАС, сверяет все это с БД и заносит уже там свои данные. Сейчас у меня: 1С====>>> сделал файлик fff.BAT, запускаю на исполнение, жду, делаю в файл таблицу АRP, потом уже все остальное. Все это 1с делает, но вот черненькое окошечно меня смущает, но не напрягает...:)
+
36. sound 535 30.04.09 00:46 Сейчас в теме
(16) Не совсем понял вопрос насчет что куда надо запихнуть (сплю уже видимо), но вообщем еще раз:
Код для 8-ки, извини, что не на русском:
// Функция Avaible проверяет "пингуется" ли указанный IP
Function Avaible(IP) Export
	Try
		ServicesSet = GetCOMObject("winmgmts:{impersonationLevel=impersonate}");
		Items = ServicesSet.ExecQuery("SEL ECT StatusCode fr om Win32_PingStatus WHERE address = '" + IP + "' AND Timeout=10");
	Except
		Return Undefined;
	EndTry;
	For Each Item In Items Do
		If Item.StatusCode = 0 Then
			Return True;
		Else
			Return False;
		EndIf;
	EndDo;
EndFunction
Показать


Для получения какой-либо информации с удаленного компа можно например так, (в перемешку на разных языках пошло:):

ServicesSet = GetCOMObject("winmgmts:{impersonationLevel=impersonate}!\\" + IP + "\root\cimv2");
Items = ServicesSet.ExecQuery("SEL ECT * FROM Win32_NetworkAdapterConfiguration");
	For Each Item In Items Do
		Попытка
			Если СокрЛП(Item.DNSHostName) <> "" Тогда
				// IP
				Для каждого IPAddress Из Item.IPAddress Цикл
					Если СокрЛП(IPAddress) <> "" Тогда
						//......................................
					КонецЕсли;	
				КонецЦикла;
				// Default IP Gateway
				Для каждого DefaultIPGateway Из Item.DefaultIPGateway Цикл
					Если СокрЛП(DefaultIPGateway) <> "" Тогда
						//......................................
					КонецЕсли;	
				КонецЦикла;
			КонецЕсли;
		Исключение
		КонецПопытки;
	EndDo;
Показать


Ну это как бы просто куски кода, думаю если надо будет разберешься :)
А вообще лучше сначала толком почитать про WMI и заглянуть, например сюда
http://infostart.ru/projects/3004/
+
Внимание! Тема сдана в архив

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот