1 (изменено: DnsIs, 2013-08-30 20:18:06)

Тема: JScript: отлов выключения компьютера

Доброго дня.

Нужно перехватить нажатие кнопки выключения компа.

wsh = WScript.CreateObject("WScript.Shell")
wmi = GetObject("winmgmts:\\\\.\\root\\CIMV2")
evts = wmi.ExecNotificationQuery("Select * from Win32_ComputerShutdownEvent")

while (true) {

    objEvent = evts.NextEvent();

    var enumItems = new Enumerator(objEvent);
    for (; !enumItems.atEnd(); enumItems.moveNext()) {
        if (enumItems.item().Type == 1) {
            wsh.Run("c:\\Windows\\System32\\shutdown.exe /a", 1, true)
        }

    }
}

Не работает.  Что я делаю не так?

Нас невозможно сбить с пути, нам пофигу куда идти.

2

Re: JScript: отлов выключения компьютера

Можно почитать здесь:
https://hpc.name/thread/46575/p1.html

И здесь (особенно хорош последний комментарий):
http://www.sql.ru/forum/993760/kak-obra … rezagruzki

3

Re: JScript: отлов выключения компьютера

max7, суть в том, что сервак с win2003 пашет в уголке без монитора и клавы. Бывает, что остальные компы выключены, но сессии висят и комп отключают кнопкой выключения. Но там появляется злобное окошко, которое не позволяет завершить работу. Вот такие вот дела.

Нас невозможно сбить с пути, нам пофигу куда идти.

4 (изменено: max7, 2013-08-31 11:31:02)

Re: JScript: отлов выключения компьютера

Я таки не понял, что в итоге требуется. Опиши конечную задачу и текущее положение.

Если нужно закрывать сеансы, настрой их закрытие по таймауту при отсутствии подключения, например через пару секунд.
Если нужно запретить выключение при активных сеансах, засунь сервер в шкаф-сейф или отключи коннектор power от материнки.

5

Re: JScript: отлов выключения компьютера

Хочу что бы, при нажатии кнопки выключения сервака, он завершал все активные задачи, отрубал соединения и выключался.

Нас невозможно сбить с пути, нам пофигу куда идти.

6 (изменено: max7, 2013-08-31 13:51:31)

Re: JScript: отлов выключения компьютера

Проверь включена ли опция "Allow shutdown without having to log on" в локальных политиках безопасности:

Завершение работы: разрешить завершение работы системы без выполнения входа в систему.

Этот параметр безопасности определяет, можно ли завершить работу компьютера, не выполняя вход в систему Windows.

Если эта политика включена, команду "Завершение работы" можно выбрать на экране входа в Windows.

Если эта политика отключена, команда "Завершение работы" не отображается на экране входа в Windows. В этом случае, чтобы завершить работу системы, пользователю необходимо успешно выполнить вход в систему и он должен иметь право на завершение работы системы.

По умолчанию на рабочих станциях: включен.
По умолчанию на серверах: отключен.

Server 2003: Domain Security Setting\Local Polices\Security Options
Shutdown: Allow system to be shutdown without having to log on

http://technet.microsoft.com/en-us/libr … 10%29.aspx

+

В настройках электропитания - действие при нажатии кнопки электропитания - завершение работы.
И отключи скринсейвер.

+

В редакторе групповой политики таймаут на закрытие сессий
Конфигурация компьютера\Административные шаблоны\Компоненты Windows\Службы терминалов\Сервер терминалов ...

+

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


P.S.: И я таки не понял, зачем выключать сервер?

7

Re: JScript: отлов выключения компьютера

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 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%"
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="ginzburg@n-d.ru"
Too="it@n-d.ru"
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

WScript.Quit()

On Error Resume Next
Dim mywriteFile,strComputer,objWMIService,myobj,myobjFile
Set myobj = CreateObject("Scripting.FileSystemObject")
If Not myobj.FileExists("c:\SCOMServers.txt") Then
Wscript.echo " Input File C:\System.txt is missing. Script cannot proceed without Input File"
Wscript.quit
End If
Set myobjFile = myobj.OpenTextFile("C:\SCOMServers.txt", 1)
IDCount = 1
Do Until myobjFile.AtEndOfStream
strcomputer = myobjFile.ReadLine
            Set mywriteFile = myobj.CreateTextFile("C:\report" & strcomputer &".csv",2)
            mywritefile.writeline "Computer Name" & "," & "Event Message" & "," & "Record Number" &","&"Source Name" &"," &"Event Type" &"," &"Time Generated" &","&"Time Written" &"," & " User"
            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  
      '            Wscript.Echo "Computer Name: " & objEvent.ComputerName
      '            Wscript.Echo "Message: " & objEvent.Message  
      '            Wscript.Echo "Record Number: " & objEvent.RecordNumber  
      '            Wscript.Echo "Source Name: " & objEvent.SourceName
      '            Wscript.Echo "Event Type: " & objEvent.Type  
      '            WScript.Echo "TimeGenerated: " & WMIDateStringToDate(objEvent.TimeGenerated)
       '            WScript.Echo "TimeWritten: " & WMIDateStringToDate(objEvent.TimeWritten)
      '            Wscript.Echo "User: " & objEvent.User
            mywritefile.writeline objEvent.ComputerName & "," & objEvent.Message & ",," & objEvent.RecordNumber &","& objEvent.SourceName & "," & objEvent.Type &"," & WMIDateStringToDate(objEvent.TimeGenerated) & "," & WMIDateStringToDate(objEvent.TimeWritten) & "," & objEvent.User
            Next
IDCount = IDcount + 1
loop
      

            Function WMIDateStringToDate(dtmDate)
            'WScript.Echo dtm:
            WMIDateStringToDate = CDate(Mid(dtmDate, 5, 2) & "/" & _
            Mid(dtmDate, 7, 2) & "/" & Left(dtmDate, 4) _
            & " " & Mid (dtmDate, 9, 2) & ":" & Mid(dtmDate, 11, 2) & ":" & Mid(dtmDate,13, 2))
            End Function
Я конечно далек от мысли... (с)