Конференция "Основная" » Отложить завершение задачи при перезагрузки
 
  • Sam9880 (09.12.16 23:05) [0]
    Delphi 10 Berlin. Пк в домене - win 7-10.

    Есть прога. Запускается с параметрами командной строки {цифра}.
    При завершении работы системы в планировщике есть:
    -  задача по событию user32 код 1074 = выполнить prg 1(перезагрузка\выключение)
    - задача по событию winlogon код 7002 (выход пользователя)  = выполнить prg 3
    в GPO есть:
    -  сценарий завершения работы ПК  = выполнить prg 11
    -  сценарий завершения работы пользователя  = выполнить prg 31

    прога коннектится на sql сервер, оставляет запись: имя пк, имя пользователя, время, код операции (там и входы отслеживаются, но с ними проблем нет).

    проблема в том, что код 1 и 3 практически в 90% не отрабатывает. т.е. в логах вижу, что прога начала выполнятся, но времени на отправку не хватает, комп рибутится, хотя соединение примерно секунда.

    увеличил и время ожидания зависших процессов и таймаут процессов при выключении (>3 мин, проге надо 5-6 сек макс, но там видно уже сетевуха откл и записи на сервере нет). срабатывает очень редко.

    вопрос:

    1. как проге продлить свое существование при перезапуске? можно ли отказать или попросить подождать сервис перезагрузки?
    2. все коды выше, кроме 31 - отрабатывают с системной учетной записью. как бы поточнее узнать, кто вышел? 31 работает от имени пользователя, но если на пк нажать на reset или другие глюки - 31 тоже не всегда отработает
    3. еще варианты, чтобы работали 100% надежно - основное - нужно оставить запись на сервере, что был: выход пользователя\перезагрузка в такое то время на таком то пк?

    спасибо
  • Игорь Шевченко © (09.12.16 23:13) [1]

    > как проге продлить свое существование при перезапуске?


    Обработать WM_QUERYENDSESSION для главного окна ?
    Но вообще непонятно, зачем подменять стандартный Event log в котором все события и без того отражены. Не проще при запуске его анализировать и вносить нужные записи в SQL-сервер ?
  • Sam9880 (09.12.16 23:40) [2]
    Игорь, спасибо за ответ.
    >> зачем подменять стандартный Event log
    никто и не подменяет, наоборот как раз туда прога логи складывает.
    вы не путаете ничего?
    еще раз (про события). в планировщике созданы задания (в частности), где триггер = По событию, журнал Система, источник User32, код 1074.
    и как реакция на событие - запуск проги = prg.exe с командной строкой 1

    в EL, журнале Система вижу события перед перезагрузкой от источника User32, с кодом 1074

    Процесс C:\Windows\System32\RuntimeBroker.exe (имя пк) инициировал действие "Перезапустить" для компьютера "имя пк" от имени пользователя имя "пк\пользователь" по причине: Другое (Незапланированное)
    Код причины: 0x0
    Тип выключения: Перезапустить

    вот на него в планировщике реакция и прописана. и видно в журнале планировщика, что выполнение началось, но потом был рибут и прога не успела записать удаленно запись.

    т.е. задача таймаут ей дать.
  • Sam9880 (09.12.16 23:43) [3]
    ++ да, окон у нее нету. это не консольное приложение но форм и окон нет.
  • Игорь Шевченко © (10.12.16 10:21) [4]
    У консоли есть CTRL_SHUTDOWN_EVENT

    https://msdn.microsoft.com/ru-ru/library/windows/desktop/ms683242(v=vs.85).aspx
  • NoUser © (11.12.16 00:38) [5]

    > проблема в том, что код 1 и 3 практически в 90% не отрабатывает.

    Локально в файл также в 90% не отрабатывает?

    > 3. еще варианты,
    а сделать сервис уже предложили?

    ЗЫ.

    > т.е. задача таймаут ей дать.

    если многопоточка, и главный поток прикрылся, то остальные тоже сразу терминатятся системой.
  • Наиль © (12.12.16 12:32) [6]
    Постановка задачи изначально не правильная: "Выполнить собственное завещание".
    Зачем пытаться что-то выполнить по событию, если событие уже есть в журнале и ни куда оттуда уже не денется.
    Берите сведения из этого события при включении компьютера и отправляйте куда захотите.
    Если же хотите иметь актуальную информацию о состоянии сети, то контролировать "выключенность" компьютера лучше снаружи, а не изнутри. Тем более, что причиной отключения может быть всё что угодно.
    Если совсем уж невтерпёж, то можно отключить через групповую политику спрятать стандартную кнопку завершения работы и написать программу или даже батник, который выполнит всю необходимую работу, а потом уже выключит компьютер.
  • Eraser © (18.12.16 18:01) [7]

    >
    > Sam9880   (09.12.16 23:05) 

    https://msdn.microsoft.com/en-us/library/windows/desktop/ms686227(v=vs.85).aspx

    так же глянь там секцию Remarks.
 
Конференция "Основная" » Отложить завершение задачи при перезагрузки
Есть новые Нет новых   [118241   +25][b:0][p:0]