Скрипт события журнала windows

Создаем собственный журнал событий в Windows

Как вы знаете, большинство «нормальных» приложений записывают свои события в журнал событий Windows (Application Event Log). Это отличное место для централизованного хранения и просмотра событий приложений, однако зачастую при возникновении необходимости журналировать события от определенного приложения в данном журнале, мы можем столкнуться с тем, что из-за большого количества и чрезмерной подробности событий, работать со стандартным журналом приложений Windows становится очень неудобно. В данном случае было бы удобно создать собственный журнал событий для данного приложения, и для него настраивать различные параметры, такие как размер журнала, фильтры и т.д., а стандартный журнал Application можно использовать как обычно, не засоряя его ненужной информацией. В ОС семейства Windows присутствует функция, позволяющая создать собственный журнал событий.

Сначала создадим новый файл журнала. Сделать это можно при помощи реестра. Запустите редактор реестра regedit и перейдите в ветку:

Щелкните правой кнопкой по узлу Eventlog и создайте новый ключ (New > Key)

Имя ключа в этом случае будет являться и именем нового журнала. По умолчанию новый журнал (файл .evt) создается тут:

Его можно переименовать, изменив строковый параметр в реестре по своему усмотрению.

Далее нужно добавить источники (Sources) событий для нового журнала. Создайте новый ключ типа Multi-String с именем “Sources”, в качестве параметров укажите имена всех приложений, который будут использовать данный журнал (каждое приложение с новой строки).

Затем нужно перенести ассоциации ваших приложений из стандартного журнала Application в ваш новый журнал. Разверните ветку “Application”, находящуюся по адресу:

И скопируйте все ветки, которые относятся к интересуемым Вами приложениям в новый ветку реестра нового журналa:

Т.к. команда скопировать/вставить в редакторе реестра не работает, их можно пересоздать вручную (если их немного), или же можно осуществить перенос при помощи процедуры экспорта/импорта веток реестра с ручным редактирование .reg файла. Убедитесь, что после переноса вы удалили ключи реестра ваших приложений из ветки Application, иначе Windows не поймет, что нужно писать события в новый журнал. В том случае, если вы используете новый источник событий для журнала, нужно будет создать параметр типа DWORD с именем CustomSource и значением равным 1:

В моем примере, я создал собственное приложение .NET 2.0, причем я хочу, чтобы оно записывало события в созданный нами журнал. Для этого я создам новый ключ реестра EventMessageFile и укажу в нем путь к библиотеке журналирования.NET 2.0:

Затем нужно перезагрузить Windows, а после загрузки системы вы увидите новый журнал событий в разделе Event Viewer-а. В том случае, если ваше приложение по какой-либо причине не пишет событий в новый журнал, можно протестировать его работу вручную, откройте командую строку и перейдите в каталог:

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

Читайте также:  Skachat mac na windows

Update:

Небольшое обновление статьи по письмам читателей:

Вышеприведенная инструкция по созданию собственного журнала ориентирована на серверные ОС семейства Microsoft. Более общий способ, который должен работать в большинстве Windows следующий (отличаются пути в реестре и ключи):

Создаем новый раздел в реестре (имя раздела — имя создаваемого журнала), путь к созданному будет таким:

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Eventlog\NewEventLog , в котором нужно создать следующие ключи:

  • «AutoBackupLogFiles» — тип DWORD, создавать или нет резервные копии журнала (0 — не создавать)
  • «MaxSize» -тип DWORD, максимальны размер журнала в байтах, значение должно быть кратным 64Кб
  • «Retention» — тип DWORD, время хранения записей в случае переполнения журнала.
  • «File» — тип REG_EXPAND_SZ, строка, в которой содержится путь к логу журнала на жестком диске, например %SystemRoot%\System32\config\NewEventLog.evt)
  • «Sources»- тип REG_MULTI_SZ, здесь указан список источников событий, чьи логи должны попадать в этот журнал, каждый источник с новой строки

Скрипт события журнала windows

просмотр журнала событий

Иногда чтобы посмотреть появляется какая либо ошибка или событие, трудно бывает искать его среди кучи событий, можно конечно фильтровать, но проще все очистить. Чистить в ручную долго и муторно, предлагаю скрипт который почистит все журналы windows. Перед выполнением скрипта советую в просмотре событий сохранить логи windows для дальнейшего изучения, много раз было, что старые файлы оказываются, очень нужны, учитесь на чужих ошибках, а лучше их вообще не совершайте.

До очистки видим, что в логах windows много событий

Выполняем скрипт, выполнять нужно от имени администратора.

После, результат на лицо все логи windows удалены в оснастке просмотр событий, и вы только обнаружите событие о том кто и когда произвел удаление.

вот сам текст скрипта

@echo off
FOR /F «tokens=1,2*» %%V IN (‘bcdedit’) DO SET adminTest=%%V
IF (%adminTest%)==(Access) goto noAdmin
for /F «tokens=*» %%G in (‘wevtutil.exe el’) DO (call :do_clear «%%G»)
echo.
echo goto theEnd
:do_clear
echo clearing %1
wevtutil.exe cl %1
goto :eof
:noAdmin
exit

Как видите логи windows очень быстро и легко удаляются скриптом, если нужно массово зачистить вешаем его в планировщике заданий. Так же советую ознакомится с методом Как очистить просмотр событий с помощью PowerShell

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

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

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

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

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

Чтобы прочитать другой журнал, например, журнал приложений (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

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

Проверить, запущена ли программа

Получить список пользователей AD в bat файле

Чтение из реестра в скрипте WSH

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

На быстродействие оказывает влияние некоторые флаги, особенно результативен 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 возвращать данные о поправках класса с определением базового класса.

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

Мониторинг и оповещение о событиях в журналах Windows: триггеры событий

В Windows Server 2008 (Vista) появился новый функционал, позволяющий привязать задание планировщика к любому событию в журналах системы. Благодаря этой возможности администратор может на любое событие Windows назначить выполнение определенного скрипта или отправку оповещения по электронной почты. Разберемся с этой возможностью подробнее.

Возможность запуска задач при наступлении определенных событий Windows основана на тесной интеграции Task Scheduler и Event Viewer. Назначить задание планировщика на любое событие Windows можно прямо из консоли журнала просмотр события (Event Viewer). В качестве реакции на произошедшее событие планировщик может запустить скрипт или отправить почтовое уведомление администратору (или любому другому пользователю).

Допустим, наша задача – настроить оповестить администратора безопасности о блокировке учетной записи пользователя в Active Directory.

Событие блокировки учетной записи в AD отмечается на контроллере домена в журнале Security (Безопасность). Event ID события блокировки – 4740. Открываем консоль журнала событий Windows (Event Viewer — eventvwr.msc) и ищем интересующее нас событие. Щелкаем по нему ПКМ и выбираем пункт Attach Task To This Event (Прикрепить задачу к этому событию).

Читайте также:  Что делать если ноут тормозит сильно windows

Запускается мастер создания нового задания планировщика. Мастер предложит указать имя задания. Оно генерируется автоматически — Security_Microsoft-Windows-Security-Auditing_4740 и нас устраивает.

На следующем шаге указаны вид журнала событий, источник и Event ID события (все поля заполняются автоматически и не доступны для редактирования на этом шаге).

Далее предлагается выбрать тип реакции на событие. Возможны следующие варианты:

  • Start a program – запуск программы (скрипта)
  • Send an e-mail – отправка почтового уведомления
  • Display a message – отображение сообщения в консоли

Нас интересует оповещение по Email. Указываем отправителя, получателя, адрес SMTP сервера, тему и текст письма.

На последнем шаге мастера можно посмотреть получившиеся настройки триггера. В результате в планировщике задач появится новое задание, привязанное к нашему событию. Откроем консоль Task Scheduler (в Administrative Tools). Созданное задание можно найти в разделе Task Scheduler Library -> Event Viewer Tasks.

Здесь же можно изменить настройки триггера события и принудительно его запустить, протестировав реакцию на событие.

Триггер является активным. Теперь при блокировке любой учетной записи AD – на указанный email будет отправляться письмо с уведомлением.

Примечание. Аналогичный функционал в Windows Server 2003 и более ранних версиях Windows реализовывался с помощью консольной утилиты — eventtriggers.exe. Данная утилита также позволяла отслеживать события в журналах системы и «вешать» на определенные события триггеры. Для нашего пример, когда к событию 4740 нужно привязать выполнение скрипта vbs или powershell, который отправляет письмо на ящик администратора, команда может быть такой:

eventtriggers /create /TR “Lock Account” /TK “C:\WINDOWS\system32\windowspowershell\v1.0\powershell.exe c:\script\SendEmail.ps1″ /L Security /EID 4740

Такое уведомление не очень информативно, и для просмотра подробной информации о событии приходится открывать журнал Event Viewer. Попробуем прикрепить к письму данные из журнала событий. В этом нам поможет утилита wevtutil, позволяющая выгрузить из журналов Windows информацию о любом событии. Так, чтобы получить данные о последнем событии с кодом 4740 из журнала Security, нужно выполнить:

wevtutil qe Security /q:»*[System[(EventID=4740)]]» /f:text /rd:true /c:1

Создадим скрипт (query.cmd) из двух строчек: первая удаляет старый файл с логом, вторая – выгружает из журнала последнее событие и сохраняет его в файл лога:

del c:\script\query.txt
wevtutil qe Security /q:»*[System[(EventID=4740)]]» /f:text /rd:true /c:1 > c:\script\query.txt

Осталось еще раз открыть настройки созданного ранее триггера в журнале планировщика задач. На вкладке Actions добавим новое действие – запуск скрипта query.cmd. Затем нужно изменить порядок выполнения действий, перенесем его вверх списка с помощью стрелок справа (скрипт должен выполняться первым).

Далее отредактируем второе действие – отправку электронного письма, выбрав в качестве вложения к письму файл c:\script\query.txt .

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

Привязка заданий планировщика к событиям в журналах систем работает во всех версиях Windows, начиная с Windows Server 2008 / Vista. Этот функционал позволяет быстро оповестить администратора о возникновении определенных проблем с серверов и отреагировать на них.

Оцените статью