none
C++ Получить информацию из Windows Event Log RRS feed

  • Вопрос

  • Здравствуйте!

    Имеется Windows 2008 R2 с ролью печати. К нему подключены принтеры и пользователи печатают через него. В Windows Event Log "Администрирование -> Просмотр событий" заносятся записи, при печати : имя пользователя, принтер, время печати. Как получит это сообщение в C++?

    Пробую:

    #include "windows.h"
    #include "winbase.h"
    #include <iostream>
    #include <ctime>
     
    int main(int argc, char *argv[])
    {
    
        HANDLE h;
        EVENTLOGRECORD *pevlr;
        BYTE bBuffer[16384];
        DWORD dwRead, dwNeeded, cRecords, dwThisRecord;
     
        h = OpenEventLog( 0, L"Application");
        if (h == NULL) std::cout << "Error open EventLog\n";
        pevlr = (EVENTLOGRECORD *) &bBuffer;
        GetOldestEventLogRecord(h, &dwThisRecord);
        time_t myt;
        while (ReadEventLog(h,
                        EVENTLOG_FORWARDS_READ |
                        EVENTLOG_SEQUENTIAL_READ,
                        0,
                        pevlr,
                        16384,
                        &dwRead,
                        &dwNeeded))
            {
                while (dwRead > 0)
                {
                    myt = pevlr->TimeGenerated;
                    std::cout << ctime(&myt);
     
                 // !!! Вот тут не хватает мозгов, чтобы из pevlr достать содержимое события.
     
                    dwRead -= pevlr->Length;
                    pevlr = (EVENTLOGRECORD *) ((LPBYTE) pevlr + pevlr->Length);
                }
                pevlr = (EVENTLOGRECORD *) &bBuffer;
            }
    }

    Скажите пожалуйста, как правильно получить содержимое этого сообщения в string или в массив char?
    16 октября 2013 г. 7:43

Ответы

  • Строки, сопровождающие события, можно получить, например, так:

    LPTSTR pstr = (LPTSTR)((LPBYTE)pevlr + pevlr->StringOffset);
    for (WORD i = 0; i < pevlr->NumStrings; i++)
    {
    	std::wstring message = pstr;
    	std::wcout << message << std::endl;
    	pstr += message.length() + 1;
    }
    
    wstring и wcout здесь используются потому, что у Вас строки, возвращаемые ReadEventLog в кодировке UNICODE. Если нужны ANSI-строки, установите в свойствах проекта значение параметра "Набор символов" в "Не задано".

    16 октября 2013 г. 13:30
  • Вот здесь большой пример получения информации из журнала событий Windows.
    16 октября 2013 г. 13:41

Все ответы