Для определения событий входа в систему и выхода из неё потребовалась считывать соответствующие события из системного 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); }
No comments:
Post a Comment