У меня есть этот код C ++ для чтения записей журнала событий
DWORD GetLogRecords(LPCWSTR wsLogFile)
{
HANDLE hEvt = OpenEventLog(NULL, wsLogFile);
if (hEvt==NULL) return 0;
DWORD dwTotalRecords;
BOOL res = GetNumberOfEventLogRecords(hEvt, &dwTotalRecords);
CloseEventLog(hEvt);
return (res != 0) ? dwTotalRecords : 0;
}
Результат
atlTraceGeneral - C:\Windows\system32\winevt\logs\ACEEventLog.evtx - 23499 Total Records
atlTraceGeneral - C:\Windows\system32\winevt\logs\Application.evtx - 23499 Total Records
atlTraceGeneral - C:\Windows\system32\winevt\logs\ConnectionInfo.evtx - 23499 Total Records
atlTraceGeneral - C:\Windows\system32\winevt\logs\Error.evtx - 23499 Total Records
atlTraceGeneral - C:\Windows\system32\winevt\logs\HardwareEvents.evtx - 23499 Total Records
atlTraceGeneral - C:\Windows\system32\winevt\logs\Internet Explorer.evtx - 23499 Total Records
atlTraceGeneral - C:\Windows\system32\winevt\logs\Key Management Service.evtx - 23499 Total Records
...
Я вызвал эту функцию, указав полный путь ко всем файлам журнала .EVTX на моем компьютере (150 файлов журнала). И каждый раз возвращается 23499! Мои файлы журналов имеют разные размеры и около 0, почему я всегда получаю 23499?
ОБНОВЛЕНИЕ 2: После того как я очистил журналы приложений, теперь я получаю 0 для всех файлов журналов .evtx. Я думаю, что он всегда получает журнал приложения вместо указанного файла .evtx.
ОБНОВЛЕНИЕ: Как предложил Реми Лебо, но результат все тот же.
В интересах других, решение этой проблемы заключается в том, что OpenEventLog
не принимает путь Вместо этого вы должны дать ему имя источника журнала событий (что-то вроде "HardwareEvents"
).
Если вы позвоните OpenEventLog
с неверным именем источника (которое включает в себя предоставление пути к файлу), тогда, как задокументировано, он откроет Application
войти вместо:
Если вы указываете собственный журнал, и он не может быть найден, журнал событий
Сервис открывает журнал приложений.
Вы не проверяете результат GetNumberOfEventLogRecords()
за ошибку. И вы протекаете ручку журнала. Попробуйте это вместо этого:
DWORD GetLogRecords(LPCWSTR wsLogFile)
{
HANDLE hEvt = OpenEventLog(NULL, wsLogFile);
if (hEvt==NULL) return 0;
DWORD dwTotalRecords;
BOOL res = GetNumberOfEventLogRecords(hEvt, &dwTotalRecords);
CloseEventLog(hEvt);
return (res != 0) ? dwTotalRecords : 0;
}