AlikasS
Junior Member | Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору 0. UAC отключаем 1. крон настроенный ( на предыдущих версиях винды) в сторону, ставим чистый nncron.exe v 1.93b10 Build 1141 сервисом (в папку по умолчанию), через PROCEXP.EXE смотрим, куда сервис nncron прописался в плане Current directory, у меня это папка C:\Windows\System32\config\systemprofile\AppData\Roaming\nnCron\ (причем если сервис ставить в разные папки, Current directory все равно будет одна.) запоминаем папку ( в C:\Windows\System32\config\systemprofile\AppData\Roaming\ я так понял винда записывает сторонние сервисы) 2. удаляем установленный крон или останавливаем и 3. просто копируем настроенный крон в новую!! папку, определенную на первом этапе. пока не запускаем 4. несколько правок в nncron.ini, Код: \ убираем проверку на паралельный запуск ' NOOP ' DoubleInstance? JMP \ смена пути файла once.txt {{ ONCE-MODULE : once2.txt S" %ModuleDirName%etc\%USERNAME%\once.txt" EVAL-SUBST ; ' once2.txt ' once.txt JMP }} \ смена пути файла taskinfo.txt : taskinfo2.txt S" %ModuleDirName%etc\%USERNAME%\taskinfo.txt" EVAL-SUBST ; ' taskinfo2.txt ' taskinfo.txt JMP \ смена пути файла fileinfo.txt : fileinfo2.txt S" %NNCRON-HOME-DIR%\etc\%USERNAME%\fileinfo.txt" EVAL-SUBST ; ' fileinfo2.txt ' fileinfo.txt JMP \ смена пути файла CronOUT : CronOUT2 S" nncron.%USERNAME%.out" EVAL-SUBST ; ' CronOUT2 ' CronOUT JMP \ ниже все это было в старом кроне, надо заменить то что было Cronlog: "log\%MM%%DD%_cron.%USERNAME%.log" LogTimeFormat: "%hh%:%mm%:%ss% %ThreadId% %USERNAME%" : CRONTAB-ERROR ( a u -- ) WinNT? IF 10 1 DO 100 I 100 * BEEP LOOP ELSE 1 1 BEEP THEN ERR-MSG: "CRONTAB ERROR!!!.%crlf%%USERNAME%%crlf%TASK FILE: %CUR-TAB-FILENAME COUNT%%crlf%TASK: %CUR-TASK-NAME%%crlf%Line: %CURSTR @%" ; \ разные порты у удаленной консоли у сервиса и приложения USERNAME S" SYSTEM" COMPARE 0= USERNAME S" система" COMPARE 0= OR \ если совпало выдаст 0 [IF] RemConsolePort: 2002 \ порт для сервиса [ELSE] RemConsolePort: 2003 \ порт для приложения [THEN] | \ потенциально можно из одного крона управлять другим через консоль 5. пару слов для различия задач ( кронтабы ведь общие) сервиса и приложения можно так же расположить в nncron.ini или в начале первого кронтаба между <% %> Код: : ONLY_SYSTEM USERNAME S" SYSTEM" COMPARE 0= USERNAME S" система" COMPARE 0= OR NOT IF S" NoActive" SFIND DROP EXECUTE THEN ; : ONLY_USER USERNAME S" SYSTEM" COMPARE 0= USERNAME S" система" COMPARE 0= OR IF S" NoActive" SFIND DROP EXECUTE THEN ; | и потом в общем табе в задачах пишем Код: #( задача_для_приложения ONLY_USER Action: MSG: "тест" )# #( задача_для_сервиса ONLY_SYSTEM Action: \ тут задание для сервиса )# | 6. в новой!!! папке крона запускаем батник reSetnn.bat ( от Администратора) содержимое: Код: cd %~dp0 cd %CD% echo setting secure option cacls "%CD%" /g ‚бҐ:F /e /c /t cacls "%CD%" /g All:F /e /c /t cacls "%CD%" /g Users:F /e /c /t PAUSE for /d %%i in ("%CD%") do ( set NNPROGRAMFILESSHORT=%%~si ) @echo off echo kill process nncron taskkill /f /t /im nncron.exe PAUSE echo delete service nncron sc delete nnCron PAUSE echo delete HKCU\Software\Microsoft\Windows\CurrentVersion\Run key nncron REG DELETE HKCU\Software\Microsoft\Windows\CurrentVersion\Run /f /v nnCron PAUSE echo delete HKLM\Software\Microsoft\Windows\CurrentVersion\Run key nnCron REG DELETE HKLM\Software\Microsoft\Windows\CurrentVersion\Run /f /v nnCron PAUSE echo create service sc create nnCron type= own type= interact start= auto binPath= "%NNPROGRAMFILESSHORT%\NNCRON.EXE -dir %NNPROGRAMFILESSHORT%" PAUSE echo start service net start nnCron PAUSE echo CREATE HKLM key rem REG ADD HKCU\Software\Microsoft\Windows\CurrentVersion\Run /v nnCron /f /d "%NNPROGRAMFILESSHORT%\nncron.exe -ns -dir %NNPROGRAMFILESSHORT%" REG ADD HKLM\Software\Microsoft\Windows\CurrentVersion\Run /v nnCron /f /d "%NNPROGRAMFILESSHORT%\nncron.exe -ns -dir %NNPROGRAMFILESSHORT%" PAUSE echo START NNCRON UNDER USER START %NNPROGRAMFILESSHORT%\nncron.exe -ns -dir %NNPROGRAMFILESSHORT% PAUSE | который прибивает текщие процессы крона (с дочерними!!!) если они есть, удаляет сервис nncron, чистит запуск крона через рееестр (автозагрузку не чистит, не копал!! самостоятельно чистим если она есть!!) прописывает новый сервис с параметром -dir и текущей папкой с коротким именем, запускает сервис, прописывает автозапуск крона как приложения для всех пользователей, с параметром -ns -dir и текущей папкой с коротким именем, запускает приложение с этими параметрами. получается, и сервис и приложение "пасутся" в одной папке, кронтабы общие... причем, если сменить пользователя, без выхода предыдущего, запуститься крон как приложение у следующего пользователя. и через меню пользовательского крона можно менять сервисного крона задачи. где-то здесь я включил UAC, после перезагрузки крон от пользователя (в виде приложения) не запустился это все исправится после пункта 8.1 8. вариант получения интерактивности для сервиса в WIN7 (AsLoggedUser LoadProfile). сервису нужен "основательно" загруженный профиль пользователя, (в хелпе есть отсылка на это в задаче про очистку корзины) этого можно достигнуть запуская еще один крон отдельным процессом от имени залогиненого пользователя. 8.1 сначала нам нужно сделать доступ пользователей к папке крона, в последствии в этой папке будут запускаться скрипты от имени пользователя. UAC включен, запускаем explorer (который в пуск-все программы-стандартные-проводник) от имени Администратора, проходим до рабочей папки крона, соглашаясь открыть постоянный доступ для текущего пользователя, в конце, на папку крона, добавляем во вкладке безопасность полный доступ для группы ВСЕ. (потом, для сохранения безопасности, на папке C:\Windows\System32\config\systemprofile можно убрать доступ для текущего пользователя.) в моем случае рабочая папка сервиса крона C:\Windows\System32\config\systemprofile\AppData\Roaming\nnCron\ ну я ранее про нее уже писал. 8.2 интерактивность сервиса крона достигается подключением плагина CronScript.spf в nncron.ini со следующим содержимым Код: \ File: CronScript.spf \ Author: AlikasS \ Date: 22.12.10 \ Words: <CronScript> </SCRIPT> CronScript-EVAL-OFF CronScript-EVAL-ON \ \ Usage: \ <CronScript> <команды крона> </SCRIPT> \ \ Settings: \ CronScript-EVAL-OFF / CronScript-EVAL-OFF - для включения/выключения обработки переменных nncron между знаками %% в тексте команд \ \ Description: \ 1. Позволяет писать код для исполнения его отдельным процессом крона по ключу -runfile прямо в тексте задачи \ Action: \ <CronScript> \ : main 1000 PAUSE MSG: "исполняем код" ; \ </SCRIPT> \ \ 2. CronScript-EVAL-ON - для включения возможности использоваться макро-переменные nnCron, \ окруженные с двух сторон знаками процента (%). \ \ 3. CronScript-EVAL-OFF - (по умолчанию) %% не обрабатываются. 0 [IF] \ this is a comment string Example: #( ~test-start-bat NoActive Action: <CronScript> : main MSG: "скрипт крона" ; </SCRIPT> )# [THEN] \ this is a comment string VECT <CronScript-exec> : cronscript-exec2 ( a u a1 u1 --) S" %GetCurrentThreadId ABS%_%GetTickCount%.FEX" EVAL-SUBST SCR-FNAME 2! SCR-FNAME 2@ R/W CREATE-FILE 0= IF >R R@ WRITE-FILE THROW R> CLOSE-FILE DROP StartIn: "%ModuleDirName%" S" %ModuleDirName%nnCron.exe -runfile" EVAL-SUBST S" " S+ S" %SCR-FNAME 2@%" S+ EVAL-SUBST StartScriptApp SCR-FNAME 2@ DELETE-FILE THROW ELSE 2DROP THEN ; : cronscript-exec3 ( a u a1 u1 --) S" %GetCurrentThreadId ABS%_%GetTickCount%.FEX" EVAL-SUBST SCR-FNAME 2! SCR-FNAME 2@ R/W CREATE-FILE 0= IF >R EVAL-SUBST R@ WRITE-FILE THROW R> CLOSE-FILE DROP StartIn: "%ModuleDirName%" S" %ModuleDirName%nnCron.exe -runfile" EVAL-SUBST S" " S+ S" %SCR-FNAME 2@%" S+ EVAL-SUBST StartScriptApp SCR-FNAME 2@ DELETE-FILE THROW ELSE 2DROP THEN ; : CronScript-EVAL-OFF ['] cronscript-exec2 TO <CronScript-exec> ; CronScript-EVAL-OFF : CronScript-EVAL-ON ['] cronscript-exec3 TO <CronScript-exec> ; : <CronScript> ['] <CronScript-exec> S" </SCRIPT>" <script> ; IMMEDIATE | после подключения плагина, крон надо перезапустить после этого задачи для сервиса крона с интерактивностью в вин7 будут выглядеть например так Код: #( тестдля7-1 ONLY_SYSTEM \ для крона запущенного сервисом AsLoggedUser \ как залогин.юзер LoadProfile \ загрузить профиль Action: <CronScript> : main MSG: "крон сервиса работает" ; </SCRIPT> )# | задача по мощней, пример передачи переменных в скрипт Код: #( тестдля7-2 0 VALUE T1 CREATE Str1 125 ALLOT ONLY_SYSTEM \ для крона запущенного сервисом AsLoggedUser \ как залогин.юзер LoadProfile \ загрузить профиль Action: 111 TO T1 S" внешняя строка" Str1 PLACE CronScript-EVAL-ON \ включаем обработку %% <CronScript> VARIABLE tray_icon_id 0 VALUE T2 CREATE Str2 125 ALLOT S" внутренняя строка" Str2 PLACE 666 TO T2 : main S" nnCron: task started" 32512 0 LoadIconA ADD-TI tray_icon_id ! HINT: "%%T2%% - %T1%" 5000 PAUSE S" nnCron: task continued" 32515 0 LoadIconA tray_icon_id @ MODIFY-TI MSG: "%%Str2 COUNT%% - %Str1 COUNT%" tray_icon_id @ DEL-TI ; </SCRIPT> )# | P.S. 1.кому интересно код между <CronScript> и </SCRIPT> сохраняется во временный файл, который запускается еще одним процессом крона с ключем -runfile, с авторизацией и загрузкой профиля текущего пользователя. поэтому код между <CronScript> ... </SCRIPT> должен содержать слово : main ; , ну т.е. все что касается ключа -runfile а так как код запускается в другой копии крона, он ничего не будет знать о коде написанном в кронтабе крона-сервиса. т.е. не будет видеть переменных, всяких др.слов и т.п. без некоторых дополнительных телодвижений передачу значения переменной и строки внутрь <CronScript> </SCRIPT> я показал в задаче тестдля7-2 CronScript-EVAL-ON \ включаем обработку %%, без нее значение не передашь в случае %%Str2 COUNT%% и %%T2%% - первые внешние кавычки обработает nncron-сервис, вторые обработает nncron- запущенный <CronScript> в случае %Str1 COUNT% и %T1% кавычки обработает nncron-сервис и поместит туда свое значение 2.авторизация и подгрузка профиля при указании конкретного юзера (User: "username" SecPassword: "pass" Domain: "domenname" LogonInteractive), который сейчас уже залогинен, НЕ произойдет в залогиненой сессии а вот AsLoggedUser LoadProfile нормально происходит в активной сессии. кстати не забывайте про запуск tm.exe без ключей (появилось в 10 бете) | Всего записей: 183 | Зарегистр. 30-11-2009 | Отправлено: 09:21 26-01-2011 | Исправлено: AlikasS, 07:31 10-03-2011 |
|