Имя: Пароль:
IT
Админ
Как назначить задание в "Планировщик заданий" при выключении компьютера ?
0 Ткачев
 
01.12.11
09:02
Нужно перед выключением компьютера сделать запуск батника, в планировщике нашел только "При запуске системы".
1 XLife
 
01.12.11
09:03
(0) кнопка "Я"?
2 Ткачев
 
01.12.11
09:04
(1)Пробовал, не нашел ответа
3 Sinoptic
 
01.12.11
09:05
Команда shutdown, не предлагать?
4 Хоменко Валерий
 
01.12.11
09:06
C:\WINDOWS\system32\shutdown.exe -s
5 andrewks
 
01.12.11
09:06
(0) у тебя заголовок и содержание расходятся в разные стороны. уточни конкретно, что именно надо
6 Ткачев
 
01.12.11
09:07
(3)Нет, мне не надо его выключать, мне надо что бы когда через "Пуск-Выключение компьютера", или по кнопке питания, отработался сначала батник или скрипт.
7 Shurjk
 
01.12.11
09:09
(6) Сделай пакетный файл и через него выключай, а так запрети выключать.
8 Противный
 
01.12.11
09:10
(6) сделай эту задачу на загрузку компа... ;)
9 Ткачев
 
01.12.11
09:11
Там есть в тригеррах "При событии", журналы, источники, код события, вот видимо тут надо копать, вот только я не знаю в какой журнал он пишет что комп надо выключить.
10 Rie
 
01.12.11
09:12
(0) Запускаешь gpedit.msc
Конфигурация компьютера - Конфигурация Windows - сценарии.
11 Ткачев
 
01.12.11
09:12
(7)(8)Не вариант, надо именно при выключении компа, событие "Отключения пользователя" тоже не пойдет, при перезагрузке оно тоже срабатывает.
12 dk
 
01.12.11
09:15
можно написать свою прогу, которая будет висеть в памяти и сканировать список процессов, если определенный процесс завершился - значит комп вырубается
можно своих процессов назапускать несколько штук и как только их кол-во уменьшилось - значит комп вырубается
хотя есть 2 проблемы
1. процессы могут гасить не только при завершении
2. период опроса процессов - можно не успеть отловить событие - усе закроют
либо тупо ловить собственное закрытие процесса, а не опрашивать список текущих
13 Rie
 
01.12.11
09:16
(12) Зачем? В (10) - штатный способ.
14 Ткачев
 
01.12.11
09:17
(13)Ищу как сценарии писать
15 andrewks
 
01.12.11
09:17
(12) жесть...
16 dk
 
01.12.11
09:19
еще можно поковыряться в nncron - говорят мощный планировщик
17 ЧеловекДуши
 
01.12.11
09:26
Зачем тебе это?
Долго играющий код все ровно не успеет отработать :)
18 ЧеловекДуши
 
01.12.11
09:26
Кстати можно вообще запретить выключать ПК :)
19 Rie
 
01.12.11
09:26
(14) Посмотри здесь: http://www.script-coding.com/
20 smaharbA
 
01.12.11
09:27
gpedit если позволяет ос
21 smaharbA
 
01.12.11
09:27
+ либо повешать постоянного получателя событий
22 dk
 
01.12.11
09:28
да, со сценариями интересно, не знал
23 Ткачев
 
01.12.11
10:44
(10)Оно и при перезагрузке работает, как то можно проверить, что у нас идет выключение или перезагрузка ?
(17)Нет, время выключения увеличивается на время архивации.
24 smaharbA
 
01.12.11
11:14
1074
1076
25 Ткачев
 
01.12.11
12:05
(24)Куда это поставить ?
26 Ковычки
 
01.12.11
14:31
(25) его забанили
в gpedit.msc
Конфигурация компьютера - Административные шаблоны - Система (не раскрываем) - Включить свойство данных состояния системы слежения за завершением работы - Включено

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


set wshshell=CreateObject("wscript.shell")
set fso = CreateObject("Scripting.FileSystemObject")

call wshshell.run("%comspec% /c mofcomp -N:root\cimv2 %SystemRoot%\system32\Wbem\Wbemcons.mof&&pause",9,-1)
call wshshell.run("%comspec% /c mofcomp -N:root\subscription %SystemRoot%\system32\Wbem\scrcons.mof&&pause",9,-1)

Computer="."
Set Service = GetObject("winmgmts:\\" & Computer & "\Root\CIMV2")

mondel(Service)

Set oFilter = Service.Get("__EventFilter").SpawnInstance_
oFilter.Name = "Мой монитор выключения и перезагрузки"
oFilter.QueryLanguage = "WQL"
oFilter.Query = "SELECT * FROM __InstanceCreationEvent WITHIN 1 WHERE TargetInstance ISA 'Win32_NTLogEvent'  AND TargetInstance.Logfile = 'System' and TargetInstance.SourceName= 'USER32' and TargetInstance.EventCode = '1074' or TargetInstance.EventCode = '1076'"
oFilter.Put_

FolderMon="C:\монитор выключения и перезагрузки"
FileMon=FolderMon & "\Мой монитор выключения и перезагрузки лог.txt"
if NOT fso.FolderExists(FolderMon) then fso.CreateFolder FolderMon

Set oConsumer = Service.Get("LogFileEventConsumer").SpawnInstance_
oConsumer.Name = "Мой монитор выключения и перезагрузки лог"
oConsumer.FileName = FileMon
oConsumer.Text = "Компьютер: %TargetInstance.ComputerName%, Сообщение: %TargetInstance.Message%, Запись: %TargetInstance.RecordNumber%, Пользователь: %TargetInstance.User%, Источник: %TargetInstance.SourceName%, Время события:  %TargetInstance.TimeGenerated%, Время записи: %TargetInstance.TimeWritten%, Код события: %TargetInstance.EventCode%"
oConsumer.Put_
Set oFilter = Service.Get("__EventFilter.Name='Мой монитор выключения и перезагрузки'")
Set oConsumer = Service.Get("LogFileEventConsumer.Name='Мой монитор выключения и перезагрузки лог'")
Set oBinding = Service.Get("__FilterToConsumerBinding").SpawnInstance_
oBinding.Filter = oFilter.Path_
oBinding.Consumer = oConsumer.Path_
oBinding.Put_

SMTP="mail.n-d.ru"
From="[email protected]"
Too="[email protected]"
Subj="""Мои логи выключения и перезагрузки на "" & now"
Body=Subj
SendInterval=86400 * 1000

Script="Call SendPost(""" & SMTP & """, """ & Too & """, """ & From & """, " & Subj & ", " & Body & "):" & _
"Function SendPost(strSMTPServer, strTo, strFrom, strSubject, strBody):" & _
"    Set iMsg = CreateObject(""CDO.Message""):" & _
"    Set iConf = CreateObject(""CDO.Configuration""):" & _
"    Set Flds = iConf.Fields:" & _
"    Flds.Item(""http://schemas.microsoft.com/cdo/configuration/sendusing"") = 2:" & _
"    Flds.Item(""http://schemas.microsoft.com/cdo/configuration/smtpserver"") = strSMTPServer:" & _
"    Flds.Item(""http://schemas.microsoft.com/cdo/configuration/smtpconnectiontimeout"") = 10:" & _
"    Flds.Update:" & _
"    iMsg.Configuration = iConf:" & _
"    iMsg.To = strTo:" & _
"    iMsg.From = strFrom:" & _
"    iMsg.Subject = strSubject:" & _
"    iMsg.TextBody = strBody:" & _
"    iMsg.AddAttachment """ & FileMon & """:" & _
"    iMsg.Send:" & _
"End Function"

Set Service=GetObject("winmgmts:\\" & computer & "\root\subscription")

mondel(Service)

Set oTimer=Service.Get("__IntervalTimerInstruction").SpawnInstance_
oTimer.IntervalBetweenEvents = SendInterval
oTimer.TimerId = "Мой супертаймер для выключения и перезагрузки"
oTimer.Put_
Set oFilter=Service.Get("__EventFilter").SpawnInstance_
oFilter.Name = "Мой отправитель логов выключения и перезагрузки"
oFilter.QueryLanguage = "WQL"
oFilter.Query = "SELECT * FROM __TimerEvent WHERE TimerID='Мой супертаймер для выключения и перезагрузки'"
oFilter.Put_
Set oScript=Service.Get("ActiveScriptEventConsumer").SpawnInstance_
oScript.Name = "Мой скрипт отправителя логов выключения и перезагрузки"
oScript.ScriptText = Script
oScript.ScriptingEngine = "VBScript"
oScript.Put_
Set oFilter = Service.Get("__EventFilter.Name='Мой отправитель логов выключения и перезагрузки'")
Set oConsumer = Service.Get("ActiveScriptEventConsumer.Name='Мой скрипт отправителя логов выключения и перезагрузки'")
Set oBinding=Service.Get("__FilterToConsumerBinding").SpawnInstance_
oBinding.Filter=oFilter.Path_
oBinding.Consumer=oConsumer.Path_
oBinding.Put_

sub mondel(objService)
   on error resume next
   for each c in objService.ExecQuery("select * from __EventFilter")
       if instr(lcase(c.name),"мой") then
           msgbox c.name
           c.Delete_
       end if
   next
   for each c in objService.ExecQuery("select * from __IntervalTimerInstruction")
       if instr(lcase(c.TimerId),"мой") then
           msgbox c.TimerId
           c.Delete_
       end if
   next
   for each c in objService.ExecQuery("select * from __TimerEvent")
       if instr(lcase(c.name),"мой") then
           msgbox c.name
           c.Delete_
       end if
   next
   for each c in objService.ExecQuery("select * from LogFileEventConsumer")
       if instr(lcase(c.name),"мой") then
           msgbox c.name
           c.Delete_
       end if
   next
   for each c in objService.ExecQuery("select * from ActiveScriptEventConsumer")
       if instr(lcase(c.name),"мой") then
           msgbox c.name
           c.Delete_
       end if
   next
   for each c in objService.ExecQuery("select * from __FilterToConsumerBinding")
       if instr(lcase(c.Consumer),"мой") then
           msgbox c.Consumer
           c.Delete_
       end if
   next
   on error goto 0
end sub
27 Ткачев
 
01.12.11
14:43
У меня WIN7x64, там нет такого "Включить свойство данных состояния системы слежения за завершением работы"
28 Ткачев
 
01.12.11
14:45
(26)Журнал событий "System-User32" Код события: 1074, Тип выключения: Выключение компьютера
Как в скрипте прочитать последнею запись из журнала и при сравнении Кода и Типа запустить архивацию ?
29 Ковычки
 
01.12.11
15:01
(27) в (26) не скрипт, а создание постоянного поставщика/получателя события
30 Ковычки
 
01.12.11
15:04
(29) к (28)

(27) все там есть
31 Ковычки
 
01.12.11
15:08
а по поводу "фильтровать" тебе этого не надо, выполняться активскрипт будет при появлении события в журнале (можно сделать именно по самому событию), ну уж если надо - адо + обратный отсчет
32 Ткачев
 
01.12.11
15:12
(31)Я так уже делал, он не останавливается на нем, скрипт запускает и дальше комп выключает.
33 Ковычки
 
01.12.11
15:27
еще раз, в (26) не скрипт, а скрипт создает постоянного поставщика, в качестве "обработчика" можно использовать как активскриптконсумер, так и командлайнконсумер
а как заставить ждать завершения работы обработчика, или дать отмену выключения/перезагрузки описано в сапорте микрософт
34 Ткачев
 
02.12.11
07:54
(26)Букав сильно много...
Я сделал так:
strComputer = "."
Set objWMIService = GetObject("winmgmts:{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2")

Set colLoggedEvents = objWMIService.ExecQuery _
("Select * from Win32_NTLogEvent Where Logfile = 'System' and SourceName='User32'" _
& "and (EventCode = '1074' or EventCode = '1076')")

For Each objEvent in colLoggedEvents
If InStr(objEvent.Message, "Тип выключения: Выключение питания") > 0 Then

' Тут формируется имя файла из даты и времени, я копипастить не стал

NameFile = "Arc"
Set WshShell = CreateObject("Wscript.Shell")
WshShell.Run("c:\Progra~1\7-Zip\7z.exe a -mx7 -r0 -x!*.cdx D:\Archiv\DB_" & NameFile & ".7z d:\1C\DB", 1, True)
End If
Exit For
Next

Помогите избавиться от For, в запросе если делаю TOP 1 или Select 1, начинает ругаться на For, как сделать выборку из запроса на одну запись ?
35 Ковычки
 
02.12.11
08:07
(34) в (26) скрипт запускается единожды, после его можно хоть удалить, хоть пропить
36 Ткачев
 
02.12.11
08:14
(35)Зачем делать (26), если (34) работает, тем более в (26) не написано что делать с этим событием, т.е. как его проверить и на его основании запустить свою программу.
37 Ткачев
 
02.12.11
08:16
+(36)И вроде как оно и при перезагрузке будет срабатывать...
38 Ткачев
 
02.12.11
08:20
+(37)И судя по WITHIN 1 долбиться в журнал каждую секунду, кому нах это надо ?
Но это имхо, я не понимаю в этом, просто прочитал в учебнике что WITHIN это интервал опроса запроса, возможно я и не прав...
39 Ковычки
 
02.12.11
08:50
если лениво разбираться делай как то так и запускай при старте компа


set wshshell = Wscript.CreateObject("Wscript.Shell")

comp = "."
set service = GetObject("winmgmts:\\" & comp & "\root\cimv2")

set sink = WScript.CreateObject("WbemScripting.SWbemSink","SINK_")
service.ExecNotificationQueryAsync sink, "SELECT * FROM __InstanceCreationEvent WITHIN 1 WHERE TargetInstance ISA 'Win32_NTLogEvent'  AND TargetInstance.Logfile = 'System' and TargetInstance.SourceName= 'USER32' and ( TargetInstance.EventCode = '1074' or TargetInstance.EventCode = '1076')"
do while true: WScript.Sleep 1000: loop

sub SINK_OnObjectReady(obj, context)
   select case obj.TargetInstance.EventCode
       case "1074": msgbox "Перегружаемся !!!"
       case "1076": msgbox "А пля нахрена вырубаешь ?!!!"
       case else: msgbox "Че за хня ?"
   end select
end sub
40 Ковычки
 
02.12.11
08:52
сделай не каждую секунду, сделай по событию Win32_ComputerShutdownEvent
41 Ковычки
 
02.12.11
08:54
возникнет маленькая проблема - не успеет отработать нужное, можно конечно вайтапликейшн в реестре увеличить или первой командой делать отмену выключения, а по окончании уже делать выкл/перезагрузку
42 Ковычки
 
02.12.11
09:02
да по сути тут WITHIN нафиг не нужен, это запрос к событию
43 Ткачев
 
02.12.11
10:25
(34)Это скрипт BackUp.vbs он запускается из (10), мне не надо ничего отслеживать, все уже отследилось, мне надо получить ОДНУ последнею запись в журнале, в 1с это выглядело бы так ВЫБРАТЬ 1 * ИЗ ЖурналСобытий ...
Как сделать запрос "Select Message from Win32_NTLogEvent Where Logfile = 'System' and SourceName='User32'" _
& "and (EventCode = '1074' or EventCode = '1076')" что бы он вернул одну единственную запись, а не все записи журнала? И как ее потом выбрать?
44 Ковычки
 
02.12.11
10:26
я ей про лепешки, она - не поепешли
45 Ковычки
 
02.12.11
10:27
(43) не отработает он у тебя без отмены выключения или увеличения вайтапп
46 Ковычки
 
02.12.11
10:28
а выбрать один через адо
47 Ткачев
 
02.12.11
11:05
Помогите 1с Запрос, преобразовать в скрипт, данные журнала в (34)
Запрос = Новый Запрос ("ВЫБРАТЬ ПЕРВЫЕ 1
  |    Message
  |ИЗ
  |    ЖурналСобытий
  |ГДЕ
  |    Logfile = "System"
  |    И SourceName = "User32"
  |    И (EventCode = 1074 ИЛИ EventCode = 1076)";
Выборка = Запрос.Выполнить();
Если Выборка.Следующий() Тогда
  Если Найти(Выборка.Message, "Выключение компьютера") > 0 Тогда
     //Тут запускаю архивацию
  КонецЕсли;
КонецЕсли;
48 Ковычки
 
02.12.11
11:40
что же Вы такой "бестолковый"

хотя бы так

s=""
for each x in GetObject("winmgmts:").ExecQuery("select * from win32_ntlogevent where Logfile = 'System' and SourceName= 'USER32' and (EventCode = '1074' or EventCode = '1076') and TimeGenerated > '" & year(now) & right(0 & month(now),2) & right(0 & day(now),2) & "000000.000000+000'")
   s=s & x.eventcode & vbcrlf
next
msgbox s
49 Ткачев
 
02.12.11
13:26
(48)Да, я такой :)
Ща попробую
50 Ткачев
 
03.12.11
13:34
(48)Гомнокод, тоже самое что и в (34), фильтр по времени не рулит, лано хер с ним, если нельзя элементарно одну запись получить то буду останавливать цикл после первой записи.
51 Torquader
 
03.12.11
22:56
Если нужно что-то сделать при завершении, то нужно писать сервис, который получает уведомление о завершении системы и напоминает ей, что ещё не пора завершаться.
В противном случае процесс (и даже сценарий) не успевает отработать, если завершение сделали в режиме Force (когда выполняется немедленное завершение).
52 Ткачев
 
04.12.11
12:35
(51)Нее, работает все нормально, время выключения увеличилось на время архивации, просто я хотел выбрать отбором ExecQuery только одну запись а не все по отбору, но не получилось, пришлось принудительно For завершать после чтения первой записи.
53 Torquader
 
04.12.11
15:31
(52) У меня в режиме завершения Force не получалось - процесс прерывался через некоторое время, а сценарии вообще не отрабатывали, так как система считала, что завершаться нужно быстро.
К сожалению, драйвер UPS требовал именно режим Force, поэтому пришлось обойтись без обработки.
54 Ковычки
 
05.12.11
06:53
(50) ты чо такой упоротый, ветку читай внимательно.
55 Ткачев
 
05.12.11
07:30
(54)Может лучше ты почитаешь ? Надо ОДНУ запись а не весь журнал !!!
56 Ковычки
 
05.12.11
07:39
у кого нет головы, тому шляпа не нужна (с)
57 Ковычки
 
05.12.11
07:40
+ в ветке все написано, как и одну запись вытянуть и как не вытягивая ничего получить событие с кодом
58 skunk
 
05.12.11
07:41
это всю тему не смотрел ... а это что мешает посмотреть политики ... там есть опция выполнить перед выключением
59 Ткачев
 
05.12.11
07:41
Невижу, покажи где это написано ?
60 Ткачев
 
05.12.11
07:42
(58)Это сделали уже (10)
61 Ковычки
 
05.12.11
09:40
если лениво разбираться с поставщиками и асинхронностью, поставь триггер на событие
62 Ткачев
 
06.12.11
08:02
(61)Триггер я уже ставил, он и на перезагрузку работает и я не могу остановить выполнение "Завершения работы", т.е. архивация не успевает завершиться, идеальный вариант это (10), на других форумах мне сказали что без for тут не обойтись, лано... оставим все как есть, просто хотелось разобраться можно ли фильтровать и отбирать как тебе хочется.
Завершенный код (соответственно CreateArchive по своему усмотрению), всем спасибо!":

For Each ObjEvent In GetObject("winmgmts:").ExecQuery("Select Message From win32_ntlogevent "_
  & "where Logfile = 'System' and SourceName= 'USER32' and (EventCode = '1074' or EventCode = '1076') "_
   & "and TimeGenerated > '" & year(now) & right(0 & month(now),2) & right(0 & day(now),2) & "000000.000000+000'")
Exit For
Next
If InStr(ObjEvent.Message, "Тип выключения: Выключение питания") > 0 Then  
  mm = Right(0 & Month(Date()) , 2)
  dd = Right(0 & Day(Date())   , 2)
  hh = Right(0 & Hour(Time())  , 2)
  mn = Right(0 & Minute(Time()), 2)
  ss = Right(0 & Second(Time()), 2)
  NameFile = Year(Date()) & mm & dd & hh & mn & ss
  Set WshShell = CreateObject("Wscript.Shell")
  CreateArchive = WshShell.Run("c:\Progra~1\7-Zip\7z.exe a -mx7 -r0 -x!*.cdx D:\Archive\DB_" & NameFile & ".7z d:\1C\DB", 1, True)
End If
63 Ковычки
 
06.12.11
08:23
остановить завершение shutdown /a но добавив времени сервисам и особенно рпс
а получить последний реально