Главная

Monday, 20 July 2020

Мониторинг журналов Windows на лету.

Всем привет.

Как уже говорилось, для доступа к событиям Windows из командной строки нужно использовать команду wevtutil. Хотя эта команда универсальна, она не имеет таких функций, как tail, которые можно задействовать для извлечения новых поступающих записей. Но выход есть - использовать простой сценарий bash, который может предоставить такую же функциональность. Пример ниже.

#!/bin/bash -
#
# Описание:
# Выполнение функции наподобие tail для журнала Windows
#
# Использование: ./wintail.sh

WINLOG="Application"
LASTLOG=$(wevtutil qe "$WINLOG" //c:1 //rd:true //f:text)

while true
do
      CURRENTLOG=$(wevtutil qe "$WINLOG" //c:1 //rd:true //f:text)
      if [[ "$CURRENTLOG" != "$LASTLOG" ]]
      then
            echo "$CURRENTLOG"
            echo "----------------------------------"
            LASTLOG="$CURRENTLOG"
      fi
done

Переменная WINLOG определяет журнал Windows, который вы хотите отслеживать. Для получения списка журналов, доступных в системе в настоящее время, можете использовать команду wevtutil el.

Далее для запроса указанного файла журнала выполняется команда wevtutil. Параметр c:1 возвращает только одну запись журнала. Параметр rd:true позволяет команде считать самую последнюю запись журнала. Наконец, f:text возвращает результат в виде обычного текста, а не в формате XML, что позволяет легко читать результат с экрана.


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

Как видите все просто. Если вы помните  то в Powershell подобная история начинается как
Get-Content d:\test.log -Wait -Tail 5

Но было бы неплохо провести полную аналогию с примером выше.

#Poweshell script
#
# Описание:
# Выполнение функции наподобие tail для журнала Windows
#
# Использование: Powershell.exe -File wintail2.ps1
#

$LASTLOG='Start'

While ($True){
      $CURRENTLOG = wevtutil qe Application /c:1 /rd:true
     
      if ($CURRENTLOG.Equals($LASTLOG))
            {
            #echo "---------- true -----------------------"
            }
            else {
            $CURRENTLOG           
            echo "---------- It's new event --------------"
            $LASTLOG = $CURRENTLOG
                 }
}

Увы, но Powershell в нашем случае  сможет правильно сравнить две строки только в формате XML, поэтому ключик "f:text" опущен. В целом поставленная цель достигнута.

Успехов.

No comments:

Post a Comment

А что вы думаете по этому поводу?