Работа с журналом событий (WinNT/2000/XP)



FOR-NEW-EVENTS ... ;FOR-NEW-EVENTS

После срабатывания слова WatchEventLog: вы можете использовать цикл FOR-NEW-EVENTS ... ;FOR-NEW-EVENTS для "прохода" по списку новых событий. Для доступа к "телу" каждого события используется буфер FOUND-EVENT.

Пример:

#( test_watch_event
WatchEventLog: "System"
Action:
FOR-NEW-EVENTS
    ." New System event detected" CR
;FOR-NEW-EVENTS
)#
   
#( test_watch_event1
WatchEventLog: "System"
Action:
FOR-NEW-EVENTS
    ." New System event detected=" FOUND-EVENT evEventID @ . CR
;FOR-NEW-EVENTS
)#

FOUND-EVENT ( -- a)

Адрес буфера, который содержит информацию о произошедшем событии (в бинарном виде). Используется внутри цикла FOR-NEW-EVENTS ... ;FOR-NEW-EVENTS.

Вот список полей, которые содержит FOUND-EVENT:

Name
Size
Description
evLength 1 CELLS Size of this event record, in bytes.
evReserved 1 CELLS Reserved
evRecordNumber 1 CELLS Record number of the record
evTimeGenerated 1 CELLS Time at which this entry was submitted. This time is measured in the number of seconds elapsed since 00:00:00 January 1, 1970, Universal Coordinated Time.
evTimeWritten 1 CELLS Time at which this entry was received by the service to be written to the logfile. This time is measured in the number of seconds elapsed since 00:00:00 January 1, 1970, Universal Coordinated Time.
evEventID 2 bytes Event identifier
evEventType 2 bytes Type of event
evNumStrings 2 bytes Number of strings present in the log (at the position indicated by StringOffset)
evEventCategory 2 bytes Category for this event
evReservedFlags 1 CELLS Reserved
evClosingRecordNumber 1 CELLS Reserved
evStringOffset 1 CELLS Offset of the description strings within this event log record
evUserSidLength 1 CELLS Size of the UserSid member, in bytes
evUserSidOffset 1 CELLS Offset of the security identifier (SID) within this event log record
evDataLength 1 CELLS Size of the event-specific data (at the position indicated by DataOffset), in bytes

evDataOffset

1 CELLS Offset of the event-specific information within this event log record, in bytes

Более подробное описание каждого поля вы можете найти в MSDN (буфер FOUND-EVENT соответствует структуре EVENTLOGRECORD).

Для доступа к четырехбайтовым/словным/32-разрядным полям (1 CELLS) используется слово @. Для доступа к двухбайтовым полям используется слово W@.

Примеры:

#( test-found-event
WatchEventLog: "Security"
Action:
FOR-NEW-EVENTS
    FOUND-EVENT evRecordNumber @ . CR
    FOUND-EVENT evEventType W@ . CR
;FOR-NEW-EVENTS
)#
#( test-found-event1
\ printing all the description strings to console WatchEventLog: "Security" Action: FOR-NEW-EVENTS FOUND-EVENT evStringOffset @ FOUND-EVENT + FOUND-EVENT evNumStrings W@ 0 ?DO ." String " I . ." =" ASCIIZ> 2DUP TYPE CR + 1+ LOOP DROP ;FOR-NEW-EVENTS )#

Дополнительные слова, упрощающие работу с буфером FOUND-EVENT:

Name
Comment
Description
evComputername ( a -- a1) имя компьютера (используйте ASCIIZ>, чтобы получить au-строку)
evNString ( a # -- a1) адрес # строки с описанием события. Нумерация строк начинается с 0. (Используйте ASCIIZ>, чтобы получить au-строку)
evSourceName ( a -- a1) источник информации о событии (используйте ASCIIZ>, чтобы получить au-строку)
evStrings ( a -- a1) собственно, строки с описанием события (используйте ASCIIZ>, чтобы получить au-строку)
evStrings2String ( a -- a1 u1) объединяет все строки с описанием события, заменяет промежуточные нули пробелами и возвращает строку целиком
evUserSid ( a -- a1 u1) SID

Примеры:

#( test-evlog
WatchEventLog: "Security"
Action:
FOR-NEW-EVENTS 
    ." evSourceName =" FOUND-EVENT evSourceName ASCIIZ> TYPE CR
    ." evComputername =" FOUND-EVENT evComputername ASCIIZ> TYPE CR
;FOR-NEW-EVENTS
)#

#( test-evlog1

\ printing entire description string to console WatchEventLog: "Security"
EVENTLOG-AUDIT-FAILURE Action: FOR-NEW-EVENTS ." evStrings2String =" FOUND-EVENT evStrings2String TYPE CR ;FOR-NEW-EVENTS )#

WatchEventLog: "log_name"

Модификаторы (опционально):
EVENTLOG-AUDIT-SUCCESS - отслеживать события Audit Success
EVENTLOG-AUDIT-FAILURE - отслеживать события Audit Failure
EVENTLOG-ERROR-TYPE - отслеживать сообщения об ошибках
EVENTLOG-WARNING-TYPE
- отслеживать предупреждения

Срабатывает при обнаружении новых записей в журналах событий (event logs - WinNT/2000/XP). В качестве параметра "log_name" можно использовать "Application", "System" и "Security".

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

После срабатывания слова WatchEventLog: у пользователя появляется возможность запустить цикл FOR-NEW-EVENTS ... ;FOR-NEW-EVENTS, который проходит по всем новым записям в журнале событий.

Примеры:

#( test-watchevent
WatchEventLog: "Security"
Action:
FOR-NEW-EVENTS
    ." EVENT RECORD= " FOUND-EVENT evEventID @ . CR
;FOR-NEW-EVENTS
)#
   
#( test-watchevent1
\ printing entire FOUND-EVENT buffer to console WatchEventLog: "Application" Action: FOR-NEW-EVENTS ." EVENT RECORD=" CR FOUND-EVENT DUP @ DUMP CR CR ;FOR-NEW-EVENTS )#