-
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% надежно - основное - нужно оставить запись на сервере, что был: выход пользователя\перезагрузка в такое то время на таком то пк?
спасибо
-
> как проге продлить свое существование при перезапуске?
Обработать WM_QUERYENDSESSION для главного окна ? Но вообще непонятно, зачем подменять стандартный Event log в котором все события и без того отражены. Не проще при запуске его анализировать и вносить нужные записи в SQL-сервер ?
-
Игорь, спасибо за ответ. >> зачем подменять стандартный Event log никто и не подменяет, наоборот как раз туда прога логи складывает. вы не путаете ничего? еще раз (про события). в планировщике созданы задания (в частности), где триггер = По событию, журнал Система, источник User32, код 1074. и как реакция на событие - запуск проги = prg.exe с командной строкой 1
в EL, журнале Система вижу события перед перезагрузкой от источника User32, с кодом 1074
Процесс C:\Windows\System32\RuntimeBroker.exe (имя пк) инициировал действие "Перезапустить" для компьютера "имя пк" от имени пользователя имя "пк\пользователь" по причине: Другое (Незапланированное) Код причины: 0x0 Тип выключения: Перезапустить
вот на него в планировщике реакция и прописана. и видно в журнале планировщика, что выполнение началось, но потом был рибут и прога не успела записать удаленно запись.
т.е. задача таймаут ей дать.
-
++ да, окон у нее нету. это не консольное приложение но форм и окон нет.
-
-
> проблема в том, что код 1 и 3 практически в 90% не отрабатывает.
Локально в файл также в 90% не отрабатывает?
> 3. еще варианты, а сделать сервис уже предложили?
ЗЫ.
> т.е. задача таймаут ей дать.
если многопоточка, и главный поток прикрылся, то остальные тоже сразу терминатятся системой.
-
Постановка задачи изначально не правильная: "Выполнить собственное завещание". Зачем пытаться что-то выполнить по событию, если событие уже есть в журнале и ни куда оттуда уже не денется. Берите сведения из этого события при включении компьютера и отправляйте куда захотите. Если же хотите иметь актуальную информацию о состоянии сети, то контролировать "выключенность" компьютера лучше снаружи, а не изнутри. Тем более, что причиной отключения может быть всё что угодно. Если совсем уж невтерпёж, то можно отключить через групповую политику спрятать стандартную кнопку завершения работы и написать программу или даже батник, который выполнит всю необходимую работу, а потом уже выключит компьютер.
-
|