Всем доброго времени суток!
Есть вопрос про пинг ...
Процедура КнопкаВыполнитьНажатие(Кнопка)
Адр="80.252.128.110";
Если wss = Неопределено Тогда
wss=Новый COMОбъект("WScript.Shell");
КонецЕсли;
Перем1 = Не wss.Run("ping -w 1500 -n 1 "+Адр,0,Истина);
КонецПроцедуры
По логике вещей, если у меня в роутере вытащена симкарта, через которую идёт доступ в интернет, то перем1 должна получить булево "Ложь", однако она его не получает! "Ложь" присваивается только если я выдираю лан кабель из роутера или из компа, на котором 1С крутится. А если идёт обрыв связи на линии (имеется ввиду уже где-то у провайдера), или провайдер заблокировал симку за неуплату и т.д., то в переменную попадает значение "Истина"! Кто-нибудь с таким сталкивался? Соответственно по факту интернета нет, но 1С думает, что всё ок.
Если при этом я запускаю из командной строки пинг сервера, то получаю, что превышен интервал ожидания для запроса. Если физически вытаскиваю сетевой кабель из компа, то получаю сообщение, что сеть не доступна или что-то типа того. Никто с таким не сталкивался и куда нужно копать в данном случае?
(18) логичнее всего в Вашем случае нужно проверять не доступность Вашего роутера или шлюза провайдера, а устройства которое находится за пределами сети провайдера. Попробуйте к примеру адрес 8.8.8.8
Решился таки вынести в отдельную ветку. Вопрос думаю понятен: нужна функция для 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
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
Чего-то я не понял... А чем WMI не устроил?
Еще, я прошлой ветке предлагал сделать через командную строку, но без сохранения в файл. StdOut доступен если запускать Exec-ом, через WSH, насколько я помню...
Это мощно, я в файлик и потом 1с читает его, формирует табличку приглядного вида.
Подскажите, пожалуйста, а как мне это запихунть и использовать в 1с?
Такая ситуация: Список пользователей в 1с (локалка у нас), мне нужно запустить обработку, которая пингует компы, смотрит МАС, сверяет все это с БД и заносит уже там свои данные. Сейчас у меня: 1С====>>> сделал файлик fff.BAT, запускаю на исполнение, жду, делаю в файл таблицу АRP, потом уже все остальное. Все это 1с делает, но вот черненькое окошечно меня смущает, но не напрягает...:)
(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/