Показать полную графическую версию : Отловить простой системы и выход из него
Morpheus
25-05-2010, 03:39
Даже не знаю с какого боку зайти уже. Что требуется:
При простое = 600s (в этот момент гасится монитор) - запуск батника.
При выходе из простоя - запуск другого батника.
Пробовали реализовать это с помощью коллективного разума средствами системы - не вышло.
Т.е. если бы что-то писалось в журнал при, допустим, гашении и включении монитора, то можно было бы завесить на это событие задание в планировщике, но ничего не пишется...
Удалось реализовать только так: в св-вах заставки ставим время и флажок "Начинать с экрана входа в систему", в этом случае происходит блокировка, а на блокировку/разблокировку легко назначается нужное задание в планировщике. Но это не удобно, т.к. надо выбирать учётную запись при разблокировке.
Под простоем понимается отсутствие нажатий на клавиши, при любой загруженности процессора и HDD, Условия простоя
Можно выбрать условие, позволяющее запуск задания только в том случае, если на момент активации триггера компьютер находится в состоянии простоя в течение указанного времени. При настройке этого условия также необходимо задать время ожидания (после активации триггера задания), по истечению которого компьютер будет возвращаться в состояние простоя.
Служба планировщика заданий проверяет, не находится ли компьютер в состоянии простоя, каждые 15 минут. Состоянием простоя считается состояние компьютера, при котором запущена заставка. Если заставка не запускается, считается, что компьютер находится в состоянии простоя при 0% использования процессора и 0% активности диска в течение 90% из последних 15 минут при отсутствии ввода команд с помощью клавиатуры или мыши. Если служба планировщика заданий обнаруживает, что компьютер находится в состоянии простоя, служба начинает ожидать ввода команды пользователем, чтобы отметить конец состояния простоя.
Если задание запускается только в том случае, если компьютер находится в состоянии простоя в течение 30 минут, и задание в течение 10 минут ожидает, пока компьютер перейдет в состоянии простоя, то задание запуститься через 5 минут только в том случае, если на момент активации триггера компьютер находился в состоянии простоя в течение 25 минут. Задание не будет запущено, если компьютер переходит в состояние простоя через 5 минут после активации триггера.
Любые идеи?
ОС: Windows 7, на всякий случай.
Morpheus, как вариант - сделать привязку к событию вкл./выкл. хранителя экрана статья:
Running a Program from the Command Line Based on an Event (http://msdn.microsoft.com/en-us/library/aa393249(VS.85).aspx), MOF-файл:
#pragma namespace ("\\\\.\\Root\\subscription")
// Создание экземпляра потребителя событий командной строки
// для запуска батника "c:\\TEST\scrstart.cmd", и
// присвоение ему псевдонима $SCRSTARTCONSUMER
instance of CommandLineEventConsumer as $SCRSTARTCONSUMER
{
Name = "ScreenSaverStartConsumer";
CommandLineTemplate = "c:\\TEST\\scrstart.cmd %TargetInstance.Name%";
WorkingDirectory = "c:\\TEST";
};
// Создание экземпляра потребителя событий командной строки
// для запуска батника "c:\\TEST\scrstop.cmd",
// присвоение ему псевдонима $SCRSTOPCONSUMER
instance of CommandLineEventConsumer as $SCRSTOPCONSUMER
{
Name = "ScreenSaverStopConsumer";
CommandLineTemplate = "c:\\TEST\\scrstop.cmd %TargetInstance.Name%";
WorkingDirectory = "c:\\TEST";
};
// Создание экземпляра фильтра событий
// для создания нового процесса *.SCR
// и присвоение ему псевдонима $SCRSTARTFILTER
instance of __EventFilter as $SCRSTARTFILTER
{
Name = "ScreenSaverStartFilter";
EventNamespace = "\\\\.\\root\\cimv2";
Query = "SELECT * FROM __InstanceCreationEvent WITHIN 5 "
"WHERE TargetInstance ISA \"Win32_Process\" "
"AND TargetInstance.Name LIKE \"%%.scr\"";
QueryLanguage = "WQL";
};
// Создание экземпляра фильтра событий
// для удаления процесса *.SCR
// и присвоение ему псевдонима $SCRSTOPFILTER
instance of __EventFilter as $SCRSTOPFILTER
{
Name = "ScreenSaverStopFilter";
EventNamespace = "\\\\.\\root\\cimv2";
Query = "SELECT * FROM __InstanceDeletionEvent WITHIN 5 "
"WHERE TargetInstance ISA \"Win32_Process\" "
"AND TargetInstance.Name LIKE \"%%.scr\"";
QueryLanguage = "WQL";
};
// Создание экземпляра связи между фильтром и подписчиком
// события запуска хранителя экрана
instance of __FilterToConsumerBinding
{
Consumer = $SCRSTARTCONSUMER;
Filter = $SCRSTARTFILTER;
};
// Создание экземпляра связи между фильтром и подписчиком
// события остановки хранителя экрана
instance of __FilterToConsumerBinding
{
Consumer = $SCRSTOPCONSUMER;
Filter = $SCRSTOPFILTER;
};
пример команды компиляции: "MOFComp SCR.MOF"
P.S. Windows 7 под рукой нет, проверял на 2003
Morpheus
25-05-2010, 12:33
amel27, это на С++? Боюсь, что не имея даже базовых знаний С++, это для меня сложновато будет.
Проще варианты возможны?
Morpheus, подошел со стороны заставки...
How Can I Log the Start Time and the End Time of the Screensaver?
http://blogs.technet.com/b/heyscriptingguy/archive/2006/02/10/how-can-i-log-the-start-time-and-the-end-time-of-the-screensaver.aspx
Если можно отследить время запуска и остановки заставки, то можно и событие на это повесить... если знать WMI :)
это на С++? »
нет, это MOF - язык описания WMI-объектов, можно то же сделать и через VBS, но будет еще длинней, а тут ничего лишнего - только заменить мои батники/каталоги на свои (C:\TEST\...), вот еще похожая тема: Настройка сообщений (http://forum.oszone.net/showthread.php?t=83728)
How Can I Log the Start Time and the End Time of the Screensaver? »а я отуда SELECT и дёрнул, :) но тому скрипту нужно постоянно крутиться, а тут приготовил батники , запрограммировал WMI - всё остальное сделает система
Morpheus
25-05-2010, 13:35
Vadikan, amel27, спасибо! Пробую разобраться, вопросы будут возникать, наверняка :)
По-хорошему, надо бы ещё учитывать командную строку запуска *.scr, точнее, параметры его запуска (наподобие этого: VBS: Как определить выполняется скринсейвер?? (http://forum.script-coding.info/viewtopic.php?pid=32973#p32973))То бишь, желательно бы добавить в MOF в условие ещё один предикат LIKE на параметр « /s».
Morpheus
25-05-2010, 19:22
Голова уже трещит... Помогайте, плз! :)
Копирую текст в текстовый файл, называю его SCR.MOF.
Заменяю пути.
Компилирую:
C:\Windows\system32>MOFComp D:\SCR.MOF
Microsoft (R) MOF Compiler Version 6.1.7600.16385
Copyright (c) Microsoft Corp. 1997-2006. All rights reserved.
Parsing MOF file: D:\SCR.MOF
MOF file has been successfully parsed
Storing data in the repository...
WARNING: File D:\SCR.MOF does not contain #PRAGMA AUTORECOVER.
If the WMI repository is rebuilt in the future, the contents of this MOF file will not be included in the new WMI repository.
To include this MOF file when the WMI Repository is automatically reconstructed, place the #PRAGMA AUTORECOVER statement on the first line of the MOF file.
Done!
Правильно? Что дальше?
Morpheus,
вопрос: а зачем вам вообще скринсэйвер? Зачем вы свою задачу к нему подвязываете? Без него нельзя никак обойтись?
Morpheus
25-05-2010, 20:32
zonderz, а с какой целью интересуетесь?
вопрос: а зачем вам вообще скринсэйвер? Зачем вы свою задачу к нему подвязываете? Без него нельзя никак обойтись? »
Заставка мне вообще не нужна, задача описана в шапке.
Или имеется в виду, что будет в батниках? Сейчас задачи одни (что-то подгрузить, что-то выгрузить), какие будут завтра, пока не знаю. Но знать, как это делается полезно в любом случае.
Правильно? Что дальше? »
Вроде бы всё. Осталось наполнить Вашим содержанием скрипты «c:\TEST\scrstart.cmd» и «c:\TEST\scrstop.cmd». Не помню, надо ли ещё дополнительно перегружаться/перезапускать службу WMI или же новый MOF сразу будет задействован.
Morpheus,
а с какой целью интересуетесь? »
блин, вы тут вообще-то за помощью обращаетесь. helper'ы имхо имеют право задавать любые наводящие вопросы.
вас устроит такое? :
запускаете прогу (висит в трее), если клавой или мышкой не двигали 10 минут (можно назначить время) система уходит в режим простоя (тухнет монитор), предварительно запустив 1 командный файл (можно назначить путь и имя программы). Далее после нажатия клавиши или движения мышью система "просыпается", запуская 2 командный файл. и т.д . до бесконечности
Morpheus
25-05-2010, 20:56
Iska, содержимое на месте, заставку включал, машину перегружал - реакция ноль.
zonderz, вполне, но надо пробовать.
запускаете прогу (висит в трее), если клавой или мышкой не двигали 10 минут (можно назначить время) система уходит в режим простоя (тухнет монитор), предварительно запустив 1 командный файл (можно назначить путь и имя программы). Далее после нажатия клавиши или движения мышью система "просыпается", запуская 2 командный файл. »
Что требуется:
При простое = 600s (в этот момент гасится монитор) - запуск батника.
При выходе из простоя - запуск другого батника. »
Навскидку:
http://forum.oszone.net/attachment.php?attachmentid=45263&d=1274818480
Morpheus
25-05-2010, 22:41
zonderz, уже ближе к делу :)
Через 20 сек. запускается первая команда, монитор не отключается, при движении мыши запускается вторая команда.
Хотелось бы: чтобы монитор всё-таки отключался (хотя ладно, это я прописал в первом батнике) и чтобы она пряталась в трей. Кнопку "Exit" можно сделать побольше, а то не весь экран занимает :)
Morpheus, ну, не знаю. У меня под XP SP3 RU код из поста #2 (http://forum.oszone.net/post-1420591-2.html) работает, как и заявлено [в том числе и ручном запуске *.scr, и на просмотре :)], проверялось с помощью Process Monitor. Да, и для начала работы подписчика оказалось достаточно только скомпилировать *.mof, не потребовалось ни рестарта службы, ни перезагрузки.
P.S. Как у Вас заработает, всё ж добавьте в оба запроса проверку на «/s»:
Query = "SELECT * FROM __InstanceCreationEvent WITHIN 5 "
"WHERE TargetInstance ISA \"Win32_Process\" "
"AND TargetInstance.Name LIKE \"%%.scr\" "
"AND TargetInstance.CommandLine LIKE \"%%.scr /s\"";
а то будет срабатывать даже на вкладке заставки свойств экрана.
P.P.S.
На мой взгляд, лучший вариант — написание самого хранителя экрана. То бишь, перевод своего кода с VBScript на, к примеру, AutoIt (дабы осталась поддержка OLE Automation + лицензионная чистота, потому про «большой» VB/VB.Net не поминаю) и добавление кода, реализующего минимальную обработку ключей запуска этого хранителя экрана («/c», «/s», «/p») и остановку по приходу события от клавиатуры/мыши. Ну, а в нём уже делай, что хочешь, хоть внутри себя, хоть внешним приложением — никто мешать не будет, ведь он сам и есть хранитель экрана. Примерно на такой основе сделан хранитель экрана Avast :).
Morpheus
25-05-2010, 23:30
Iska, ок, спасибо! Добавлю, если заработает :) Я то в этом совсем ни бум-бум...
М.б. в этом причина неработоспособности?
Starting with Windows Vista, CommandLineEventConsumer cannot be used to start a process that runs interactively.
Windows Server 2003 and Windows XP: CommandLineEventConsumer can start a process that runs interactively.
http://msdn.microsoft.com/en-us/library/aa393249(VS.85).aspx
Кнопку "Exit" можно сделать побольше, а то не весь экран занимает »
:Хотелось бы: чтобы монитор всё-таки отключался »
))
отключается. но в виртуалке не отключится :)) добавил паузу при выходе из сна и собственно сон (не просто отключение моника)
updated: сработало даже в виртуали! моник не отключился :)))))) но виртуалка ушла в шлубокий сон и потом все как по программе... удачи (за сим откланяюсь - у вас исходники)
Morpheus
26-05-2010, 00:35
zonderz, спасибо! В трей её никак?
http://forum.oszone.net/attachment.php?attachmentid=45264&stc=1&d=1274820711
в трее - кол-во минут бездействия
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.