Работа с журналом событий (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 )#
Адрес буфера, который содержит информацию о произошедшем событии (в бинарном виде). Используется внутри цикла 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 )#
Модификаторы (опционально):
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 )#