Идентификаторы событий не совпадают с отображаемыми в средстве просмотра событий.

В системном журнале событий есть событие со следующими подробностями:

Source: Kernel-General
Event ID: 1
Details: The system time has changed to ‎2010‎-‎07‎-‎17T02:58:20.285000000Z from ‎2010‎-‎07‎-‎17T02:58:20.285868600Z.

EVENTLOGRECORD также имеет 1 для поля EventID, поэтому он соответствует тому, что мы видим в средстве просмотра журнала событий.

Все идет нормально.

Проблема в том, что когда вы смотрите на файл advapi32.dll, откуда этот источник получает свои сообщения, вы видите это:

ID:01000001
String: The system time has changed to %1 from %2.

Как программа просмотра журнала событий волшебным образом знает, как добавить эти дополнительные биты в идентификатор, чтобы найти правильную строку? Не все строки событий имеют этот верхний бит, а в некоторых установлены другие верхние биты.

Вызов FormatMessage с 1 завершается неудачно. Вызов его с x01000001 успешно. Но это не то, что содержит запись журнала событий...:(

Никакие документы, которые я могу найти, не обсуждают это вообще (кроме описания формата идентификатора, который показывает биты ошибки / серьезности / объекта / кода).

2 ответа

Решение

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

Так, например, событие 7035 диспетчера управления службами имеет тип "Информация", который сопоставляется со значением серьезности 1, что дает идентификатор сообщения 0x40001B7B, который действительно является текстом, который программа просмотра событий отображает из netevent.dll: служба%1 успешно отправил%2 контроля.

Аналогично, событие 7000 имеет тип "Ошибка", сопоставление с уровнем серьезности 3 и идентификатором сообщения 0xC0001B58: не удалось запустить службу%1 из-за следующей ошибки: %n%2

Конечно, это не совсем соответствует вашему примеру; Вы уверены, что получили 0 и 1 в нужном месте?

Предположительно, в Windows XP и более ранних версиях идентификатор события был напрямую сопоставлен с идентификатором сообщения в таблице сообщений. В Vista и более поздних версиях существует два способа сопоставления идентификатора события с идентификатором сообщения.

  1. Квалификаторы событий (это, вероятно, то, что похоже на серьезность маскируемой, как упоминал Брайан)
  2. Ресурс шаблона событий Windows

В этой статье более подробно описываются два способа: https://github.com/libyal/libevtx/blob/master/documentation/Windows%20XML%20Event%20Log%20(EVTX).asciidoc

В частности, для этого события "Системное время изменилось..." Windows 10 использует ресурс шаблона событий Windows. Если вы ищете ключ EventMessageFile в реестре для этого события (основываясь на Event Source = Microsoft-Windows-Kernel-General), вы найдете DLL-файл поставщика.

Компьютер \HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services EventLog-Генеральный Microsoft Windows Kernel-\ \System\

Затем вы можете использовать утилиту событий Windows для просмотра содержимого dll провайдера (добавление флага /gm:true покажет текст сообщения):

wevtutil gp Microsoft-Windows-Kernel-General / ge: true

Выходные данные показывают, что идентификатор события 1 с задачей события 5 имеет идентификатор сообщения = 16777217 (0x01000001).

Другие вопросы по тегам