Запуск и работа nnCron в Win7

Обсуждение программ nnCron и nnCron LITE

Re: Запуск и работа nnCron в Win7

Postby Aushkin » Wed, 14 Sep 2011, 17:27

Как выяснилось ещё пару, а может и больше лет назад, проверка нужна, потому как при простой задаче при наличии инета запускать софтинку, крон запускал её спокойно ещё до логона реального юзера, считая юзерами как раз то, на что делается проверка.. Может быть позже это пофиксили, но с тех пор проверка сохраняется, осадочек как говорится остался.
Aushkin
 
Posts: 17
Joined: Mon, 12 Sep 2011, 21:22

Re: Запуск и работа nnCron в Win7

Postby Aushkin » Thu, 15 Sep 2011, 09:35

Что-то с этими THEN всё-таки не так. Если их все пять в конце задания, то почему-то вторая его часть(после ELSE) не хочет отрабатывать. Хотя в первоначальном варианте, до полученных рекомендаций всё работало.
Пожалуйста, на примере моего задания покажите точное расположение THEN в конструкции и их количество, что бы это было верным, работоспособность первой и второй части я проверю. Устал от RTFM, который на практике не всегда работает, прямо как nnCron(дефолтный) в 7-ке :D
Заранее спасибо.

P.S. Есть ещё вопрос.

А можно объединить условия которые после ACTION вместо IF-ов, AND-ами, соответственно отделаться одним IF-ом?

Ну вот имеется в виду вот эта часть:
Code: Select all
...
Action:
PROC-EXIST: "MyProgramm.exe" 0=
Inet?
Local? 0=
AND
AND
IF
    SWHide
    START-APPW: %ComSpec% /c rasdial.exe "MyVPN"
    START-APPW: %ComSpec% /c ipconfig.exe /flushdns
    PAUSE: "00:01"
    START-APPW: "C:\nnСron\555.cmd"
    START-APP: "C:\Program Files (x86)\MyFolder\MyProgramm.exe.exe"
  THEN
ELSE

...


так можно?
Aushkin
 
Posts: 17
Joined: Mon, 12 Sep 2011, 21:22

Re: Запуск и работа nnCron в Win7

Postby makrus » Thu, 15 Sep 2011, 15:44

Aushkin
Что-то с этими THEN всё-таки не так. Если их все пять в конце задания...
С ними все нормально :wink: и их надо не все куда-то, а каждое в то место в коде которое обеспечит ветвление выполнения задачи в соответствии с твоими требованиями.
Попробуй вот так:
Code: Select all
#( myONLINE
NoDel
ONLY_SYSTEM
AsLoggedUser
LoadProfile
SingleInstance
Time: */1  * * * * *
: Inet?  ( -- ? )
  HOST-EXIST: "google.com"
;
: Local?  ( -- ? )
  HOST-EXIST: "тут имя нужного локального хоста, допустим X"
;
: condition_good? ( -- ? )
  \ "наличие доступа в Internet + проверить ОТСУТСТВИЕ доступа к локальному хосту + проверить отсутствие среди процессов нужной программы."
  PROC-EXIST: "MyProgramm.exe" Local? OR 0=
  Inet? AND
;
Rule: USERNAME S" SYSTEM" COMPARE USERNAME S" Local Service" COMPARE OR USERNAME S" Network Service" COMPARE OR 0=
Action:
  condition_good?
  IF
    SWHide
    START-APPW: %ComSpec% /c rasdial.exe "MyVPN"
    START-APPW: %ComSpec% /c ipconfig.exe /flushdns
    PAUSE: "00:01"
    START-APPW: "C:\nnСron\555.cmd"
    START-APP: "C:\Program Files (x86)\MyFolder\MyProgramm.exe.exe"
  ELSE
    SWHide
    START-APPW: %ComSpec% /c rasdial.exe "MyVPN" /DISCONNECT
    START-APPW: %ComSpec% /c ipconfig.exe /flushdns
    START-APPW: "C:\nnСron\777.cmd"
    START-APPW: %ComSpec% /c taskkill.exe /IM "MyProgramm.exe" /F /T
    PAUSE: 45000 TRAY-REFRESH
    WIN-HIDE: "0x3804D8"
    WIN-HIDE: "0x1507B6"
    WIN-TERMINATE: "0x3804D8"
    WIN-TERMINATE: "0x1507B6"
THEN
)#
все познается в сравнении
makrus
 
Posts: 336
Joined: Mon, 12 Jul 2004, 14:46
Location: Волгоград

Re: Запуск и работа nnCron в Win7

Postby Aushkin » Fri, 16 Sep 2011, 10:05

С THEN-ами сделал так, три поставил после первого набора действий и два после второго набора действий, ELSE в середине убрал совсем и начало работать.
Ваш вариант безусловно красивее ... но не работает :(
Если не трудно поясните, в Вашем варианте в части:
Code: Select all
  PROC-EXIST: "MyProgramm.exe" Local? OR 0=
  Inet? AND
Почему OR(или) стоит до 0= ?
В моём варианте SingleInstance как-то своеобразно работает, вроде задача отработала и на конект и на отрубание всего, но при восстановлении исходных условий не перезапускается.
Aushkin
 
Posts: 17
Joined: Mon, 12 Sep 2011, 21:22

Re: Запуск и работа nnCron в Win7

Postby VoidVolker » Fri, 16 Sep 2011, 15:16

Aushkin wrote:Сразу оговорюсь, пытался использовать <VBScript> ... </SCRIPT> и <BATScript> ... </SCRIPT> в конструкции, но почему-то не работает.

Скорее всего проблема в авторизации процесса.
Code: Select all
Rule: USERNAME S" SYSTEM" COMPARE
Rule: USERNAME S" Local Service" COMPARE
Rule: USERNAME S" Network Service" COMPARE

Вполне корректная запись. Идентично:
Code: Select all
Rule: USERNAME S" SYSTEM" COMPARE
USERNAME S" Local Service" COMPARE OR
USERNAME S" Network Service" COMPARE OR


Aushkin wrote:Rule: USERNAME S" SYSTEM" COMPARE OR Rule: USERNAME S" Local Service" COMPARE OR Rule: USERNAME S" Network Service" COMPARE

Неверно.
Aushkin wrote:Rule: USERNAME S" SYSTEM" COMPARE USERNAME S" Local Service" COMPARE USERNAME S" Network Service" COMPARE AND AND

Сам код корректный, но это - не то же самое, что вышеприведенный код. А вот логически код неверный: имя пользователя не может одновременно равняться трем разным именам пользователей, т.е. в данном случае результат всегда будет ИСТИНА.

Code: Select all
PROC-EXIST: "MyProgramm.exe" 0=
IF
  Inet?
  IF \ Есть инет!
    Local? 0= \
    IF
        SWHide 
        START-APPW: %ComSpec% /c rasdial.exe "MyVPN"
        START-APPW: %ComSpec% /c ipconfig.exe /flushdns
        PAUSE: "00:01"
        START-APPW: "C:\nnСron\555.cmd"
        START-APP: "C:\Program Files (x86)\MyFolder\MyProgramm.exe.exe"
    THEN
  ELSE \ Нет инета!
    Inet? 0=  \ И зачем еще раз проверять???
    IF
      Local? 0=
      IF
          SWHide
          START-APPW: %ComSpec% /c rasdial.exe "MyVPN" /DISCONNECT
          START-APPW: %ComSpec% /c ipconfig.exe /flushdns
          START-APPW: "C:\nnСron\777.cmd"
          START-APPW: %ComSpec% /c taskkill.exe /IM "MyProgramm.exe" /F /T
          PAUSE: 45000 TRAY-REFRESH
          WIN-HIDE: "0x3804D8"
          WIN-HIDE: "0x1507B6"
          WIN-TERMINATE: "0x3804D8"
          WIN-TERMINATE: "0x1507B6"
      THEN
    \ Т.к. проверка второй раз наличия инета бессмыслена, то её надо выкинуть, но если оставить - то нужен и для неё THEN
  \ Где THEN, закрывающий второй IF?
\ Где THEN, закрывающий первый IF?


Aushkin wrote:А можно немного подробнее для чайников.

IF - берет со стека флаг, если он истина(значение не равное нулю) - то выполняется код между IF и ELSE (если есть) или THEN, в ином случае(условие - ложь, т.е. НОЛЬ) выполняется код между ELSE и THEN, если ELSE нет - то ничего не выполняется. Т.о. эти три слова ограничивают условие и два варианта действий. Ибо программа мысли читать не умеет. Пока еще.
А вообще, чтобы таких вот проблем не возникало, надо писать код структурировано(см. выше).
95% вопросов уже обсуждались на форуме или ответы на них есть в мануале.        nnCron 1.93 b15.exe
Как правильно задавать вопросы.
User avatar
VoidVolker
Site Admin
 
Posts: 2898
Joined: Tue, 25 Apr 2006, 17:56

Re: Запуск и работа nnCron в Win7

Postby makrus » Fri, 16 Sep 2011, 15:28

Aushkin
С THEN-ами сделал так, три поставил после первого набора действий и два после второго набора действий, ELSE в середине убрал совсем и начало работать.
Здесь слова не нужны, надо скопировать целиком всю задачу и вставить в свое сообщение... если, конечно, ты хочешь что бы тебе попробовали подсказать из-за чего у тебя может не работать.
Ваш вариант безусловно красивее ... но не работает
значит где-то ошибка, или в моем понимании что требуется или в моем переводе моего понимания в код или в твоем описании того что необходимо.
Давай разбираться где ошибка, добавил в задачу логирование хода ее работы для правильной оценки работает/нет в разных условиях:
Code: Select all
#( myONLINE
NoDel
ONLY_SYSTEM
AsLoggedUser
LoadProfile
SingleInstance
Time: */1  * * * * * \ данная строка в таком виде не имеет смысла, предлагаю ее убрать если нужен запуск задачи каждую минуту
: Inet?  ( -- ? )
  HOST-EXIST: "google.com"
;
: Local?  ( -- ? )
  HOST-EXIST: "тут имя нужного локального хоста, допустим X"
;
: condition_good? ( -- ? )
  \ "наличие доступа в Internet + проверить ОТСУТСТВИЕ доступа к локальному хосту + проверить отсутствие среди процессов нужной программы."
  PROC-EXIST: "MyProgramm.exe" Local? OR 0=
  Inet? AND
;
Rule: USERNAME S" SYSTEM" COMPARE USERNAME S" Local Service" COMPARE OR USERNAME S" Network Service" COMPARE OR 0=
Action:
  S" Задача запустилась" CRON-LOG
  condition_good?
  IF
    S" Поднимаем VPN" CRON-LOG
    SWHide
    START-APPW: %ComSpec% /c rasdial.exe "MyVPN"
    START-APPW: %ComSpec% /c ipconfig.exe /flushdns
    PAUSE: "00:01"
    START-APPW: "C:\nnСron\555.cmd"
    START-APP: "C:\Program Files (x86)\MyFolder\MyProgramm.exe.exe"
  ELSE
    S" Разрываем VPN" CRON-LOG
    SWHide
    START-APPW: %ComSpec% /c rasdial.exe "MyVPN" /DISCONNECT
    START-APPW: %ComSpec% /c ipconfig.exe /flushdns
    START-APPW: "C:\nnСron\777.cmd"
    START-APPW: %ComSpec% /c taskkill.exe /IM "MyProgramm.exe" /F /T
    PAUSE: 45000 TRAY-REFRESH
    WIN-HIDE: "0x3804D8"
    WIN-HIDE: "0x1507B6"
    WIN-TERMINATE: "0x3804D8"
    WIN-TERMINATE: "0x1507B6"
THEN
S" Задача отработала" CRON-LOG
)#


Теперь смотри лог работы задачи, копируй его сюда и описывай условия при которых задача ТАК отработала.

И еще хочу уточнить, у нас есть система которая может находится в 3-х состояниях:
1. Все работает как надо, ничего изменять (запускать, закрывать, подключать/отключать, убивать) не надо.
2. 1-ое неправильное состояние системы, надо поднимать VPN и т.д.
3. 2-ое неправильное состояние системы, надо разрывать VPN и т. д.
И есть у нас три "флага": наличие Интернета, наличие локалки, наличие в памяти процесса "MyProgramm.exe"
Теперь, пожалуйста, для каждого состояния системы перечисли соотвествующие значения всех комбинаций "флагов", "флаги" принимают значения "Да" и "Нет".

Если не трудно поясните, в Вашем варианте в части:
...
Почему OR(или) стоит до 0= ?

Потому что мне кажется что именно так можно определить те два состояния при которых задача должно что-то изменять, может я ошибаюсь, давай и с этим разберемся.
1. Смысл "OR" и "0=" - понятен?
2. Смотрим п.2 в твоем ТЗ "Проверить наличие доступа в Internet + проверить ОТСУТСТВИЕ доступа к локальному хосту + проверить отсутствие среди процессов нужной программы."
т.е. есть Интернет, нет доступа к локальному хосту и нет программы, это условие я и реализовал теми двумя строчками что тебе не понятны, т.е. если нет ни программы ни локалки и есть Интернет, то "Поднимаем VPN" (п.3 твоего ТЗ).
все познается в сравнении
makrus
 
Posts: 336
Joined: Mon, 12 Jul 2004, 14:46
Location: Волгоград

Re: Запуск и работа nnCron в Win7

Postby Aushkin » Fri, 16 Sep 2011, 21:11

makrus wrote: ...
Теперь смотри лог работы задачи, копируй его сюда и описывай условия при которых задача ТАК отработала.

Уфф, давайте постепенно.
a. Взял Ваш вариант, в чистом виде ВООБЩЕ не запускается.
b. Согласно рекомендации, убрал кусок:
Time: */1 * * * * *

работать не начало и тут. Кстати, строка вообще не нужна или не нужна в таком виде?
с. Далее, начал думать, в связи с чем задача не стартует, грешил на Ваш вариант "Rule:", взял и вырезал из задачи:
Code: Select all
Rule: USERNAME S" SYSTEM" COMPARE USERNAME S" Local Service" COMPARE OR USERNAME S" Network Service" COMPARE OR 0=
и ... задача начала запускаться, НО
d. Она конечно запустилась, но пошла в цикл без учета условий, что тоже не требуется(вот ёлки, работал же мой кривой вариант, лучшее-враг хорошего) :D
Так вот, появился пользовательский лог, где отразился весь цикл, вот кусок:
Code: Select all
20:01:01 928 USER TASK: myONLINE
20:01:01 928 USER Задача запустилась
20:01:03 928 USER Поднимаем VPN
20:01:03 928 USER Start: C:\Windows\system32\cmd.exe /c rasdial.exe "MyVPN"
20:01:07 928 USER Start result: 0
20:01:16 928 USER Start: C:\Windows\system32\cmd.exe /c ipconfig.exe /flushdns
20:01:16 928 USER Start result: 0
20:01:26 928 USER Start: "C:\nnСron\drxc.cmd"
20:01:43 928 USER Start result: 0
20:01:53 928 USER Start: "C:\Program Files (x86)\MyFolder\MyProgramm.exe"
20:01:53 928 USER Start result: 0
20:01:53 928 USER Задача отработала
20:02:00 4956 USER TASK: myONLINE
20:02:00 4956 USER Задача запустилась
20:02:00 4956 USER Разрываем VPN
20:02:00 4956 USER Start: C:\Windows\system32\cmd.exe /c rasdial.exe "MyVPN" /DISCONNECT
20:02:01 4956 USER Start result: 0
20:02:11 4956 USER Start: C:\Windows\system32\cmd.exe /c ipconfig.exe /flushdns
20:02:11 4956 USER Start result: 0
20:02:11 4956 USER Start: "C:\nnСron\drxd.cmd"
20:02:11 4956 USER Start result: 0
20:02:11 4956 USER Start: C:\Windows\system32\cmd.exe /c taskkill.exe /IM "MyProgramm.exe" /F /T
20:02:11 4956 USER Start result: 0
20:02:21 4956 USER Задача отработала

т.е. просто выполнились последовательно все действия :-)

makrus wrote: И еще хочу уточнить, у нас есть система которая может находится в 3-х состояниях:
1. Все работает как надо, ничего изменять (запускать, закрывать, подключать/отключать, убивать) не надо.
2. 1-ое неправильное состояние системы, надо поднимать VPN и т.д.
3. 2-ое неправильное состояние системы, надо разрывать VPN и т. д.
И есть у нас три "флага": наличие Интернета, наличие локалки, наличие в памяти процесса "MyProgramm.exe"
Теперь, пожалуйста, для каждого состояния системы перечисли соотвествующие значения всех комбинаций "флагов", "флаги" принимают значения "Да" и "Нет".


Давайте попробую обрисовать точнее, какие нужны варианты(не только применительно к данному заданию):
1-е состояние системы:
Компьютер в локальной сети, при этом
проверка должна получить:
доступ в интернет - да
доступ к локальному хосту - да
VPN - нет (т.к. при нахождении в локалке не требуется)
нужной программы не запущено - да
всё, что в этом случае делается, это запускается нужная программа и цепляется сетевой диск.
(в идеале, ещё происходит контроль запущенной нужной программы и если она падает/выключается вручную, то программа перезапускается, пока эта задача запускается отдельным заданием)
Если условия не соблюдаются, значит компьютер во 2-м состоянии системы.

2-е состояние системы(то, что сейчас рассматриваем):
Компьютер притащили домой и подключили к Internet(любой вариант)
В этом случае проверка должна получить:
доступ в интернет - да
доступ к локальному хосту - нет
нужная программа - нет
VPN - нет
при таком раскладе, должен быть запущен VPN, подключен сетевой диск и запущена нужная программа(ну и по-мелочи, в коде отражено).
(в идеале, ещё происходит контроль запущенной нужной программы и если она падает/выключается вручную, то программа перезапускается, пока эта задача запускается отдельным заданием)

Логично наверное было бы воспользоваться GET и RELEASE для последовательного запуска задач, т.е. допустим сначала проверяется 1-е состояние и только если не отрабатывает задача, то запускается проверка на 2-е. Но у меня не запускалось, опять же наверное из-за наличия в коде
Code: Select all
Rule: USERNAME S" SYSTEM" COMPARE USERNAME S" Local Service" COMPARE OR USERNAME S" Network Service" COMPARE OR 0=

(я правильно понял, что Вы построили конструкцию: "наш пользователь не является SYSTEM ИЛИ Local Service ИЛИ Network Service, "0=" - добавлен как результирующий для всех? Мне ещё не понятно, почему "OR" нет между USERNAME S" SYSTEM" COMPARE и USERNAME S" Local Service" COMPARE? Вообще не понятно зачем там в конце 0=, COMPARE и так возвращает значение ... ) так же, как когда скрипты и батники напрямую в коде пытался использовать, а не отдельными файлами.

1. Смысл "OR" и "0=" - понятен?

"OR" - или, "0=" - истина, правильно понимаю?
2. Смотрим п.2 в твоем ТЗ "Проверить наличие доступа в Internet + проверить ОТСУТСТВИЕ доступа к локальному хосту + проверить отсутствие среди процессов нужной программы."
т.е. есть Интернет, нет доступа к локальному хосту и нет программы, это условие я и реализовал теми двумя строчками что тебе не понятны, т.е. если нет ни программы ни локалки и есть Интернет, то "Поднимаем VPN" (п.3 твоего ТЗ).

Если нет программы и локалки, но есть интернет, то поднимаем VPN и запускаем программу, после чего у нас есть и инет и программа и локалка, можно ничего не трогать, всё работает. Вот тут ещё нюансы, если нарушается или не соблюдается какое-то ОДНО условие, например рухнула программа или отвалился VPN? Тоже вторая часть задачи отработает, а через минуту всё перезапустит и поднимет VPN и программу?
В моём первоначальном варианте(кривом и кривоработающем) перезапуск задачи происходил, если выдернуть кабель, а через пару минут вернуть. Но вот почему-то, если выгружал "нужную программу" ничего не происходило. Мозг начинает приближаться к точке кипения :rolleyes:

У меня тут мысль родилась, быть может пойти немного иным путём, что бы сразу все задачи объять.
вот в этой части добавить несколько rule-сов для различных ситуаций, ну что-то типа:
...
NoDel
ONLY_SYSTEM
SingleInstance
AsLoggedUser
LoadProfile
: Inet? ( -- ? )
HOST-EXIST: "google.com"
;
: Local? ( -- ? )
HOST-EXIST: "FS"
;
: rule_home? ( -- ? )
PROC-EXIST: "MyProgramm" Local? OR 0= Inet? AND
;
: rule_local? ( -- ? )
PROC-EXIST: "MyProgramm" Local? Inet? AND ...

вот эти rule_home, rule_local, плюс например rule_MyProgramm_control использовать в коде, убрав вообще ELSE, что бы получилось как-то так примерно

...
rule_home?
IF
действие на случай домашнего подключения
THEN
rule_local?
IF
действие на случай локального подключения
THEN
rule_MyProgramm_control?
IF
действие на случай, если упала только программа
THEN
rule_MyVPN_online?
IF
действие на случай, если только VPN отвалился
THEN

ну, а далее как-то:
rule_no_inet_no_local? \правило проверяющее отсутствие доступа и в локалку и в инет
IF
тут уже действие которое всё ранее запущенное грохает
THEN

по идее можно ведь описать каждую ситуацию и соответствующее действие, что бы не возникло противоречий в одном задании для нашего случая?
Поясните пожалуйста вот этот кусок:
Code: Select all
: rule_home? ( -- ? )
  PROC-EXIST: "MyProgramm.exe" Local? OR 0= Inet? AND
;

Я верно понимаю, логическое построение примерно таково:
Программа ИЛИ доступ в локалку отсутствуют И есть доступ в Internet
Верно?
Т.е. можно например и так:
Code: Select all
: rule_home? ( -- ? )
  PROC-EXIST: "MyProgramm.exe" 0= Local? 0= Inet? AND AND
;

Да?
Aushkin
 
Posts: 17
Joined: Mon, 12 Sep 2011, 21:22

Re: Запуск и работа nnCron в Win7

Postby VoidVolker » Fri, 16 Sep 2011, 23:31

Aushkin wrote: "0=" - истина, правильно понимаю?

Нет. 0= - отрицание(не), а фактически сравнение числа на стеке с нулем, то же самое что и NOT.
95% вопросов уже обсуждались на форуме или ответы на них есть в мануале.        nnCron 1.93 b15.exe
Как правильно задавать вопросы.
User avatar
VoidVolker
Site Admin
 
Posts: 2898
Joined: Tue, 25 Apr 2006, 17:56

Re: Запуск и работа nnCron в Win7

Postby Aushkin » Sat, 17 Sep 2011, 01:16

Искал старый "разбор полётов", нашел историю вопроса:
viewtopic.php?f=5&t=4278 :D (и добрые люди всё те же) :prayer:

А между тем, наваял вот такую конструкцию:

Code: Select all
#( MyTEST
NoDel
ONLY_SYSTEM
SingleInstance
AsLoggedUser
LoadProfile
: Inet?  ( -- ? )
HOST-EXIST: "google.com" \ проверяем доступность хоста в интернете
;
: Local?  ( -- ? )
HOST-EXIST: "MyHOST"  \ проверяем доступность локального хоста
;
: rule_only_internet? ( -- ? )
  PROC-EXIST: "MyProgramm.exe" Local? OR 0= Inet? AND \проверяем отсутствие запущенной программы, недоступность локального хоста и наличие доступа в интернет
;
: rule_local_and_internet_no_VPN? ( -- ? )
  PROC-EXIST: "MyProgramm.exe" ONLINE: "MyVPN" OR 0= Local? Inet? AND AND \проверяем отсутствие запущенной программы и VPN-подключения, при наличии локалки и интернета
;
: rule_no_local_no_internet? ( -- ? )
  Local? Inet? AND \проверяем отсутствие и локалки и инета
;

Нигде с OR и ADD не намутил?

Далее, как и планировал, без всяких ELSE к каждому из этих событий привязал действие.
Всё заработало. Но остались проблемки.
Например по событию
Code: Select all
rule_no_local_no_internet?
IF
    S" Выполнились условия rule_no_local_no_internet" CRON-LOG
    SWHide
    START-APPW: %ComSpec% /c rasdial.exe "MyVPN" /DISCONNECT
    PAUSE: 10000
    START-APP: %ComSpec% /c ipconfig.exe /flushdns
    START-APP: "C:\nnСron\777.cmd"
    START-APP: %ComSpec% /c taskkill.exe /IM "MyProgramm.exe" /F /T
    PAUSE: 10000 TRAY-REFRESH
    WIN-HIDE: "0x660628"
    WIN-TERMINATE: "0x660628"
THEN

Программа благополучно прибивается(правда рефреш трея не происходит и иконка пропадает только после поднесения мышки, но это фигня).
А вот VPN-подключение дисконектит только тогда, когда само подключение ещё не успело обнаружить разрыв и не начало переподключение.
А вот если задание отработало чуть позже и переподключение уже началось, то его прервать уже не получается, скрыть и прибить окно тоже не получается, причем не по хендлу, не по заголовку, не по классу.
В связи с чем вопрос, если использовать WinSpy, зависнуть курсором на заголовке нужного окна, по альт-табу переключиться в WinSpy, далее табом до нужного места, потом Ctrl+C и уже в кронтаб через Ctrl+V, то должно же срабатывать. Но попытки использовать хендл, класс, не приводят к нужному результату. С заголовком тоже не совсем понятно, в какой кодировке он должен приземляться в кронтаб? Блокнот ругается при попытке сохранения, Bred 3 автоматом перекодирует в виндовую, а если OEM кодировку брать, то и всё, что в задании было ранее с использованием кирилицы и правлено блокнотом превратится в крякозябры. Да и не в заголовке дело похоже, ведь по классу тоже не прибивается, причем использовал даже
Code: Select all
    ALL WIN-HIDE: "#32770"
    ALL WIN-TERMINATE: "#32770"

но VPN как передозванивался, так и продолжает. При этом и сетевой диск отцеплен и программа прибита, т.е. отрабатывает всё, кроме скрытия окна и прибития процесса это окно породившего.
Кроме того, само событие
rule_no_local_no_internet?
отрабатывается ежеминутно(судя по логу), что конечно логично, но поскольку необходимые действия по данному событию уже были однократно произведены, нужды в их постоянном повторе нет. Как бы сделать действие по событию однократным и вызывать его повторение только в случае, если условия менялись?
Aushkin
 
Posts: 17
Joined: Mon, 12 Sep 2011, 21:22

Re: Запуск и работа nnCron в Win7

Postby makrus » Sun, 18 Sep 2011, 00:26

Aushkin
b. Согласно рекомендации, убрал кусок:
...
работать не начало и тут. Кстати, строка вообще не нужна или не нужна в таком виде?

в этой строке указано запускать задачу каждую минуту, но nnCron в начале каждой минуты проверяет все задачи на возможность запуска, и если условия в шапке задачи выполняются, то задача запускается. В твоей задаче в шапке проверяется только выполнение условия в Rule: и если оно выполняется (пользователь залогинился на компьютере), то задача запускается... каждую минуту... если предыдущий запуск этой задачи завершился (SingleInstance)


с. Далее, начал думать, в связи с чем задача не стартует, грешил на Ваш вариант "Rule:", взял и вырезал из задачи:
Rule: USERNAME S" SYSTEM" COMPARE USERNAME S" Local Service" COMPARE OR USERNAME S" Network Service" COMPARE OR 0=
и ... задача начала запускаться
Да, верно, там ошибка, замени эту строку на:
Code: Select all
Rule: USERNAME S" SYSTEM" COMPARE USERNAME S" Local Service" COMPARE AND USERNAME S" Network Service" COMPARE AND



d. Она конечно запустилась, но пошла в цикл без учета условий, что тоже не требуется
В задаче нет цикла и она не может "пойти в цикл". Из лога видно что запустилась она два раза, первый раз отработала первая часть задачи, во второй раз отработала вторая часть задачи.
т.е. просто выполнились последовательно все действия
неверно, в первый раз выполнилась первая часть
Code: Select all
20:01:03 928 USER Поднимаем VPN
, во второй запуск выполнилась вторая часть
Code: Select all
20:02:00 4956 USER Разрываем VPN
.
То что задачи завершали свое выполнение видно по:
Code: Select all
20:01:53 928 USER Задача отработала
...
20:01:53 928 USER Задача отработала



Давайте попробую обрисовать точнее, какие нужны варианты(не только применительно к данному заданию):

Не совсем то что я хотел от тебя увидеть...
Смотри, есть два места работы компьютера, на работе и дома.
И там и там есть два состояния:
1. Все работает как надо, ничего менять не надо
2. Не все работает как надо, необходимо перевести компьютер из этого состояния в состояние 1.
Так вот перечисли мне значения "флагов" для каждого из 4-ех состояний (два для дома, два для работы).
Правильно ли я понял что один из "флагов" ты используешь для идентификации местонахождения компа (дома/работа)?
И первоначально было три флага "Инет" "локалка" и "процесс", сейчас у тебя появляется еще и "VPN" - этот 4-тый "флаг" действительно нужен или он дублирует какой-то из 3-х предыдущих?


я правильно понял, что Вы построили конструкцию:...
та конструкция не верная, я запамятовал в результатах слова COMPARE которое возвращает "0" при одинаковых строках и "1" если строки отличаются, вот смотри на примере вот этой конструкции:
Code: Select all
Rule: USERNAME S" SYSTEM" COMPARE USERNAME S" Local Service" COMPARE AND USERNAME S" Network Service" COMPARE AND
- не SYSTEM И не Local Service И не Network Service


Мне ещё не понятно, почему "OR" нет между USERNAME S" SYSTEM" COMPARE и USERNAME S" Local Service" COMPARE?
потому что в языке программирование Форт, сначала "упоминаются" (заносятся на стек) данные, потом оператор которые обрабатывает эти данные, поэтому в нашем случае нужно не менее 2х COMPARE которые оставляют по одному значения для AND или OR


Вообще не понятно зачем там в конце 0=, COMPARE и так возвращает значение
вообще-то 0= и COMPARE можно сказать между собой не связаны, т.к. между ними есть OR которое забирает значения от предыдущего OR и COMPARE а после себя оставляет уже значение для 0=


"OR" - или, "0=" - истина, правильно понимаю?
ответ уже дан, добавлю для лучшего понимания, что 0= инвертирует значение, т.е. если была "истина" то останется "ложь", если была "ложь" то останется "истина"


Поясните пожалуйста вот этот кусок:
...
Я верно понимаю, логическое построение примерно таково:
Программа ИЛИ доступ в локалку отсутствуют И есть доступ в Internet
Верно?
Да.


Т.е. можно например и так:
...
Да?
Да.


А между тем, наваял вот такую конструкцию:
...
...

давай постепенно разбираться почему не работает задача, а не перебирать по 10 альтернативных кусков кода на каждую строчку исходной задачи, на это надо много времени и эта работа скорее всего окажется лишней.
все познается в сравнении
makrus
 
Posts: 336
Joined: Mon, 12 Jul 2004, 14:46
Location: Волгоград

Re: Запуск и работа nnCron в Win7

Postby Aushkin » Sun, 18 Sep 2011, 08:58

makrus wrote:...
Не совсем то что я хотел от тебя увидеть...
Смотри, есть два места работы компьютера, на работе и дома.
И там и там есть два состояния:
1. Все работает как надо, ничего менять не надо
2. Не все работает как надо, необходимо перевести компьютер из этого состояния в состояние 1.
Так вот перечисли мне значения "флагов" для каждого из 4-ех состояний (два для дома, два для работы).
Правильно ли я понял что один из "флагов" ты используешь для идентификации местонахождения компа (дома/работа)?
И первоначально было три флага "Инет" "локалка" и "процесс", сейчас у тебя появляется еще и "VPN" - этот 4-тый "флаг" действительно нужен или он дублирует какой-то из 3-х предыдущих? ...


Хорошо, попытаюсь конкретнее ответить на вопросы.
Так вот,
1. Все работает как надо, ничего менять не надо
- это когда компьютер вообще не подключен не к локалке, не к инету, т.е. работает автономно. Это не то, что бы "всё работает как надо", просто тут ничего изменить невозможно, при отсутствии инета или локалке нет смысла не в запуске VPN, не в подключении сетевого диска, не в запуске программы. Тишина и покой.

Второе нормальное состояние, когда в наличии доступ в инет, когда доступна локалка, когда запущена программа и зацеплен сетевой диск.
Но в случае когда компьютер дома, для достижения этого состояния нужен ещё и VPN, а когда он в офисе, VPN - не требуется.

Code: Select all
2. Не все работает как надо, необходимо перевести компьютер из этого состояния в состояние 1.
- а вот таких состояний минимум два(а если контролировать падение программы, то минимум три, но пока будем последовательны и остановимся на двух).

Состояние A: Компьютер приехал в офис и его подключили к локалке:
Интернет - есть
Локалка - есть
Программа - нет
VPN - нет(НЕ ТРЕБУЕТСЯ!)

Действие: Только запускаем программу и цепляем сетевой диск. ВСЁ.

Состояние B: Компьютер приехал домой и его подключили с помощь любого подключения к Internet:
Интернет - есть
Локалка - НЕТ
Программа - НЕТ
VPN - НЕТ(А вот тут, что бы получить позже доступ к локалке он необходим!)

Действие: Подключаем VPN, цепляем сетевой диск, запускаем программу(ну и по-мелочи)

По-хорошему, ещё нужно контролировать состояние программы вне зависимости от того, где подключен компьютер, дома(выполнились все условия) или в локалке офиса(выполнились все условия), если программа упала или выключена вручную, её необходимо перезапустить. При отсутствии подключений её запускать не нужно(в действиях она и так прибивается в этом случае).

makrus wrote:Так вот перечисли мне значения "флагов" для каждого из 4-ех состояний (два для дома, два для работы).

Выше попытался для каждого из основных состояний.
makrus wrote: Правильно ли я понял что один из "флагов" ты используешь для идентификации местонахождения компа (дома/работа)?

Да, верно, проверяется наличие локального хоста по имени. НО, кроме этого я добавил проверку наличия указанного VPN-подключения, иначе отрабатывались последовательно два условия(по логу так было), т.к. при наличии VPN-подключения этот хост становился доступным.
makrus wrote:И первоначально было три флага "Инет" "локалка" и "процесс", сейчас у тебя появляется еще и "VPN" - этот 4-тый "флаг" действительно нужен или он дублирует какой-то из 3-х предыдущих?
Выше я ответил почему он появился.

makrus wrote: ... давай постепенно разбираться почему не работает задача, а не перебирать по 10 альтернативных кусков кода на каждую строчку исходной задачи, на это надо много времени и эта работа скорее всего окажется лишней.


Я просто тоже пытаюсь построить работающий вариант с учетом Ваших поправок и пытаясь собрать все нужные условия в одно задание. Несколько условий собрал и сейчас они выполняются, кроме скрытия дочернего окна VPN - подключения, не прокатывают варианты и с WIN-HIDE и с WIN-TERMINATE и текущий не прокатывает. То, что получилось на текущий момент выглядит так(есть ещё то, что надо контролировать, додумываю, пока так):

Code: Select all
#( MyTEST
NoDel
ONLY_SYSTEM
SingleInstance
AsLoggedUser
LoadProfile
: Inet?  ( -- ? )
HOST-EXIST: "google.com"
;
: Local?  ( -- ? )
HOST-EXIST: "тут имя локального хоста"
;
: rule_only_internet? ( -- ? )
  PROC-EXIST: "MyProgramm.exe" Local? OR 0= Inet? AND
;
: rule_local_and_internet_no_VPN? ( -- ? )
  PROC-EXIST: "MyProgramm.exe" ONLINE: "MyVPN" OR 0= Local? Inet? AND AND
;
: rule_no_local_no_internet? ( -- ? )
  PROC-EXIST: "MyProgramm.exe" Local? Inet? OR 0= AND
;
Rule: USERNAME S" SYSTEM" COMPARE USERNAME S" Local Service" COMPARE AND USERNAME S" Network Service" COMPARE AND
Action:
  S" Задача запустилась" CRON-LOG
    rule_only_internet?
IF
    S" выполнились условия rule_only_internet" CRON-LOG
    SWHide 
    START-APPW: %ComSpec% /c rasdial.exe "MyVPN"
    PAUSE: 10000
    START-APPW: %ComSpec% /c ipconfig.exe /flushdns
    PAUSE: 10000
    START-APPW: "C:\nnСron\555.cmd"
    PAUSE: 10000
    START-APP: "C:\Program Files (x86)\MyFolder\MyProgramm.exe"
THEN
rule_local_and_internet_no_VPN?
IF
    S" выполнились условия rule_local_and_internet_no_VPN" CRON-LOG
    SWHide
    START-APPW: "C:\nnСron\555.cmd"
    PAUSE: 10000
    START-APP: "C:\Program Files (x86)\MyFolder\MyProgramm.exe"
THEN
rule_no_local_no_internet?
IF
    S" Выполнились условия rule_no_local_no_internet" CRON-LOG
    SWHide
    START-APP: %ComSpec% /c ipconfig.exe /flushdns
    START-APP: "C:\nnСron\777.cmd"
    START-APP: %ComSpec% /c taskkill.exe /IM "MyProgramm.exe" /F /T
    PAUSE: 10000 TRAY-REFRESH
    START-APPW: %ComSpec% /c rasdial.exe "MyVPN" /DISCONNECT
    FOR-WINDOWS: "*MyVPN"
        PAUSE: 300
        WIN-CLOSE: "%FOUND-WINDOW%"
    ;FOR-WINDOWS
THEN
S" Задача отработала" CRON-LOG
)#


Нет твёрдой уверенности в том, что все "OR" и все "AND" в коде на нужных местах и в нужных количествах, но вроде работает. Опять же "люибимые" IF и THEN на местах ли? Если будет не в тягость проверьте.
Разберусь с прибиванием этого окна, буду продумывать добавление контроля программы, а так же попытаюсь ещё раз все батники и VBS-скрипты перенести в тело задачи и разобраться с тем, почему не работали. Но это "наполеоновские планы". Пока вариант уже вырисовывается работоспособный.

Кстати, читал тут с интересом:
http://articles.asksoft.net/index.htm - опус посвященный nnCron и множеству полезностей, с его помощью сотворяемых, в 6-ти частях.
встречались там и сборки, в их числе и последний вариант, так же корректно работающий под всеми версиями Windows, под 7-кой в том числе.
Это тут, если интересно: http://articles.asksoft.net/opt_it_6.htm
в разделе "Часть VII"

У меня ещё вопрос к автору сборки.
Всё про те же права на директорию при работе в многопользовательской среде или в доменной сети например.
Если nnCron установлен только в качестве сервиса, стартует с "Системной учетной записью", то зачем в таком случае полный доступ для группы "Все"?
Разве не достаточно полного доступа ТОЛЬКО для группы "Администраторы"(или вообще только конкретный админ, доменный например) и ТОЛЬКО для "SYSTEM"? В этом случае сам nnCron сможет делать всё, что требуется, в том числе и временные файлы создавать.
Разве не достаточно ВСЕМ остальным доступа ТОЛЬКО "Чтение и выполнение", даже без "модифай"? Ведь менять задачи в кронтабах в корпоративной среде должен ТОЛЬКО Администратор, а остальным всего и так достаточно, даже для запуска "AsLoggedUser", ведь "Чтение и выполнение" у них останется.
Да кстати и на домашней машине, в многопользовательской среде, при наличии "Администратора"(папы), "Power User"-а мамы и убивца систем "User"-а(ненаглядных чад), вышеуказанные права на мой взгляд никому не мешают, а скорее наоборот, как и в случае с "продвинутыми" доменными умниками, так в случае с "продвинутыми" домашними user-ами, "этому дяде с большими ушами -уши-то поодкрутил!". Зачем ВСЕм такие права?
Ну максимум на папку логов можно модифай дать, если логи от имени юзера должны вестись, но и то при условии, что задания включают логирование.
Поправьте, если я что-то упускаю.
Last edited by Aushkin on Sun, 18 Sep 2011, 17:57, edited 1 time in total.
Aushkin
 
Posts: 17
Joined: Mon, 12 Sep 2011, 21:22

Re: Запуск и работа nnCron в Win7

Postby Aushkin » Sun, 18 Sep 2011, 17:53

Пока ожидал ответа,
доделал задачу, воспользовался GET и RELEASE, что бы не дать одновременно стартануть с другой задачей, добавил в задачу условие для контроля упавшей/отключенной программы, вот что в итоге вышло и работает:
Code: Select all
#( MyTEST
NoDel
ONLY_SYSTEM
AsLoggedUser
LoadProfile
: Inet?  ( -- ? )
HOST-EXIST: "google.com"  \проверка на наличие хоста в Internet
;
: Local?  ( -- ? )
HOST-EXIST: "здесь имя нужного локального хоста" \проверка на доступность локального хоста
;
: rule_only_internet? ( -- ? )
  PROC-EXIST: "MyProgramm.exe" Local? OR 0= Inet? AND \программа НЕ запущена, локалка НЕ доступна, И есть Internet
;
: rule_local_and_internet_no_VPN? ( -- ? )
  PROC-EXIST: "MyProgramm.ex" ONLINE: "MyVPN" OR 0= Local? Inet? AND AND \программа И VPN не запущены, локалка И интернет доступны
;
: rule_MyProgramm_control? ( -- ? )
  PROC-EXIST: "MyProgramm.exe" 0= Local? Inet? AND AND \программа не запущена, локалка и интернет доступны
;
: rule_no_local_no_internet? ( -- ? )
  PROC-EXIST: "ComAgent.exe" Local? Inet? OR 0= AND \программа запущена И нету интернета и локалки
;
VARIABLE MyTEST 
Rule: USERNAME S" SYSTEM" COMPARE USERNAME S" Local Service" COMPARE AND USERNAME S" Network Service" COMPARE AND
Action:
    MyTEST GET
  S" Флаг MyTEST захвачен" CRON-LOG
  S" Задача запустилась" CRON-LOG
    rule_only_internet?
IF
    S" выполнились условия rule_only_internet" CRON-LOG
    SWHide 
    START-APPW: %ComSpec% /c rasdial.exe "GRT"
    PAUSE: 10000
    START-APPW: %ComSpec% /c ipconfig.exe /flushdns
    PAUSE: 10000
    START-APPW: "C:\nnСron\555.cmd"
    PAUSE: 10000
    START-APP: "C:\Program Files (x86)\MyFolder\MyProgramm.exe"
THEN
rule_local_and_internet_no_VPN?
IF
    S" выполнились условия rule_local_and_internet_no_VPN" CRON-LOG
    SWHide
    START-APPW: "C:\nnСron\555.cmd"
    PAUSE: 10000
    START-APP: "C:\Program Files (x86)\MyFolder\MyProgramm.exe"
THEN
rule_MyProgramm_control?
IF
    S" Выполнились условия rule_MyProgramm_control" CRON-LOG
    SWHide
    START-APPW: %ComSpec% /c ipconfig.exe /flushdns
    START-APP: "C:\Program Files (x86)\MyFolder\MyProgramm.exe"
THEN
rule_no_local_no_internet?
IF
    S" Выполнились условия rule_no_local_no_internet" CRON-LOG
    SWHide
    START-APP: %ComSpec% /c ipconfig.exe /flushdns
    START-APP: "C:\nnСron\777.cmd"
    START-APP: %ComSpec% /c taskkill.exe /IM "MyProgramm.exe" /F /T
    PAUSE: 10000 TRAY-REFRESH
    START-APPW: %ComSpec% /c rasdial.exe "MyVPN" /DISCONNECT
    FOR-WINDOWS: "*MyVPN"
        PAUSE: 300
        WIN-CLOSE: "%FOUND-WINDOW%"
    ;FOR-WINDOWS
THEN
S" Задача отработала" CRON-LOG
    MyTEST RELEASE
S" Флаг MyTEST отдан" CRON-LOG
)#


Ещё раз прошу всех, кто откликнулся проверить в коде правильность расстановки OR и ADD, а так же и THEN :-)
В целом задача приведена к работоспособному варианту. Осталось разобраться с прибиванием дочернего окна VPN-подключения.
Ну, может быть ещё попытаться перенести скрипты в тело задачи, что бы не стартовать их отдельными файлами.
Почему кстати скрипты могут не запускаться из тела задачи, на что обратить внимание?
Заранее всем спасибо!
Aushkin
 
Posts: 17
Joined: Mon, 12 Sep 2011, 21:22

Re: Запуск и работа nnCron в Win7

Postby AlikasS » Mon, 19 Sep 2011, 14:34

Aushkin wrote:У меня ещё вопрос к автору сборки.
Всё про те же права на директорию при работе в многопользовательской среде или в доменной сети например.
Если nnCron установлен только в качестве сервиса, стартует с "Системной учетной записью", то зачем в таком случае полный доступ для группы "Все"?
Разве не достаточно полного доступа ТОЛЬКО для группы "Администраторы"(или вообще только конкретный админ, доменный например) и ТОЛЬКО для "SYSTEM"? В этом случае сам nnCron сможет делать всё, что требуется, в том числе и временные файлы создавать.
Разве не достаточно ВСЕМ остальным доступа ТОЛЬКО "Чтение и выполнение", даже без "модифай"? Ведь менять задачи в кронтабах в корпоративной среде должен ТОЛЬКО Администратор, а остальным всего и так достаточно, даже для запуска "AsLoggedUser", ведь "Чтение и выполнение" у них останется.
Да кстати и на домашней машине, в многопользовательской среде, при наличии "Администратора"(папы), "Power User"-а мамы и убивца систем "User"-а(ненаглядных чад), вышеуказанные права на мой взгляд никому не мешают, а скорее наоборот, как и в случае с "продвинутыми" доменными умниками, так в случае с "продвинутыми" домашними user-ами, "этому дяде с большими ушами -уши-то поодкрутил!". Зачем ВСЕм такие права?
Ну максимум на папку логов можно модифай дать, если логи от имени юзера должны вестись, но и то при условии, что задания включают логирование.
Поправьте, если я что-то упускаю.

предлагаю самому, в ручную, назначить права на папку программы
и посмотреть. сборку в этом плане планирую переделать чуть позже (разнести сервис и приложение по разным папкам или оставить только сервис).
P.S. предлагаю твою задачу и все сопутствующие батники и т.п., в актуальном состоянии, выделить в отдельную тему
и там уже допиливать...
User avatar
AlikasS
 
Posts: 1437
Joined: Wed, 28 Jun 2006, 05:39
Location: Khabarovsk

Re: Запуск и работа nnCron в Win7

Postby Aushkin » Mon, 19 Sep 2011, 15:42

Да, было бы здорово перенести всё, что я тут намусорил и чем мне помогли в отдельную тему.
Будет правильным, если модераторы это всё перенесут или даже удалят(не хотелось бы).
Ещё раз извините за офтоп.
Спасибо за терпение.
Aushkin
 
Posts: 17
Joined: Mon, 12 Sep 2011, 21:22

Re: Запуск и работа nnCron в Win7

Postby AlikasS » Wed, 12 Oct 2011, 15:55

новая сборка
nncron193b10_for_windows7.zip версия от 12.10.2011 , ссылка в подписи
nncron193b10 for windows7.exe - самораспаковывающийся архив
для установки планировщика nnCron на windows 7 (и не только)
как сервис(1), как приложение для всех(2), как приложение для текущего пользователя(3) или одновременно сервис+приложение

перед запуском архива сохраните свои предыдущие настройки (nncron.ini, tab файлы) на всякий случай :-)

\ -----------------------------------------------------------------------------------------
для установки
запустить nncron193b10 for windows7.exe

А можно просто распаковать,
положить куда надо и запустить любой из батников в новом каталоге от имени Администратора:
reSetnn.bat - установка и запуск крона-сервиса и/или крона-приложения
startnnApp.bat - запуск крона-приложения (без прописки в автозапуск)

\ -----------------------------------------------------------------------------------------

отличия данного мода от оригинала "из коробки" (nncron.exe v 1.93b10 Build 1141 03.12.2009):
- коректная работа в папке с длинным именем и пробелами!!!
- корректный перезапуск с помощью nnguard!!!
- изменен и подключен плагин CronScript.spf, описание есть в нем и на оф.форуме,
используется для интерактивности сервиса крона и не только...
- подключены многие оф.плагины с сайта


отличия данного мода от предыдущего, но приведено в соотвествие с поведением оригинального установщика:
- сервис устанавливается в одну папку, а приложениями для пользователей в другую (%AppData%nnCron)
- можно устанавливать nncron как сервис(1), как приложение для всех(2), как приложение для текущего пользователя(3) или одновременно сервис+приложение
- папка установки для сервиса и основных файлов на выбор пользователя (но менять не рекомендуется)
- папка для установки приложением - %AppData%nnCron и для каждого пользователя она своя
\ -----------------------------------------------------------------------------------------

батники

reSetnn.bat
можно использовать:
1. установка и запуск крона-сервиса и/или крона-приложения (для каждого пользователя свой рабочий каталог)
2.на другой компьютере , для "прописки" перенесенного польностью каталога крона

startnnApp.bat:
просто запуск крона-приложения , его можно использовать для запуска крона приложением
для одного пользователя, например через автозагрузку или разово


\ -----------------------------------------------------------------------------------------

Удачи Всем в экспериментах с nnCron,
AlikasS.



P.S. дальнейшая разработка в теме Инсталлятор для всех версий Windows
User avatar
AlikasS
 
Posts: 1437
Joined: Wed, 28 Jun 2006, 05:39
Location: Khabarovsk

Previous

Return to nnCron forum (Russian)

Who is online

Users browsing this forum: No registered users and 4 guests