Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Скриптовые языки администрирования Windows (http://forum.oszone.net/forumdisplay.php?f=102)
-   -   Скрипт перезагрузки роутера при разрыве коннекта (http://forum.oszone.net/showthread.php?t=308550)

Николай_Шантуров@vk 29-11-2015 03:41 2579756

Скрипт перезагрузки роутера при разрыве коннекта
 
Доброго времени всем!
Есть готовый скрипт для адсл роутера, работает с утилитой "plink" запускается/отключается, всё без ошибок (без видимых)
Проблема в том, что при имитации разрыва соединения (вынимаю адсл из порта модема) перезагрузка не начинается вообще,
с консоли команда проходит, cd /d c:\route plink -noagent -l ЛОГИН -pw ПАРОЛЬ 192.168.1.1 reboot
но не завершается, пока не введу ещё рас reboot



Код:

Option Explicit

Dim CheckPeriodSuccess, CheckPeriodFailure, CheckTimes, CheckTimesPeriod, oShell, LocalIP, UserName, Password, Client, Times

' =====================================================================


' Данные аутентификации
LocalIP = "192.168.1.1"
UserName = "ЛОГИН"
Password = "ПАРОЛЬ"

' Периодичность проверки пинга в мсек. (если подключение есть)
CheckPeriodSuccess = 20000

' Задержка перед повторной проверкой, если роутер был перезагружен
CheckPeriodFailure = 120000

' Кол-во контрольных проверок пинга (пакетов подряд)
CheckTimes = 3
' с интервалом (мсек.)
CheckTimesPeriod = 1000

' Путь к программе-клиенту (например plink.exe)
Client = "C:\route\plink.exe"

' =====================================================================

Set oShell = WScript.CreateObject("WScript.Shell")

Do
    if CheckRouter() then
        ' если все ОК
        WScript.Sleep CheckPeriodSuccess
    else
        ' если произведена перезагрузка
        WScript.Sleep CheckPeriodFailure     
    end if
Loop


Function CheckRouter()
  Dim Connected, ProcessID

  Connected = false

  Times = CheckTimes
  Do
    If IsOnline("www.ya.ru") then
        Connected = true
    elseif IsOnline("8.8.8.8") Then
        Connected = true
    end if
    if not Connected then
        if Times > 0 then
            Times = Times - 1
            WScript.Sleep CheckTimesPeriod
        end if
    end if
  Loop while Times and (not Connected)

  if Connected then
    CheckRouter = true
    'msgbox "Подключения нет."
  else
    'msgbox "Запускаю клиент"
    ProcessID = CreateProcess(Client & " " & LocalIP, 1)

    if 0 <> ProcessID then
        'msgbox "Передаю сочетания"
        WScript.Sleep 2000
        oShell.AppActivate ProcessID
        WScript.Sleep 500
        oShell.SendKeys UserName & chr(13)
        WScript.Sleep 500
        oShell.SendKeys Password & chr(13)
        WScript.Sleep 500
        oShell.SendKeys "reboot" & chr(13)
        WScript.Sleep 500
        oShell.SendKeys "^]"
        WScript.Sleep 100
        oShell.SendKeys "quit" & chr(13)
        WScript.Sleep 100
        call TerminateByPID (ProcessID)
    end if
  End If
End Function

Sub TerminateByPID(PID)
    Dim oWMISvc, oProcess, colProcesses
    Set oWMISvc = GetObject("winmgmts:{impersonationLevel=impersonate}!\\.\root\cimv2")
    set colProcesses = oWMISvc.ExecQuery("Select * from Win32_Process WHERE ProcessId=" & PID)
    if colProcesses.Count > 0 then
        For each oProcess in colProcesses
            call oProcess.Terminate
        Next
    end if
End Sub

Function IsOnline (Address)
    On Error Resume Next
    Dim objPing, objStatus
    Set objPing = GetObject("winmgmts:{impersonationLevel=impersonate}")._
        ExecQuery("select Replysize from Win32_PingStatus where address = '" & Address & "'")

    For Each objStatus in objPing
        IsOnline = not IsNull(objStatus.ReplySize) or IsOnline
    Next
End Function

Function CreateProcess(cmd, WindowStyle) 'вернет ProcessID
    Dim objWMIService, objStartup, objConfig, objProcess, PID
    Const SW_HIDDEN = 0
    Const SW_NORMAL = 1
    Set objWMIService = GetObject("winmgmts:{impersonationLevel=impersonate}!\\.\root\cimv2")
    Set objStartup = objWMIService.Get("Win32_ProcessStartup")
    Set objConfig = objStartup.SpawnInstance_
    objConfig.ShowWindow = WindowStyle
    Set objProcess = GetObject("winmgmts:root\cimv2:Win32_Process")
    call objProcess.Create (cmd, null, objConfig, PID)
    if not IsNull (PID) then CreateProcess = PID else CreateProcess = 0
End Function


Николай_Шантуров@vk 30-11-2015 00:49 2579950

можно не отвечать.


Время: 00:50.

Время: 00:50.
© OSzone.net 2001-