Happy birthday, my little blog. ;)
Monday, March 28, 2011
Monday, March 7, 2011
Чтение EventLog
Для определения событий входа в систему и выхода из неё потребовалась считывать соответствующие события из системного EventLog’а. Данные события находятся в журнале Безопасность.
Чтобы программно получить доступ, к данному журналу необходимо указать следующее имя:
Для систем до Windows Vista “Security”
Начиная с Vista “Microsoft-Windows-security-auditing”
Номера событий (EventID) до висты были следующие:
для входа 528, а для выхода из системы 538.
Начиная с висты стали:
4624 для входа и 4634 для выхода.
Для разделения строк в записи использую QString-овский сплит.
Исходный код для чтения события произошедшего последним представлен ниже:
Чтобы программно получить доступ, к данному журналу необходимо указать следующее имя:
Для систем до Windows Vista “Security”
Начиная с Vista “Microsoft-Windows-security-auditing”
Номера событий (EventID) до висты были следующие:
для входа 528, а для выхода из системы 538.
Начиная с висты стали:
4624 для входа и 4634 для выхода.
Для разделения строк в записи использую QString-овский сплит.
Исходный код для чтения события произошедшего последним представлен ниже:
void ReadLastEntryByInstanceId(QString sourceName, int instanceId) { HANDLE eventLogHandle; BYTE entryBuffer[16384]; DWORD dwRead, dwNeeded; DWORD eventsNumber; EVENTLOGRECORD *entry; bool isFound = false; eventLogHandle = OpenEventLog(NULL, sourceName.toAscii().data()); if (eventLogHandle == NULL) return false; entry = (EVENTLOGRECORD*)&entryBuffer; GetNumberOfEventLogRecords(eventLogHandle, &eventsNumber); while (ReadEventLog(eventLogHandle, EVENTLOG_BACKWARDS_READ | EVENTLOG_SEQUENTIAL_READ, eventsNumber, entry, 16384, &dwRead, &dwNeeded) && (isFound == false)) { while (dwRead > 0) { if (entry->EventID == instanceId && isFound == false) { isFound = true; QString strings; QByteArray stringsBytes; stringsBytes.append((char*)entry + entry->StringOffset, entry->DataOffset - entry->StringOffset); strings = QString::fromWCharArray((wchar_t*)stringsBytes.data(), stringsBytes.size() / 2 - 1); // Split strings QStringList stringsList = strings.split(QString(1, '\0')); // Use stringsList } dwRead -= entry->Length; entry = (EVENTLOGRECORD*)((LPBYTE)entry + entry->Length); } entry = (EVENTLOGRECORD*)&entryBuffer; } CloseEventLog(eventLogHandle); }
Thursday, March 3, 2011
QtService
Создавая службу на основе QtService версии 2.6.1, при компоновке происходили ошибки следующего вида:
error LNK2019: unresolved external symbol "public: virtual __thiscall QtServiceBase::~QtServiceBase(void)" (??1QtServiceBase@@UAE@XZ) referenced in function "public: virtual __thiscall QtService
Для того чтобы правильно собрать модуль
Взять файл examples.pro, в папке examples предварительно создав папку с названием проекта, изменить его следующим образом:
Присвоить ему имя необходимого solution:
solution_name.pro
А содержимое этого файла должно иметь следующий вид:
TEMPLATE = subdirs
SUBDIRS = project_name\
Где SUBDIRS обозначает имя проекта, который будет создан в solution.
В папке project_name\ должны быть файлы:
project_name.pro
project_name.qdoc
и как минимум файл main.cpp
В файле project_name.pro
TARGET = ProjectName
TEMPLATE = app
CONFIG += console qt
QT = core network
QT указывает какие Qt библиотеки будут использоваться в проекте:

include(../../src/qtservice.pri)
Затем необходимо открыть файл solution_name.pro в студии:

Открыв файл должно появиться следующее окно:

Subscribe to:
Posts (Atom)