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

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

Ответить
Настройки темы
VBS/WSH/JS - [решено] Ping с выключением компа

Новый участник


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

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


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

Код: Выделить весь код
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 минут, то компьютер выключался.

Отправлено: 17:17, 12-07-2013

 

Ветеран


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

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


Скрипт явно унаследованный.

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

Отправлено: 17:51, 12-07-2013 | #2



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

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


Новый участник


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

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


Iska, тот, который пингует.

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

Последний раз редактировалось darkAge, 12-07-2013 в 18:01.


Отправлено: 17:54, 12-07-2013 | #3


Ветеран


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

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


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

Отправлено: 18:36, 12-07-2013 | #4


Новый участник


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

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


Изображения
Тип файла: jpg Снимок1.JPG
(25.7 Kb, 13 просмотров)

Вот что получается, что бы пока долго не ждать, сделал 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
В итоге выдает ошибку

Отправлено: 09:25, 15-07-2013 | #5


Ветеран


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

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


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

Отправлено: 10:34, 15-07-2013 | #6


Старожил


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

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


Добрый день Iska,
хотелось бы уточнить работу данного скрипта, т.к автор поста в отпуске, а скрипт надо вводить в действие.

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

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

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

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

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

Отправлено: 17:10, 22-07-2013 | #7


Ветеран


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

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


Цитата zavoruev:
осуществляется пинг удаленной машины на протяжении всего времени работы или только определенное время??? »
Постоянно.

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

Цитата zavoruev:
4. Где поменять параметр не на выключение, а на перезагрузку?? »
Здесь:
Код: Выделить весь код
objSWbemObjectEx.Shutdown
на: Reboot method of the Win32_OperatingSystem class (Windows).

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

Отправлено: 17:22, 22-07-2013 | #8


Старожил


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

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


Iska, т.е логика работы следующая

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

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

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

Отправлено: 18:24, 22-07-2013 | #9


Ветеран


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

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


1&2: Да.

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

Отправлено: 18:34, 22-07-2013 | #10



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

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

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
Службы - Проблема с выключением Rommel Microsoft Windows 8 и 8.1 15 01-12-2012 17:26
Ошибка - [решено] Проблемы с выключением компа Vlaleo Лечение систем от вредоносных программ 6 04-07-2011 12:17
Любой язык - [решено] Запуск файла перед выключением компа. S.T.R.E.L.O.K. Скриптовые языки администрирования Windows 6 04-09-2009 23:14
Проблема с удалённым выключением компа. NetSearcher Microsoft Windows 2000/XP 2 18-05-2007 15:49
проблема с выключением Bright Microsoft Windows 2000/XP 4 28-11-2006 23:15




 
Переход