Войти

Показать полную графическую версию : [решено] Ping с выключением компа


Страниц : [1] 2

darkAge
12-07-2013, 17:17
Всех приветствую.
Задачу новую поставили мне, есть у нас скрипт который пингует нужную машину заданное количество времени

option explicit
' conHost -- адрес хоста для слежения
' conCheckInterval -- временной интервал
const conHost = " ip адрес", conCheckInterval = 1000

' создаём объект:
dim soWshShell : set soWshShell = CreateObject("WScript.Shell")
WScript.Quit Main()

function WriteLog(strText)
WScript.Stdout.WriteLine Now() & " " & strText
end function

function GetHostStatus(strHost)
dim oPing : set oPing = soWshShell.Exec("ping -n 1 " &

strHost)
dim strOut : strOut = ""
do
WScript.Sleep 100
if not oPing.Stdout.AtEndOfStream then
strOut = strOut & oPing.Stdout.ReadAll
end if
loop until oPing.Status = 1

dim oRegExp : set oRegExp = new RegExp
oRegExp.IgnoreCase = true
oRegExp.Pattern = "[^ ]+:.+TTL=[^\r\n]+"
dim oMatches : set oMatches = oRegExp.Execute(strOut)
if oMatches.Count > 0 then
GetHostStatus = oMatches(0).Value
else
GetHostStatus =

"Inaccessible!.."
end if
end function

function Main()
do
WriteLog(GetHostStatus(conHost))
WScript.Sleep(conCheckInterval)
' Опрос хоста, анализ, вывод результата и пауза заданной длительности ( если разница в часах между текущем временем и заданным (19) составляет 0 - прерывам цикл)
If DateDiff("h", Time(), TimeSerial(19, 0, 0)) = 0 Then
Exit Do
End If
loop
end function

Нужно его доработать, что бы он пинговал нужную машину раз в минуту на пример, длительностью к примеру 10 секунд, и если пинг отсутствует в течении допустим 5 минут, то компьютер выключался.

Iska
12-07-2013, 17:51
Скрипт явно унаследованный.

Объясните цель и смысл действа:
он пинговал нужную машину раз в минуту на пример, длительностью к примеру 10 секунд, и если пинг отсутствует в течении допустим 5 минут, то компьютер выключался. »
и поясните, какой именно компьютер должен выключаться.

darkAge
12-07-2013, 17:54
Iska, тот, который пингует.

В целях безопасности.

Iska
12-07-2013, 18:36
darkAge, мне непонятен смысл «длительностью к примеру 10 секунд»: одного раза вполне достаточно.

Пробуйте (не проверялось):
Option Explicit

Const lngInterval = 300 ' (5 * 60) seconds
Const lngFrequency = 10 ' every 10 seconds


Dim strAddress

Dim objSWbemServicesEx
Dim objSWbemObjectEx

Dim lngCurrentInterval


strAddress = "MyServer" ' or IP address

Set objSWbemServicesEx = WScript.CreateObject("WbemScripting.SWbemLocator").ConnectServer(".", "root\cimv2")

lngCurrentInterval = 0

Do
For Each objSWbemObject In objSWbemServicesEx.ExecQuery("SELECT * FROM Win32_PingStatus WHERE Address = '" & strAddress & "'")
If Not IsNull(objSWbemObject.StatusCode) Then
If objSWbemObject.StatusCode = 0 Then
lngCurrentInterval = 0
End If
End If
Next

If lngCurrentInterval >= lngInterval Then
objSWbemServicesEx.Security_.Privileges.AddAsString "SeShutdownPrivilege", True

For Each objSWbemObject In objSWbemServicesEx.ExecQuery("SELECT * FROM Win32_OperatingSystem")
objSWbemObject.Shutdown
Next

Exit Do
End If

WScript.Sleep lngFrequency

lngCurrentInterval = lngCurrentInterval + lngFrequency
Loop

Set objSWbemServicesEx = Nothing

WScript.Quit 0

darkAge
15-07-2013, 09:25
Вот что получается, что бы пока долго не ждать, сделал 60 секунд.
Option Explicit

Const lngInterval = 60 ' (5 * 60) seconds
Const lngFrequency = 10 ' every 10 seconds


Dim strAddress

Dim objSWbemServicesEx
Dim objSWbemObjectEx

Dim lngCurrentInterval


strAddress = "192.168.4.1" ' or IP address

Set objSWbemServicesEx = WScript.CreateObject("WbemScripting.SWbemLocator").ConnectServer(".", "root\cimv2")

lngCurrentInterval = 0

Do
For Each objSWbemObject In objSWbemServicesEx.ExecQuery("SELECT * FROM Win32_PingStatus WHERE Address = '" & strAddress & "'")
If Not IsNull(objSWbemObject.StatusCode) Then
If objSWbemObject.StatusCode = 0 Then
lngCurrentInterval = 0
End If
End If
Next

If lngCurrentInterval >= lngInterval Then
objSWbemServicesEx.Security_.Privileges.AddAsString "SeShutdownPrivilege", True

For Each objSWbemObject In objSWbemServicesEx.ExecQuery("SELECT * FROM Win32_OperatingSystem")
objSWbemObject.Shutdown
Next

Exit Do
End If

WScript.Sleep lngFrequency

lngCurrentInterval = lngCurrentInterval + lngFrequency
Loop

Set objSWbemServicesEx = Nothing

WScript.Quit 0

В итоге выдает ошибку

Iska
15-07-2013, 10:34
darkAge, увы мне, увы: надо-таки проверять. Хотя бы синтаксис.

Пробуйте:
Option Explicit

Const lngInterval = 60 ' seconds
Const lngFrequency = 10 ' every 10 seconds


Dim strAddress

Dim objSWbemServicesEx
Dim objSWbemObjectEx

Dim lngCurrentInterval


strAddress = "MyServer" ' or IP address

Set objSWbemServicesEx = WScript.CreateObject("WbemScripting.SWbemLocator").ConnectServer(".", "root\cimv2")

lngCurrentInterval = 0

Do
For Each objSWbemObjectEx In objSWbemServicesEx.ExecQuery("SELECT * FROM Win32_PingStatus WHERE Address = '" & strAddress & "'")
If Not IsNull(objSWbemObjectEx.StatusCode) Then
If objSWbemObjectEx.StatusCode = 0 Then
lngCurrentInterval = 0
End If
End If
Next

If lngCurrentInterval >= lngInterval Then
objSWbemServicesEx.Security_.Privileges.AddAsString "SeShutdownPrivilege", True

For Each objSWbemObjectEx In objSWbemServicesEx.ExecQuery("SELECT * FROM Win32_OperatingSystem")
objSWbemObjectEx.Shutdown
Next

Exit Do
End If

WScript.Sleep lngFrequency * 1000

lngCurrentInterval = lngCurrentInterval + lngFrequency
Loop

Set objSWbemServicesEx = Nothing

WScript.Quit 0

zavoruev
22-07-2013, 17:10
Добрый день Iska,
хотелось бы уточнить работу данного скрипта, т.к автор поста в отпуске, а скрипт надо вводить в действие.

1. данный скрипт запускается (допустим добавлением в автозагрузку) после чего осуществляется пинг удаленной машины на протяжении всего времени работы или только определенное время???

2. пинг работает каждые 10 секунд в минуту???

3. выключение будет осуществляться после 5 минут отсутствия связи с удаленной машиной??? т.е происходит анализ 50 неудачных попыток установить связь или последние 10 попыток????

4. Где поменять параметр не на выключение, а на перезагрузку??

5. Возможно дописать так, что бы был лог файл, с помощью которого можно было смотреть корректно ли отработал скрипт (перезагрузился после 50 неудачной попытки или 48!!!)

Iska
22-07-2013, 17:22
осуществляется пинг удаленной машины на протяжении всего времени работы или только определенное время??? »
Постоянно.

2. пинг работает каждые 10 секунд в минуту??? »
Каждые десять секунд:
Const lngFrequency = 10 ' every 10 seconds
делается попытка получить ответ от удалённой машины. Если не было получено ни одного ответа от удалённой машины за указанный интервал времени:
Const lngInterval = 60 ' seconds
т.е., на шесть последовательных запросов не будет получено ни одного ответа — произойдёт попытка выключения текущей машины. Если же ответ будет получен — отсчёт интервала начнётся заново.

4. Где поменять параметр не на выключение, а на перезагрузку?? »
Здесь:
objSWbemObjectEx.Shutdown
на: Reboot method of the Win32_OperatingSystem class (Windows) (http://msdn.microsoft.com/en-us/library/windows/desktop/aa393010(v=vs.85).aspx).

5. Возможно дописать так, что бы был лог файл, с помощью которого можно было смотреть корректно ли отработал скрипт (перезагрузился после 50 неудачной попытки или 48!!!) »
Можно. Пишите ;).

zavoruev
22-07-2013, 18:24
Iska, т.е логика работы следующая

1. т.е каждые 10 секунд делается 1 запрос в виде icmp-пакета, за 60 секунд получается 6 запросов. Если будет стоять 300 секунд, соответственно в этом интервале будет 30 запросов. Я так понял????

2. и только если
на шесть (тридцать) последовательных запросов не будет получено ни одного ответа — произойдёт попытка выключения текущей машины. Если же ответ будет получен — отсчёт интервала начнётся заново. »
Так???

3. 5. Возможно дописать так, что бы был лог файл, с помощью которого можно было смотреть корректно ли отработал скрипт (перезагрузился после 50 неудачной попытки или 48!!!) »
Можно. Пишите . »
Если бы мог, до обязательно дописал, т.к нужен лог только в момент пинга (10 секунд из 60).
Жду Вашей помощи!!!))
За ранее огромное спасибо!

Iska
22-07-2013, 18:34
1&2: Да.

Жду Вашей помощи!!!)) »
Зачем он Вам сдался? Ну, отключите сетевой кабель, отсчитайте минуту с небольшим, машина пошла на перезагрузку?

zavoruev
22-07-2013, 18:54
Зачем он Вам сдался? Ну, отключите сетевой кабель, отсчитайте минуту с небольшим, машина пошла на перезагрузку? »
Согласен с Вами на 100%. Проверил, работает, и хорошо!!!

Но это еще необходимо для анализа среды передачи данных (радиоканал), т.к запускать второй скрипт приведенный в начале поста для анализ прохождения icmp пакетов не хочется. А так этот скрипт будет запускается по задаче в 8.00 утра, выключается в 23.30 и собирает логи. Сразу 2-х зайцев убиваю))))
Если это сложно, и займет время, то тогда не надо!

И еще один вопрос,
1. что это за параметр "SeShutdownPrivilege" вот в этой строке
objSWbemServicesEx.Security_.Privileges.AddAsString "SeShutdownPrivilege", True
2. И нужно его менять если я тут
Код:
objSWbemObjectEx.Shutdown »
поменяю на Reboot

Iska
23-07-2013, 05:11
запускать второй скрипт приведенный в начале поста для анализ прохождения icmp пакетов не хочется. А так этот скрипт будет запускается по задаче в 8.00 утра, выключается в 23.30 и собирает логи. »
В начале поста? Может быть темы?! Тогда ткните мне пальцем где именно в нём осуществляется «анализ прохождения» и где «собираются логи».

Скажите, что Вы понимаете под «анализом среды передачи данных» и что для этого необходимо.
что это за параметр «SeShutdownPrivilege» вот в этой строке… И нужно его менять если…»
SWbemPrivilegeSet.AddAsString method (Windows) (http://msdn.microsoft.com/en-us/library/windows/desktop/aa393795(v=vs.85).aspx)
Privilege Constants (Windows) (http://msdn.microsoft.com/en-us/library/windows/desktop/aa392758(v=vs.85).aspx)
WMI: сеансы пользователя (http://www.script-coding.com/WMI_SeanceManage.html)

zavoruev
23-07-2013, 08:54
Доброе утро!!!!

Так сам скрипт который в начале поста, осуществляет запись результатов ping с прекращением работы в 19.00 (кстати этот скрипт дорабатывали именно Вы Iska, , за что Вам отдельное спасибо). Вот по этому, по умолчанию, я думал что будет переработан это скрипт с вариантом выключения/перезагрузки хоста.

Скажите, что Вы понимаете под «анализом среды передачи данных» и что для этого необходимо. »

Так как это радиоканал, то необходимо иногда смотреть логи на наличие/отсутствие пинга, время запроса-ответа ( качество радиоканала зависит от времени суток, погоды, и помех на определенной частоте, шумов). И иногда при отсутствии канала или его плохом качестве логирование спасет мир)))))

Я же говорил выше
Если это сложно, и займет время, то тогда не надо! »

Цитата zavoruev:
что это за параметр «SeShutdownPrivilege» вот в этой строке… И нужно его менять если…» »
WMI: сеансы пользователя »
Спасибо, все понятно!!!!

Iska
23-07-2013, 09:06
который в начале поста »
Вы понимаете, что означает заимствованное слово «пост»?

логирование спасет мир))))) »
Вот я и прошу Вас рассказать мне подробно, в деталях, что и когда должно помещаться в лог-файл.

zavoruev
23-07-2013, 09:15
Вы понимаете, что означает заимствованное слово «пост»? »
Хорошо, не поста, топика)))) признаю что не прав!!!

Вот я и прошу Вас рассказать мне подробно, в деталях, что и когда должно помещаться в лог-файл. »
А так этот скрипт будет запускается по задаче в 8.00 утра, выключается в 23.30 и собирает логи. »
нужен лог только в момент пинга.»
Получается что если это будет цикл будет 300 секунд и каждые 10 секунд будет выполняться запрос к удаленному хосту, то надо писать логи только 30 запросов.
Ну вот как бы и вся задача по сбору логов!!))

Iska
23-07-2013, 10:28
zavoruev, дело осталось за малым, и я таки надеюсь, что Вы мне с третьей попытки всё-таки расскажете, что именно должно помещаться в лог.

zavoruev
23-07-2013, 11:06
Так сам скрипт который в начале поста, осуществляет запись результатов ping с прекращением работы в 19.00 (кстати этот скрипт дорабатывали именно Вы Iska, , за что Вам отдельное спасибо). Вот по этому, по умолчанию, я думал что будет переработан это скрипт с вариантом выключения/перезагрузки хоста »
Надо там поправить не поста, а темы!!!

Вот тема, где Вы Iska, дописывали скрипт, т.к изначально в нем не было даты!!!
http://forum.oszone.net/thread-244258.html

и запускает этот vbs скрипт cmd файл с указанием куда писать cscript d:\ping\pingtime.vbs > d:\ping\ping.txt, а что писать обозначено в скрипте который в начале темы!!!!!!!

Вот точный вид лога, который создается скриптом в начале темы:

‘ҐаўҐа бжҐ**аЁҐў Windows (Microsoft R) ўҐабЁп 5.8
c Љ®аЇ®а*жЁп Њ*©Єа®б®дв (Microsoft Corp.), 1996-2001. ‚ᥠЇа*ў* §*йЁйҐ*л.

21.06.2013 14:14:21 192.168.1.21: зЁб«® Ў*©в=32 ўаҐ¬п=1¬б TTL=64
21.06.2013 14:14:22 192.168.1.21: зЁб«® Ў*©в=32 ўаҐ¬п=1¬б TTL=64
21.06.2013 14:14:23 192.168.1.21: зЁб«® Ў*©в=32 ўаҐ¬п=1¬б TTL=64
21.06.2013 14:14:24 192.168.1.21: зЁб«® Ў*©в=32 ўаҐ¬п=2¬б TTL=64
21.06.2013 14:14:25 192.168.1.21: зЁб«® Ў*©в=32 ўаҐ¬п=8¬б TTL=64
21.06.2013 14:14:26 192.168.1.21: зЁб«® Ў*©в=32 ўаҐ¬п=3¬б TTL=64
21.06.2013 14:14:27 192.168.1.21: зЁб«® Ў*©в=32 ўаҐ¬п=1¬б TTL=64
21.06.2013 14:14:28 192.168.1.21: зЁб«® Ў*©в=32 ўаҐ¬п=1¬б TTL=64
21.06.2013 14:14:30 192.168.1.21: зЁб«® Ў*©в=32 ўаҐ¬п=1¬б TTL=64

сейчас я надеюсь понятно объяснил??!!!:) Только в нашем варианте будет логироваться 1 пинг в 10 секунд ( по Вашему предложению)!! :mail1:

Iska
23-07-2013, 13:40
Как-то так:
Option Explicit

Const lngInterval = 60 ' seconds
Const lngFrequency = 10 ' every 10 seconds


Dim objDictionary

Dim strAddress

Dim objSWbemServicesEx
Dim objSWbemObjectEx

Dim lngCurrentInterval


Set objDictionary = WScript.CreateObject("Scripting.Dictionary")

With objDictionary
.Add 0, "Success"
.Add 11001, "Buffer Too Small"
.Add 11002, "Destination Net Unreachable"
.Add 11003, "Destination Host Unreachable"
.Add 11004, "Destination Protocol Unreachable"
.Add 11005, "Destination Port Unreachable"
.Add 11006, "No Resources"
.Add 11007, "Bad Option"
.Add 11008, "Hardware Error"
.Add 11009, "Packet Too Big"
.Add 11010, "Request Timed Out"
.Add 11011, "Bad Request"
.Add 11012, "Bad Route"
.Add 11013, "TimeToLive Expired Transit"
.Add 11014, "TimeToLive Expired Reassembly"
.Add 11015, "Parameter Problem"
.Add 11016, "Source Quench"
.Add 11017, "Option Too Big"
.Add 11018, "Bad Destination"
.Add 11032, "Negotiating IPSEC"
.Add 11050, "General Failure"
End With

strAddress = "MyServer" ' or IP address

Set objSWbemServicesEx = WScript.CreateObject("WbemScripting.SWbemLocator").ConnectServer(".", "root\cimv2")

lngCurrentInterval = 0

Do
For Each objSWbemObjectEx In objSWbemServicesEx.ExecQuery("SELECT * FROM Win32_PingStatus WHERE Address = '" & strAddress & "'")
With objSWbemObjectEx
If Not IsNull(.StatusCode) Then
WScript.Echo Now(), .Address, .StatusCode, "[" & objDictionary.Item(.StatusCode) & "]", .ResponseTime

If .StatusCode = 0 Then
lngCurrentInterval = 0
End If
Else
WScript.Echo Now(), .Address, "Error!"
End If
End With
Next

If lngCurrentInterval >= lngInterval Then
objSWbemServicesEx.Security_.Privileges.AddAsString "SeShutdownPrivilege", True

For Each objSWbemObjectEx In objSWbemServicesEx.ExecQuery("SELECT * FROM Win32_OperatingSystem")
'objSWbemObjectEx.Reboot
Next

Exit Do
End If

WScript.Sleep lngFrequency * 1000

lngCurrentInterval = lngCurrentInterval + lngFrequency
Loop

Set objSWbemServicesEx = Nothing

objDictionary.RemoveAll()
Set objDictionary = Nothing

WScript.Quit 0
?!

zavoruev
23-07-2013, 14:00
Как-то так: »

А куда в код скрипта добавить вот это
' Опрос хоста, анализ, вывод результата и пауза заданной длительности ( если разница в часах между текущем временем и заданным (19) составляет 0 - прерывам цикл)
If DateDiff("h", Time(), TimeSerial(19, 0, 0)) = 0 Then
Exit Do
End If
ограничение по времени работы скрипта!!!!

Остальное все работает!!!!! )))))) :up:

Iska
23-07-2013, 14:51
А куда в код скрипта добавить вот это … ограничение по времени работы скрипта!!!! »
Сюда:
http://img62.imageshack.us/img62/7501/1jtm.png
;).

Пардон, коль:
А так этот скрипт будет запускается по задаче в 8.00 утра, выключается в 23.30 »
то, не «11:00», а «15:30».




© OSzone.net 2001-2012