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

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   AutoIt (http://forum.oszone.net/forumdisplay.php?f=103)
-   -   [решено] Автоматизация старт/стоп при неудачном ping-овании (http://forum.oszone.net/showthread.php?t=177174)

nyevgen 02-06-2010 14:21 1425891

Автоматизация старт/стоп при неудачном ping-овании
 
Есть ADSL модем. Входящая скорость 2мб/сек. К модему подключены 2 машины. Программно на обоих машинах скорость ограничевается по 1мб/сек. Как реализовать следующее:
1. Запускается скрипт через автозагрузку и все время висит в трее;
2. Постоянно опрашивает вторую машину есть ли она в сети или нет, через команду ping;
3. Если ЕСТЬ в сети машины - проверяем, запущена ли служба, если нет - запускаем;
4. Если НЕТ в сети машина - проверяем, остановлена ли служба, если запущена - останавливаем.
Файервол не стоит ни на одной машине.

Помогите пожалуйста! Я уже весь интернет перерыл, ничего такого не нашел, в Autoit! не очень силен (автоматизировал только автоустановку приложений), но если подскажите может сам сделаю. Зараннее огромное спасибо!

Iska 02-06-2010 16:55 1426022

nyevgen, что изменилось за полдня по сравнению с этим?

madmasles 02-06-2010 17:33 1426046

nyevgen,
Попробуйте так, у меня работает. Можно поменять
Код:

If @IPAddress2 = "0.0.0.0" Then
на
Код:

If Ping("Вторая машина") = 0 Then
Код:

#NoTrayIcon

Opt("TrayMenuMode", 1)

Global $i = 0
Global $sRegRun = "HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Run"

;проверка и запись себя в автозагрузку
If RegRead($sRegRun, @ScriptName) = "" Or RegRead($sRegRun, @ScriptName) <> @ScriptFullPath Then
    RegWrite($sRegRun, @ScriptName, "REG_SZ", @ScriptFullPath)
EndIf

Global $exititem = TrayCreateItem("Выход")
TrayCreateItem("")
TraySetState()

While 1
    $msg = TrayGetMsg()
    Select
        Case $msg = $exititem
            Exit
    EndSelect

    $i += 1
    If $i = 1000 Then ;прошло 10 секунд
        If @IPAddress2 = "0.0.0.0" Then ;нет второй машины в сети.
            If ProcessExists("Ваш процесс.exe") Then ProcessClose("Ваш процесс.exe");если есть процесс, то закрываем его.
        Else ;есть вторая машина в сети
            If Not ProcessExists("Ваш процесс.exe") Then Run("Путь к Вашему\Процессу\Ваш процесс.exe");если нет процесса, запускаем его.
            ;что у Вас за процесс, я не знаю, может он по другому запускается.
        EndIf
        $i = 0 ;обнуляем счетчик
    EndIf

    Sleep(10)
WEnd

Цитата:

Цитата Iska
что изменилось за полдня по сравнению с этим?

Может nyevgen не на VBScript код хочет, а на AutoIt. :)

nyevgen 03-06-2010 10:34 1426451

Цитата:

Цитата Iska
nyevgen, что изменилось за полдня по сравнению с этим? »

На второй машине сидит пользователь, который вообще мало что в этом понимает. Я ему хочу собрать на Autoit!, чтоб был просто файл *.exe для автозагрузки и в трее будет отображаться. Да и мне удобнее - через radmin к нему зашел - проверил, без его ведома.

Цитата:

Цитата madmasles
Попробуйте так, у меня работает. Можно поменять »

Спасибо. Попробую. Дело еще в том что она работает как служба, и если я убиваю процесс - исчезает только иконка в трее, а служба продолжает работать и ограничивать. Какой командой старт/запуск именно службы?

madmasles 03-06-2010 12:41 1426528

nyevgen,
У меня так службы включаются - выключаются:
Код:

; 1-й вариант:
Run(@ComSpec & " /C sc start служба", "", @SW_HIDE)
Run(@ComSpec & " /C sc stop служба", "", @SW_HIDE)
; 2-й вариант:
; если название службы из двух слов (с пробелом), то надо так ""Ваша служба""
RunWait(@ComSpec & " /C net start ""Ваша служба""", "", @SW_HIDE)
RunWait(@ComSpec & " /C net stop ""Ваша служба""", "", @SW_HIDE)

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

nyevgen 03-06-2010 14:40 1426610

Цитата:

Цитата madmasles
If Ping("Вторая машина") = 0 Then »

вот этот вариант заработал.
Цитата:

Цитата madmasles
У меня так службы включаются - выключаются: »

заработал первый вариант.

Все заработало! Спасибо огромное!

nyevgen 03-06-2010 18:34 1426797

Можно еще вопросик. Контекстное меню сделать-сделал. Как сделать пункт "Ввод IP адреса" пингуемой машины так, чтобы выскакивало окошко с кнопками Ок и Отмена для ввода ip адреса?
Зараннее спасибо!

FlatX007 03-06-2010 18:42 1426800

Код:

#include <ButtonConstants.au3>
#include <GUIConstantsEx.au3>
#include <GuiIPAddress.au3>
#include <WindowsConstants.au3>

$nForm = GUICreate("", 207, 102, 731, 366)
$hIPAddress = _GUICtrlIpAddress_Create($nForm, 32, 8, 130, 21)
;~ _GUICtrlIpAddress_Set($hIPAddress, "0.0.0.0")
$Button1 = GUICtrlCreateButton("OK", 120, 56, 75, 25, 0)
$Button2 = GUICtrlCreateButton("Cancel", 32, 56, 75, 25, 0)
GUISetState(@SW_SHOW)

While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
        Case $GUI_EVENT_CLOSE, $Button2
            Exit
        Case
$Button1
            MsgBox (4160, "Information", "IP Address: " & _GUICtrlIpAddress_Get($hIPAddress))
            Exit

    EndSwitch
WEnd


nyevgen 03-06-2010 19:16 1426813

Подскажите, что я делаю не так??? Ну не силен я в этом. Нужно чтоб в контекстном меню был пункт "Смена IP" - это я сделал. А как сделать чтоб выскакивало "это самое окно" и потом вбивался новый IP в пинговании???

PHP код:

;меню скрипта кнопка Выход и кнопка Смена IP
Global $exititem TrayCreateItem("Выход")
TraySetState()
TrayCreateItem("")
Global 
$nForm TrayCreateItem("Смена IP")
TraySetIcon("shell32.dll",156)

While 
1
    $msg 
TrayGetMsg()
    
Select
    
Case $msg $exititem
    
Exit
EndSelect

#include <ButtonConstants.au3>
#include <GUIConstantsEx.au3>
#include <GuiIPAddress.au3>
#include <WindowsConstants.au3>

$nForm GUICreate(""207102731366)
$hIPAddress _GUICtrlIpAddress_Create($nForm32813021)
_GUICtrlIpAddress_Set($hIPAddress"0.0.0.0")
$Button1 GUICtrlCreateButton("OK"1205675250)
$Button2 GUICtrlCreateButton("Cancel"325675250)
GUISetState(@SW_SHOW)

While 
2
    $nMsg 
GUIGetMsg()
    Switch 
$nMsg
        
Case $GUI_EVENT_CLOSE$Button2
            
Exit
        Case 
$Button1
            MsgBox 
(4160"Information""IP Address: " _GUICtrlIpAddress_Get($hIPAddress))
            Exit
    EndSwitch 


FlatX007 03-06-2010 23:36 1426950

Код:

#include <GUIConstantsEx.au3>
#include <Constants.au3>
#include <GuiIPAddress.au3>
#include <WindowsConstants.au3>

Global $nForm, $hIPAddress, $sLastIP
Global $START_IP = "127.0.0.1"

Opt("TrayMenuMode", 1)

$hIp = TrayCreateItem("IP Ping")
TrayCreateItem("")
$hExit = TrayCreateItem("Exit")
TraySetState()

$start = 0
While 1
    $msg = TrayGetMsg()
    Switch $msg
        Case $hIp
            TrayItemSetState($hIp, $TRAY_UNCHECKED + $TRAY_DISABLE)
            TrayItemSetState($hExit, $TRAY_DISABLE)
            $sIP = _GuiCreate()
            If Not (@error) Then MsgBox(0, "", 'IP - ' & $sIP)
            TrayItemSetState($hIp, $TRAY_ENABLE)
            TrayItemSetState($hExit, $TRAY_ENABLE)

        Case $hExit
            Exit

    EndSwitch
WEnd

Func
_GuiCreate()

    $nForm = GUICreate("", 223, 102, -1, -1, BitOR($WS_SYSMENU, $WS_CAPTION, $WS_POPUP, $WS_POPUPWINDOW, $WS_BORDER, $WS_CLIPSIBLINGS), BitOR($WS_EX_TOPMOST, $WS_EX_WINDOWEDGE))
    $hIPAddress = _GUICtrlIpAddress_Create($nForm, 24, 16, 162, 21)
    If Not $sLastIP Then
        _GUICtrlIpAddress_Set($hIPAddress, $START_IP)
    Else
        _GUICtrlIpAddress_Set($hIPAddress, $sLastIP)
    EndIf
    $Button1 = GUICtrlCreateButton("Ok", 144, 64, 43, 25)
    $Button2 = GUICtrlCreateButton("Cancel", 64, 64, 75, 25)

    GUISetState(@SW_SHOW, $nForm)

    While 1
        $nMsg = GUIGetMsg()
        Switch $nMsg
            Case $GUI_EVENT_CLOSE, $Button2
                GUIDelete($nForm)
                Return SetError(1, 0, 0)
            Case $Button1
                $sLastIP
= _GUICtrlIpAddress_Get($hIPAddress)
                GUIDelete($nForm)
                Return $sLastIP
        EndSwitch
    WEnd

EndFunc
  ;==>_GuiCreate


nyevgen 05-06-2010 22:35 1428194

Наверняка кому-то еще пригодится. Нужно совместить это

Код:

;нестандартное меню скрипта
Opt("TrayMenuMode", 1)
;меню скрипта - кнопка Выход
Global $exititem = TrayCreateItem("Выход")
TraySetState()
TraySetIcon("shell32.dll",156)
;всплывающая подсказка при наведении мыши
TraySetToolTip('Ping My Lan')
While 1
    $msg = TrayGetMsg()
    Select
    Case $msg = $exititem
    Exit
EndSelect

;цикл работы скрипта
$i += 1
    If $i = 1000 Then ;если прошло 10 секунд...
    If Ping("127.0.0.1") = 0 Then ;если машины нет в сети...
        TraySetIcon("shell32.dll",338);меняем иконку
        TraySetToolTip('Ping My Lan - Юзера нет в сети');всплывающая подсказка при наведении мыши
        If ProcessExists("ваш процесс") Then Run(@ComSpec & " /C sc stop служба", "", @SW_HIDE);проверяем наличие запущенного процесса службы "ваша служба", если есть - останавливаем службу.
        Else ;если машина есть в сети...
        TraySetIcon("shell32.dll",239);меняем иконку
        TraySetToolTip('Ping My Lan - Юзер в сети');всплывающая подсказка при наведении мыши
    If Not ProcessExists("ваш процесс") Then Run(@ComSpec & " /C sc start служба", "", @SW_HIDE);проверяем наличие запущенного процесса службы "ваша служба", если нет - запускаем службу.
        EndIf
    $i = 0 ;обнуляем счетчик
    EndIf
    Sleep(10)
WEnd

и вот это

Код:

#include <GUIConstantsEx.au3>
#include <Constants.au3>
#include <GuiIPAddress.au3>
#include <WindowsConstants.au3>

Global $nForm, $hIPAddress, $sLastIP
Global $START_IP = "127.0.0.1"

Opt("TrayMenuMode", 1)

$hIp = TrayCreateItem("IP Ping")
TrayCreateItem("")
$hExit = TrayCreateItem("Exit")
TraySetState()

$start = 0
While 1
    $msg = TrayGetMsg()
    Switch $msg
        Case $hIp
            TrayItemSetState($hIp, $TRAY_UNCHECKED + $TRAY_DISABLE)
            TrayItemSetState($hExit, $TRAY_DISABLE)
            $sIP = _GuiCreate()
            If Not (@error) Then MsgBox(0, "", 'IP - ' & $sIP)
            TrayItemSetState($hIp, $TRAY_ENABLE)
            TrayItemSetState($hExit, $TRAY_ENABLE)

        Case $hExit
            Exit

    EndSwitch
WEnd

Func _GuiCreate()

    $nForm = GUICreate("", 223, 102, -1, -1, BitOR($WS_SYSMENU, $WS_CAPTION, $WS_POPUP, $WS_POPUPWINDOW, $WS_BORDER, $WS_CLIPSIBLINGS), BitOR($WS_EX_TOPMOST, $WS_EX_WINDOWEDGE))
    $hIPAddress = _GUICtrlIpAddress_Create($nForm, 24, 16, 162, 21)
    If Not $sLastIP Then
        _GUICtrlIpAddress_Set($hIPAddress, $START_IP)
    Else
        _GUICtrlIpAddress_Set($hIPAddress, $sLastIP)
    EndIf
    $Button1 = GUICtrlCreateButton("Ok", 144, 64, 43, 25)
    $Button2 = GUICtrlCreateButton("Cancel", 64, 64, 75, 25)

    GUISetState(@SW_SHOW, $nForm)

    While 1
        $nMsg = GUIGetMsg()
        Switch $nMsg
            Case $GUI_EVENT_CLOSE, $Button2
                GUIDelete($nForm)
                Return SetError(1, 0, 0)
            Case $Button1
                $sLastIP = _GUICtrlIpAddress_Get($hIPAddress)
                GUIDelete($nForm)
                Return $sLastIP
        EndSwitch
    WEnd

EndFunc  ;==>_GuiCreate

А то у меня ничего не выходит.
Нужно следующее:
- есть скрипт, пингует - откл/вкл службу. как сделать чтоб еще в контекстном меню был пункт - IP - выскакивало окошко где вводится другой ip для последующего пингования и откл/вкл службы соотвественно.

Зараннее спасибо!!!

FlatX007 07-06-2010 16:38 1429431

Код:

#include <GUIConstantsEx.au3>
#include <Constants.au3>
#include <GuiIPAddress.au3>
#include <WindowsConstants.au3>

Global $nForm, $hIPAddress, $sLastIP, $Timer

Global $START_IP = "127.0.0.1"
Global $WAITING = 10
Global $PROCESS_WELL_PC = 'pr_1.exe'
Global $PROCESS_BAD_PC = 'pr_2.exe'

Global $GLOBAL_IP = $START_IP

Opt("TrayMenuMode", 1)
$Timer = TimerInit()

$hIp = TrayCreateItem("IP Ping")
TrayCreateItem("")
$hExit = TrayCreateItem("Exit")
TraySetState()
TraySetIcon("shell32.dll", 156)

While 1
    $msg = TrayGetMsg()
    Switch $msg
        Case $hIp
            TrayItemSetState($hIp, $TRAY_UNCHECKED + $TRAY_DISABLE)
            TrayItemSetState($hExit, $TRAY_DISABLE)
            $sIP = _GuiCreate()
            If Not (@error) Then $GLOBAL_IP = $sIP
            TrayItemSetState($hIp, $TRAY_ENABLE)
            TrayItemSetState($hExit, $TRAY_ENABLE)

        Case $hExit
            Exit

        Case Else
            If
(Round(TimerDiff($Timer) / 1000)) > $WAITING Then
                ConsoleWrite('ping - ' & $GLOBAL_IP & @CRLF)
                $Ping = Ping($GLOBAL_IP)
                $Error = @error
                $Hint = _ErrorPing($Error)
                If $Ping = 0 Then
                    _IpPingBadPC($Hint)
                Else
                    _IpPingWellPC($Hint)
                EndIf
                $Timer = TimerInit()
            EndIf
    EndSwitch

WEnd

Func _IpPingWellPC($Hint = '')

    TraySetIcon("shell32.dll", 239)
    TraySetToolTip($Hint)
    If Not ProcessExists($PROCESS_WELL_PC) Then Run(@ComSpec & " /C sc start служба", "", @SW_HIDE)

EndFunc  ;==>_IpPingWellPC

Func _IpPingBadPC($Hint = '') ;если машины нет в сети...

    TraySetIcon("shell32.dll", 338)
    TraySetToolTip($Hint)
    If ProcessExists($PROCESS_BAD_PC) Then Run(@ComSpec & " /C sc stop служба", "", @SW_HIDE)

EndFunc  ;==>_IpPingBadPC

Func _ErrorPing($Error = 0)

    Switch $Error
        Case 1
            Return "Xост работает в автономном режиме"
        Case 2
            Return "Xост недостижим"
        Case 3
            Return "Xост неверно указан"
        Case 4
            Return "Другие ошибки"
        Case Else
            Return "Xост Онлайн"
    EndSwitch

EndFunc  ;==>_ErrorPing

Func _GuiCreate()

    $nForm = GUICreate("", 223, 102, -1, -1, BitOR($WS_SYSMENU, $WS_CAPTION, $WS_POPUP, $WS_POPUPWINDOW, $WS_BORDER, $WS_CLIPSIBLINGS), BitOR($WS_EX_TOPMOST, $WS_EX_WINDOWEDGE))
    $hIPAddress = _GUICtrlIpAddress_Create($nForm, 24, 16, 162, 21)
    If Not $sLastIP Then
        _GUICtrlIpAddress_Set($hIPAddress, $START_IP)
    Else
        _GUICtrlIpAddress_Set($hIPAddress, $sLastIP)
    EndIf
    $Button1 = GUICtrlCreateButton("Ok", 144, 64, 43, 25)
    $Button2 = GUICtrlCreateButton("Cancel", 64, 64, 75, 25)

    GUISetState(@SW_SHOW, $nForm)

    While 1
        $nMsg = GUIGetMsg()
        Switch $nMsg
            Case $GUI_EVENT_CLOSE, $Button2
                GUIDelete($nForm)
                Return SetError(1, 0, 0)
            Case $Button1
                $sLastIP = _GUICtrlIpAddress_Get($hIPAddress)
                GUIDelete($nForm)
                Return $sLastIP
        EndSwitch
    WEnd

EndFunc  ;==>_GuiCreate


nyevgen 08-06-2010 17:11 1430070

FlatX007, ОГРОМНОЕ СПАСИБО!!!

nyevgen 30-09-2010 23:12 1508536

А как все это можно организовать в Windows Seven? Может каким-то иным способом можно. И еще (по возможности), как сделать чтоб пинговало несколько IP-адресов?

FlatX007 30-09-2010 23:28 1508546

А я и придумавал это в Windows Seven =)

in-com 09-10-2010 08:15 1514822

Цитата:

Цитата FlatX007
придумавал это »

А как еще можно в этот скрипт добавить порт для проверки?

nyevgen 13-10-2010 19:22 1518141

Цитата:

Цитата FlatX007
А я и придумавал это в Windows Seven »

Мой код скрипта
#cs ----------------------------------------------------------------------------
;AutoIt Version: 3.3.6.1

;Описание скрипта:
;Запускается скрипт и мониторит сетевой ресурс на наличие его в сети
;Если сетевой ресурс пропадает из сети скрипт останавливает службу TMetr
;Как только сетевой ресурс появляется в сети происходит запуск службы TMetr
#ce ----------------------------------------------------------------------------

;предотвращение возможности множественного запуска скрипта
If WinExists(@ScriptName) Then Exit
AutoItWinSetTitle(@ScriptName)

;объявление переменных для реестра
Global $i = 0
Global $sRegRun = "HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Run"
;проверка реестра и запись себя в автозагрузку
If RegRead($sRegRun, @ScriptName) = "" Or RegRead($sRegRun, @ScriptName) <> @ScriptFullPath Then
RegWrite($sRegRun, @ScriptName, "REG_SZ", @ScriptFullPath)
EndIf

;нестандартное меню скрипта
Opt("TrayMenuMode", 1)
;меню скрипта - кнопка Выход
Global $exititem = TrayCreateItem("Выход")
TraySetState()
TraySetIcon("shell32.dll",156)
;всплывающая подсказка при наведении мыши
TraySetToolTip('Ping My Lan')
While 1
$msg = TrayGetMsg()
Select
Case $msg = $exititem
Exit
EndSelect

;цикл работы скрипта
$i += 1
If $i = 1000 Then ;если прошло 10 секунд...
If Ping("192.168.1.2") = 0 Then ;если машины нет в сети...
TraySetIcon("shell32.dll",338);меняем иконку
TraySetToolTip('Ping My Lan - Юзера нет в сети');всплывающая подсказка при наведении мыши
If ProcessExists("TrafSvc.exe") Then Run(@ComSpec & " /C sc stop TrafSvc", "", @SW_HIDE);проверяем наличие запущенного процесса службы TMetr, если есть - останавливаем службу.
Else ;если машина есть в сети...
TraySetIcon("shell32.dll",239);меняем иконку
TraySetToolTip('Ping My Lan - Юзер в сети');всплывающая подсказка при наведении мыши
If Not ProcessExists("TrafSvc.exe") Then Run(@ComSpec & " /C sc start TrafSvc", "", @SW_HIDE);проверяем наличие запущенного процесса службы TMetr, если нет - запускаем службу.
EndIf
$i = 0 ;обнуляем счетчик
EndIf
Sleep(10)
WEnd

У меня на Windows Seven службу не останавливает. Запускается, отображается в трее, меняется значок при "есть/нет юзера", но служба не останавливатся. Думал может служба в семерке по другому называется, проверил так же. Но не работает скрипт поностью.

Разобрался. От имени администратора нужно было запускать.

nyevgen 23-04-2011 17:06 1664412

А не поможете еще в одном деле? В
этот
Код:

;предотвращение возможности множественного запуска скрипта
If WinExists(@ScriptName) Then Exit
AutoItWinSetTitle(@ScriptName)

;объявление переменных для реестра
Global $i = 0
Global $sRegRun = "HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Run"
;проверка реестра и запись себя в автозагрузку
If RegRead($sRegRun, @ScriptName) = "" Or RegRead($sRegRun, @ScriptName) <> @ScriptFullPath Then
RegWrite($sRegRun, @ScriptName, "REG_SZ", @ScriptFullPath)
EndIf

;нестандартное меню скрипта
Opt("TrayMenuMode", 1)
;меню скрипта - кнопка Выход
Global $exititem = TrayCreateItem("Выход")
TraySetState()
TraySetIcon("shell32.dll",156)
;всплывающая подсказка при наведении мыши
TraySetToolTip('Ping My Lan')
While 1
    $msg = TrayGetMsg()
    Select
    Case $msg = $exititem
    Exit
EndSelect

;цикл работы скрипта
$i += 1
    If $i = 500 Then ;если прошло 5 секунд...
    If Ping("192.168.1.2") = 0 Then ;если машины нет в сети...
        TraySetIcon("shell32.dll",338);меняем иконку
        TraySetToolTip('Ping My Lan - Юзера нет в сети');всплывающая подсказка при наведении мыши
        If ProcessExists("TrafSvc.exe") Then Run(@ComSpec & " /C sc stop TrafSvc", "", @SW_HIDE);проверяем наличие запущенного процесса службы TMetr, если есть - останавливаем службу.
        Else ;если машина есть в сети...
        TraySetIcon("shell32.dll",239);меняем иконку
        TraySetToolTip('Ping My Lan - Юзер в сети');всплывающая подсказка при наведении мыши
    If Not ProcessExists("TrafSvc.exe") Then Run(@ComSpec & " /C sc start TrafSvc", "", @SW_HIDE);проверяем наличие запущенного процесса службы TMetr, если нет - запускаем службу.
        EndIf
    $i = 0 ;обнуляем счетчик
EndIf
    Sleep(5)
WEnd

скрипт добавить следующее:
- пингование IP адресов от 1 до 10 (т.е. 192.168.1.1, 192.168.1.2 и т.д.)
- в случае удачного пингования ХОТЯ БЫ ОДНОГО IP адреса скрипт останавливает службу
- в случае НЕудачного пинга ни от одной машины служба запускалась

ПОМОГИТЕ, ПОЖАЛУЙСТА!!!


Время: 07:02.

Время: 07:02.
© OSzone.net 2001-