Журналы событий Windows содержат информацию о происходящих в компьютере событиях. Эта информация полезна для диагностики проблем, особенно на серверах.
Как скриптами WSH JScript/VBScript считать события и значения полей? Можно ли реагировать на события online, т.е. отправить смс администратору, автоматически перезапустить службу или сервер и пр.?

Чтение событий из журнала событий реализуется достаточно просто. Следующий скрипт считывает все события из системного журнала (System):

var computer = "."

var wmi=GetObject("winmgmts:" +
    "{impersonationLevel=impersonate}!\\\\" + computer + "\\root\\cimv2");

var events = wmi.ExecQuery("SELECT * FROM Win32_NTLogEvent WHERE Logfile = 'System'");

var i = new Enumerator(events);
for (; !i.atEnd(); i.moveNext()) {
    var event = i.item();
    WScript.Echo("Category:      " + event.Category);
    WScript.Echo("Computer Name: " + event.ComputerName);
    WScript.Echo("Event Code:    " + event.EventCode);
    WScript.Echo("Message:       " + event.Message);
    WScript.Echo("Record Number: " + event.RecordNumber);
    WScript.Echo("Source Name:   " + event.SourceName);
    WScript.Echo("Time Written:  " + event.TimeWritten);
    WScript.Echo("Event Type:    " + event.Type);
    WScript.Echo();
}

Скрипт выводит все события примерно в таком виде.

Category:      0
Computer Name: PCSW0045
Event Code:    7036
Message:       Служба "Служба поддержки Bluetooth" перешла в состояние Остановлена.
Record Number: 34219
Source Name:   Service Control Manager
Time Written:  20121202191759.760381-000
Event Type:    Сведения

Аналогичный скрипт на VBScript реализуется так:

strComputer = "."
Set objWMIService = GetObject("winmgmts:" _
 & "{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2")
Set colLoggedEvents = objWMIService.ExecQuery _
 ("SELECT * FROM Win32_NTLogEvent WHERE Logfile = 'System'")
For Each objEvent in colLoggedEvents
 Wscript.Echo "Category: " & objEvent.Category
 Wscript.Echo "Computer Name: " & objEvent.ComputerName
 Wscript.Echo "Event Code: " & objEvent.EventCode
 Wscript.Echo "Message: " & objEvent.Message
 Wscript.Echo "Record Number: " & objEvent.RecordNumber
 Wscript.Echo "Source Name: " & objEvent.SourceName
 Wscript.Echo "Time Written: " & objEvent.TimeWritten
 Wscript.Echo "Event Type: " & objEvent.Type
 Wscript.Echo "User: " & objEvent.User
Next

Чтобы прочитать другой журнал, например, журнал приложений (Application Log), необходимо исправить условие в строке запроса с Logfile = ‘System’ на Logfile = ‘Application’.

Возможность добавления условий фильтрации позволяет ограничить число выводимых событий:

    • По источнику события, например, запрос «SELECT * FROM Win32_NTLogEvent WHERE Logfile = ‘System’ AND SourceName = ‘SNMP'» отфильтрует события, относящиеся к SNMP.
    • По типу события, например, запрос «SELECT * FROM Win32_NTLogEvent WHERE Logfile = ‘System’ AND Type = ‘Ошибка'» выберет ошибки (для английской локализации …AND Type = ‘Error’).
    • Нумерация событий (поле RecordNumber) позволяет выполнять периодическую проверку на возникновение новых событий, добавляя к запросу условие AND RecordNumber > 13847

(подставляя номер последнего ранее считанного события).

В цикле обработки событий легко вставить, например, команды вызова внешних программ – отправки смс администратору, команды перезапуска службы или сервера и тем самым реализовать автоматическую реакцию сервера на возникающие проблемы.

Чтение журнала событий Windows
Метки:         

3 мыслей о “Чтение журнала событий Windows

  • 30.11.2017 в 10:02
    Постоянная ссылка

    На быстродействие оказывает влияние некоторые флаги, особенно результативен wbemFlagForwardOnly (cм. https://msdn.microsoft.com/ru-ru/library/aa393866(v=vs.85).aspx)

    objWbemObjectSet = .ExecQuery (_
    ByVal strQuery, _
    [ ByVal strQueryLanguage], _
    [ ByVal iFlags], _
    [ ByVal objWbemNamedValueSet] _
    )

    iFlags [необязательно]
    Integer, который определяет поведение запроса и определяет, немедленно ли этот вызов возвращается. Значением по умолчанию для этого параметра является wbemFlagReturnImmediately . Этот параметр может принимать следующие значения.
    wbemFlagForwardOnly (32 (0x20))
    Перечисление только в прямом направлении, как правило, намного быстрее и используют меньше памяти, чем обычные счетчики, но не разрешают вызовы SWbemObject.Clone_ .
    wbemFlagBipirectional (0 (0x0))
    Заставляет WMI сохранять указатели на объекты перечисления, пока клиент не освободит счетчик.
    wbemFlagReturnImmediately (16 (0x10))
    Заставляет вызов немедленно вернуться.
    wbemFlagReturnWhenComplete (0 (0x0))
    Заставляет этот вызов блокироваться, пока запрос не будет завершен. Этот флаг вызывает метод в синхронном режиме.
    wbemQueryFlagPrototype (2 (0x2))
    Используется для прототипирования (хз, что за тема — надо читать). Этот флаг останавливает выполнение запроса и возвращает объект, который похож на типичный объект результата.
    wbemFlagUseAmendedQualifiers (131072 (0x20000))
    Заставляет WMI возвращать данные о поправках класса с определением базового класса.

    Ответ
  • 03.03.2017 в 16:22
    Постоянная ссылка

    Последний пример, где фильтрация по «RecordNumber > 13847» работает очень медленно. Я использовал «TimeWritten > ‘….'» — принципиально лучше во всяком случае на Windows 7.

    Ответ

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *