Monday, March 7, 2011

Чтение EventLog

Для определения событий входа в систему и выхода из неё потребовалась считывать соответствующие события из системного EventLog’а. Данные события находятся в журнале Безопасность.
Чтобы программно получить доступ, к данному журналу необходимо указать следующее имя:
Для систем до 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