Что нового

[Event Log] Возможно ли анализировать "Журнал событий" в Windows

panda_911

Только вверх, только вперед!
Сообщения
52
Репутация
8
Добрый день!
Подскажите пожалуйста.
Возможно ли написать скрип который будет обрабатывать виндовый "журнал событий" по заданым параметрам?
Искал поиском по форуму но ничего более-менее толкового не нашел :(

Задача проста.
Мониторинг журнала на заданое событие и вывод уведомления.

С языком AutoIt только начал знакомится. Пока написал всего несколько простых программок
для облегчения ежедневной рутины. И вот столкнулся с первой трудностью.
Пока реализовал свою задумку топорным методом:
повершеловский скрипт делает необходимую вытяжку из журнала и экспортит ее в файл.
а уже второй скрипт на AutoIt вытягивает из файла инфу и делает необходимые мне операции

Можно ли как то реализовать это только средствами AutoIt?
 

VladUs

Скриптер
Сообщения
621
Репутация
182
Вот пример, где выводятся сообщения журнала "Система" и отображается время создания сообщения , а так же источник

Код:
$strComputer = "." 
$objWMIService = ObjGet("winmgmts:\\" & $strComputer & "\root\CIMV2") 
$colItems = $objWMIService.ExecQuery( _
    "SELECT * FROM Win32_NTLogEvent WHERE Logfile = 'System'") 
For $objItem in $colItems 
    
    ConsoleWrite ("-----------------------------------" & @CRLF)
    ConsoleWrite ("TimeGenerated: " & $objItem.TimeGenerated & @CRLF)
    ConsoleWrite ("Message: " & $objItem.Message & @CRLF)
    ConsoleWrite ("SourceName: " & $objItem.SourceName & @CRLF)
    
Next

А почему Вы не можете обработать журнал в Powershell. Мне кажется там не очень сложно.
Там даже специальный командлет для этого есть Get-EventLog
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,724
_EventLog__Notify() не подходит?
 
Автор
P

panda_911

Только вверх, только вперед!
Сообщения
52
Репутация
8
Большое спасибо за ответы и подсказки!
Но все еще никак не могу сообразить как соорудить скрипт который бы делал например следующее:
Анализировал события за последние несколько часов (укажем например 3 часа) в журнале "System".
Делал выборку/проверку по параметру "Source" (источник события укажем например службу DHCP) и делал простую запись в файл лога например в формате (*.ini)

[services]

DHCP = (1 - если хотябы одно событие имело место быть, 0 - если событий небыло)

Более сложную конструкцию я попробую дальше уже соорудить сам.
Сейчас же хочу вникнуть в принцип построения такой схемы
(Конечно реализовать такую задачу можно и другими средствами быстро и просто.Но мне сейчас нтересно реализовать это на AutoIt'e)
 

VladUs

Скриптер
Сообщения
621
Репутация
182
panda_911 [?]
Анализировал события за последние несколько часов (укажем например 3 часа) в журнале "System".
Делал выборку/проверку по параметру "Source" (источник события укажем например службу DHCP) и делал простую запись в файл лога

Примерно так:

Код:
Global $sData
$time = '20110807212413.000000+240' ; Дата/Время (Будем узнавать события с 2011/08/02 21.24.13)
$strComputer = "." 
$objWMIService = ObjGet("winmgmts:\\" & $strComputer & "\root\CIMV2") ; Подключаемся к пространству имен WMI
$colItems = $objWMIService.ExecQuery( _
    "SELECT * FROM Win32_NTLogEvent WHERE Logfile = 'System' AND SourceName = 'DHCP' AND TimeGenerated > " &"'"& $time &"'" ) ; Запрос К WMI
; Где Logfile = 'System' - Журнал с которого будем читать события
; SourceName = 'DHCP' - Источник события
; TimeGenerated >  - Время с которого необходимо получение информации (в формате указанном в переменной $time)
For $objItem in $colItems 
    $sData &= "-----------------------------------" & @CRLF _        ; $sData - Переменная для сохранения полученных данных
             & "TimeGenerated: " & $objItem.TimeGenerated & @CRLF _  ; Получаем время создания события
             &"SourceName: " &    $objItem.SourceName & @CRLF _      ; Источник события
             &"Message: " &       $objItem.Message & @CRLF           ; Сообщение о событии 
Next
$hFile = FileOpen("C:\EventLog.Txt",1)     ; Открываем файл для записи
FileWrite($hFile, $sData) ; Записываем данные в файл
FileClose($hFile) ; Закрываем открытый ранее открытый файл
 
Автор
P

panda_911

Только вверх, только вперед!
Сообщения
52
Репутация
8
2VladUs
Огромное спасибо за помощь!
Отдельное спасибо также за комментарии в скрипте, будет легче разобрать все по полочкам. :smile:

Пока только вот не понял каким образом задается время.
В скрипте указано точное время с которого нужно делать отсчет, и соответственно с каждым разом оно будет охватывать все больший промежуток.
Можно ли указать что то по типу:

и отминусовать время заданое например в переменной $Time?
Вижу время указывается в довольно специфическом формате, это обязательно?
 

VladUs

Скриптер
Сообщения
621
Репутация
182
Тогда так :

Код:
#include <Date.au3>
Global $sData
$sTime = _FormatTimeInWMI ("h",-3) ; Здесь задаем  время: -3 часа от текущего времени
$strComputer = "." 
$objWMIService = ObjGet("winmgmts:\\" & $strComputer & "\root\CIMV2") ; Подключаемся к пространству имен WMI

; Запрос К WMI
; Где Logfile = 'System' - Журнал с которого будем читать события
; SourceName = 'DHCP' - Источник события
; TimeGenerated >  - Время с которого необходимо получение информации
$colItems = $objWMIService.ExecQuery( _
"SELECT * FROM Win32_NTLogEvent WHERE Logfile = 'System' AND SourceName = 'DHCP' AND TimeGenerated > " & $sTime ) 

; Перебираем журнал
For $objItem in $colItems 
    $sData &= "-----------------------------------" & @CRLF _ ; $sData - Переменная для сохранения полученных данных
             & "TimeGenerated: " &_FormatTimeFromWMI($objItem.TimeGenerated) & @CRLF _  ; Получаем время создания события
             &"SourceName: " &    $objItem.SourceName & @CRLF _      ; Источник события
             &"Message: " &       $objItem.Message & @CRLF           ; Сообщение о событии
Next

$hFile = FileOpen("C:\EventLog.Txt",1); Открываем файл для записи
FileWrite($hFile, $sData) ; Записываем в файл данные из переменной $sData
FileClose($hFile) ; Закрываем ранее открытый файл

; Функция форматирует  время в формат понятный WMI
Func _FormatTimeInWMI ($sType,$iNumb )
    $sNewDate = _DateAdd( 'h',$iNumb, _NowCalc())
    $sDateTime = StringRegExpReplace ( $sNewDate, "[^0-9]", "" )
    Return "'" & $sDateTime & ".000000+240'"
EndFunc

; Функция форматирует вывод времени из WMI в нормальный вид
Func _FormatTimeFromWMI ($sText)
   $sStroka = StringSplit ( $sText, ".")
   $sDate = StringFormat ("%04d/%02d/%02d",  StringMid ( $sStroka[1],1,4), StringMid ( $sStroka[1],5,2), StringMid ( $sStroka[1],7,2)) 
   $sTimes = StringFormat ("%02d:%02d:%02d",  StringMid ( $sStroka[1],9,2), StringMid ( $sStroka[1],11,2), StringMid ( $sStroka[1],13,2)) 
   Return $sDate & " " & $sTimes
EndFunc
 
Автор
P

panda_911

Только вверх, только вперед!
Сообщения
52
Репутация
8
2VladUs
Огромнейшее спасибо еще раз!
Дальше буду пробовать сам. Главное что есть рабочий пример :smile:

2Yashied
Также спасибо за наводочку!
Буду иметь на вооружении.
 
Верх