Показать полную графическую версию : Отловить простой системы и выход из него
Morpheus
26-05-2010, 00:55
zonderz, спасибо!
в трее - кол-во минут бездействия »
не обновляется :)
Morpheus, проверил дома - на Win7 работает, компилировал в режиме админа, текст батников:
Echo ------------>>%~n0.log
Echo Date/Time : %DATE% %TIME%1>>%~n0.log
Echo ScreenSaver: %~1>>%~n0.log
Echo ------------>>%~n0.log
SET>>%~n0.log
Echo.>>%~n0.log
М.б. в этом причина неработоспособности? »смысл в том, что батники запускаются под системной учеткой без доступа к рабочему столу, т.е. если нужен доступ к окнам или учетка пользователя, то этот способ не подойдет
MOF-файл для отключения мониторинга/удаления объектов, созданных MOF из поста #2 (http://forum.oszone.net/post-1420591-2.html):
#pragma namespace ("\\\\.\\Root\\subscription")
#pragma deleteinstance
("CommandLineEventConsumer.Name='ScreenSaverStartConsumer'", FAIL)
#pragma deleteinstance
("CommandLineEventConsumer.Name='ScreenSaverStopConsumer'", FAIL)
#pragma deleteinstance
("__EventFilter.Name='ScreenSaverStartFilter'", FAIL)
#pragma deleteinstance
("__EventFilter.Name='ScreenSaverStopFilter'", FAIL)
смысл в том, что батники запускаются под системной учеткой без доступа к рабочему столу, т.е. если нужен доступ к окнам или учетка пользователя, то этот способ не подойдет »
Как я понял, в данном случае отслеживание события - это лишь прелюдия к запуску пользовательских задач, т.е. программы какой-то или скрипта.
Morpheus
26-05-2010, 14:59
amel27, спасибо!
текст батников: »
Лог создаётся, а запустить что-то из батника - не запускается... Даже элементарную команду:
cmd /c notepad
Обойти возможно?
Morpheus, notepad запускается под системной учеткой и поэтому не имеет возможности вывести своё окно на рабочий стол пользователя... перехват событий через WMI предназначен скорей для административных задач, т.е. приложений, не требующих взаимодействия с пользователем (скрипты, консольные приложения и т.п.)
Morpheus
26-05-2010, 16:47
amel27, ок, понятно, спасибо! А можно ли сделать вместо запуска батника (или из этого батника), чтобы просто писалось какое-нибудь событие в журнал?
zonderz, можете исходники последнего варианта выложить?
Morpheus
26-05-2010, 18:09
zonderz, спасибо, пробую разобраться.
amel27, ок, понятно, спасибо! А можно ли сделать вместо запуска батника (или из этого батника), чтобы просто писалось какое-нибудь событие в журнал? »
Logging to NT Event Log Based on an Event (Windows) (http://msdn.microsoft.com/en-us/library/aa392282(VS.85).aspx)
Morpheus
27-05-2010, 03:58
Iska, спасибо! Эхх, как же тяжело, когда не совсем представляешь, что делаешь :)
Подскажите, плз, где косяк? (Только не говорите, что это один большой косяк :))
#pragma namespace ("\\\\.\\Root\\subscription")
instance of NTEventLogEventConsumer as $SCRSTARTCONSUMER
{
Name = "SCRStartConsumer";
SourceName = "SCRStartConsumer1";
EventID = 7895;
EventType = 3;
Category = 0;
NumberOfInsertionStrings = 1;
InsertionStringTemplates = {"StartSCR"};
};
instance of NTEventLogEventConsumer as $SCRSTOPCONSUMER
{
Name = "SCRStopConsumer";
SourceName = "SCRStopConsumer1";
EventID = 7896;
EventType = 3;
Category = 0;
NumberOfInsertionStrings = 1;
InsertionStringTemplates = {"StopSCR"};
};
// Создание экземпляра фильтра событий
// для создания нового процесса *.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;
};
можно ли сделать вместо запуска батника (или из этого батника), чтобы просто писалось какое-нибудь событие в журнал »если из батника, то можно VBS-скриптом: Logging an Event (http://technet.microsoft.com/en-us/library/ee156617.aspx)... впрочем, для WSH есть свой WMI потребитель
Подскажите, плз, где косяк? »у меня и в таком виде работает, только нужно подправить SELECT, как подсказал Iska, или так:
Query = "SELECT * FROM __InstanceCreationEvent WITHIN 5 "
"WHERE TargetInstance ISA \"Win32_Process\" "
"AND TargetInstance.CommandLine LIKE \"%%.scr /s\"";
Query = "SELECT * FROM __InstanceDeletionEvent WITHIN 5 "
"WHERE TargetInstance ISA \"Win32_Process\" "
"AND TargetInstance.CommandLine LIKE \"%%.scr /s\"";
Morpheus
27-05-2010, 13:52
amel27, т.е. так должно быть?
#pragma namespace ("\\\\.\\Root\\subscription")
// Создание экземпляра потребителя событий командной строки
// для запуска батника "c:\\TEST\scrstart.cmd", и
// присвоение ему псевдонима $SCRSTARTCONSUMER
instance of CommandLineEventConsumer as $SCRSTARTCONSUMER
{
Name = "ScreenSaverStartConsumer";
CommandLineTemplate = "D:\\MOF\\scrstart.cmd %TargetInstance.Name%";
WorkingDirectory = "D:\\MOF";
};
// Создание экземпляра потребителя событий командной строки
// для запуска батника "c:\\TEST\scrstop.cmd",
// присвоение ему псевдонима $SCRSTOPCONSUMER
instance of CommandLineEventConsumer as $SCRSTOPCONSUMER
{
Name = "ScreenSaverStopConsumer";
CommandLineTemplate = "D:\\MOF\\scrstop.cmd %TargetInstance.Name%";
WorkingDirectory = "D:\\MOF";
};
// Создание экземпляра фильтра событий
// для создания нового процесса *.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.CommandLine LIKE \"%%.scr /s\"";
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.CommandLine LIKE \"%%.scr /s\"";
QueryLanguage = "WQL";
};
// Создание экземпляра связи между фильтром и подписчиком
// события запуска хранителя экрана
instance of __FilterToConsumerBinding
{
Consumer = $SCRSTARTCONSUMER;
Filter = $SCRSTARTFILTER;
};
// Создание экземпляра связи между фильтром и подписчиком
// события остановки хранителя экрана
instance of __FilterToConsumerBinding
{
Consumer = $SCRSTOPCONSUMER;
Filter = $SCRSTOPFILTER;
};
так должно быть? »не то чтобы должно, но желательно :)
Morpheus
27-05-2010, 17:20
amel27, логи создаются, а событие в журнале найти не могу.
UPD: нашел, из-за чего не работал код из #30 (http://forum.oszone.net/post-1421974.html#post1421974) - EventType = 3 не пишется, если = 1 или 4 - пишется.
Теперь другой проблем - событие Start создаётся 2 раза и одновременно пишется Stop. Не подскажете?
Наверное, потому что нет такого значения EventType:
…
EventType
Data type: uint32
Access type: Read/write
Qualifiers: Not_Null
Type of event. This parameter can have one of the values in the following table, which are defined in Winnt.h and Ntelfapi.h.
Value Meaning:
EVENTLOG_SUCCESS Successful event
EVENTLOG_ERROR_TYPE Error event
EVENTLOG_WARNING_TYPE Warning event
EVENTLOG_INFORMATION_TYPE Information event
EVENTLOG_AUDIT_SUCCESS Success audit type
EVENTLOG_AUDIT_FAILURE Failure audit type
…
…
//
// The types of events that can be logged.
//
#define EVENTLOG_SUCCESS 0x0000
#define EVENTLOG_ERROR_TYPE 0x0001
#define EVENTLOG_WARNING_TYPE 0x0002
#define EVENTLOG_INFORMATION_TYPE 0x0004
#define EVENTLOG_AUDIT_SUCCESS 0x0008
#define EVENTLOG_AUDIT_FAILURE 0x0010
…
Morpheus
28-05-2010, 14:02
The types of events that can be logged. »
Вот этой информации мне и не хватало, для полной картины. Спасибо!
Остаётся разобраться с дублированием событий.
Остаётся разобраться с дублированием событий. »
возможно, для одного фильтра зарегистрированы ДВА потребителя с разными именами, необходимо вспомнить и удалить все объекты по примеру из поста #22 (http://forum.oszone.net/post-1421243-22.html) (чтобы сообщения не появлялись вовсе), после чего провести компиляцию MOF-файла
P.S. если при компиляции встречается ошибка (несуществующий объект), то работа MofComp аварийно прекращается (т.е. для корректного удаления должны существовать ВСЕ описанные в MOF-файле объекты) - по этой причине после удаления могут оставаться "хвосты"
P.P.S есть удобные утилиты для визуальной работы с событиями (WMI Administrative Tools (http://www.microsoft.com/downloads/details.aspx?FamilyID=6430f853-1120-48db-8cc5-f2abdc3ed314&displaylang=en)), но официально заявлена только поддержка XP :(
Morpheus
29-05-2010, 00:11
amel27, хм, любопытно. Проверил на хосте вместо виртуалки, 1 старт и 1 стоп. М.б. есть способ вывести всех потребителей, для всех фильтров, в командной строке? В WMI Administrative Tools пустота, ставил в режиме совместимости, от админа, в профиль.
Удалил-создал-удалил-создал-удалил-создал с новыми именами - всё пришло в норму.
Теперь такой вопрос: Registering for Power Events (Windows) (http://msdn.microsoft.com/en-us/library/aa373195%28v=VS.85%29.aspx)
GUID_MONITOR_POWER_ON - 02731015-4510-4526-99e6-e5a17ebd1aea
The monitor on/off notification indicates when the primary system monitor is on or off. This notification is useful for components that actively render content to the display device, such as media visualization. These applications should register for this notification and stop rendering graphics content when the monitor is off to reduce system power consumption. The Data member is a DWORD that indicates the current monitor state.
0x0
The monitor is off.
0x1
The monitor is on.
Можно ли прикрутить с помощью MOF или это уже из области С++?
Хочется отвязаться от заставки, которую я не использую, и привязаться к отключению/включению моника.
Можно ли прикрутить с помощью MOF или это уже из области С++? »поддержка состояния монитора через WMI заявлена, но не поддерживается, готовых (бесплатных) COM-объектов для использования в WSH не попадалось, а лобовое решение требует языков с поддержкой Win32 API: С++, Basic, (возможно) AutoIT и т.п.
В WMI Administrative Tools пустота, ставил в режиме совместимости, от админа, в профиль. »у меня под W7 запустилось почти сразу и в обычном режиме... правда, только в режиме чтения, для полного доступа нужно запустить IE с правами админа и вручную вбить в строку адреса типа: "C:\Program Files\WMI Tools\EventReg.htm", указать контекст: "root\subscription" и в ниспадающем списке выбрать тип объектов (Consumers/Filters), на правой панели будут отражены текущие привязки объектов
Morpheus
29-05-2010, 19:43
поддержка состояния монитора через WMI заявлена, но не поддерживается »
Жаль, спасибо!
у меня под W7 запустилось почти сразу и в обычном режиме... правда, только в режиме чтения, для полного доступа нужно запустить IE с правами админа и вручную вбить в строку адреса типа: "C:\Program Files\WMI Tools\EventReg.htm", указать контекст: "root\subscription" и в ниспадающем списке выбрать тип объектов (Consumers/Filters), на правой панели будут отражены текущие привязки объектов »
Спасибо, работает!
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.