Einzelnen Beitrag anzeigen

JamesBlond

Registriert seit: 17. Mär 2004
Ort: PB
25 Beiträge
 
Delphi 5 Enterprise
 
#13

Re: Service braucht immer mehr Speicher!!!!??????

  Alt 6. Apr 2004, 14:00
Also, der Fehler muß hier drin sein.
Funktionnen, die hier drin aufgerufen werden sind es definitiv nicht. Wäre klasse, wenn einer was findet:

Delphi-Quellcode:
begin
  typ.Add('Kopfzeile');
  view:= 'Typ;Datum;Uhrzeit;Quelle;Kategorie;EventID;Benutzer;Computer;Nachricht'; // Kopfzeile festlegen
  liste.Add(view); // Kopfzeile speichern
  event:= OpenEventLog(nil, event_log_name); // Eventlog öffnen
  IF event = 0 THEN
    Application.MessageBox('EventLog konnte nicht geöffnet werden!', 'Fehler', 0) // Ausgabe einer Fehlermeldung
  ELSE
  BEGIN
    GetNumberOfEventLogRecords(event, gesamt_anzahl); // Anzahl der Logs ermitteln
    if gesamt_anzahl > 0
    then
    BEGIN
      if anzahl > 0 // nicht alle Datensätze auswerten
      then
        alt_zahl:= gesamt_anzahl - (anzahl - 1) // Anzahl der zu lesenden Logs auswerten
      else
        GetOldestEventLogRecord(event, alt_zahl); // Ältesten Log ermitteln (wenn alle Einträge ermittelt werden sollen
      for counter:= gesamt_anzahl DOWNTO alt_zahl DO // Anzahl vorhandener EventLogs
      BEGIN
        realbuffsize:= 4096;
        getmem(pbuf, realbuffsize);
        ReadEventLog(event, 6, counter, pbuf, realbuffsize, read, read_next); // Nächstes Event_log wird ausgelesen;
        CASE pbuf^.EventType OF // EventTyp lesbar speichern
          EVENTLOG_ERROR_TYPE:BEGIN
            viewable.EventType:= 'Error';
            typ.Add('1');
          END;
          EVENTLOG_WARNING_TYPE:BEGIN
            viewable.EventType:= 'Warning';
            typ.Add('2');
          END;
          EVENTLOG_INFORMATION_TYPE:BEGIN
            viewable.EventType:= 'Information';
            typ.Add('3');
          END;
          EVENTLOG_AUDIT_SUCCESS:BEGIN
            viewable.EventType:= 'Success Audit';
            typ.Add('4');
          END;
          EVENTLOG_AUDIT_FAILURE:BEGIN
            viewable.EventType:= 'Failure Audit';
            typ.Add('5');
          END;
        END;
        source := next_pointer_step(pbuf, sizeof(pbuf^)); // Pointer auf den SourceNamen setzen
        SetString(viewable.SourceName, source, lstrlen(source)); // SourceNamen abspeichern
        inc(source, lstrlen(source) + 1); // Pointer auf den Computernamen setzen
        SetString(viewable.ComputerName, source, lstrlen(source)); // Computernamen speichern
        // Zeit ermitteln
        viewable.LocalTimeGenerated:= UnixTimetoFiletime(pbuf^.TimeGenerated);// Zeit, Datum auslesen und anschließend konvertieren
        FileTimeToLocalFileTime(viewable.localtimeGenerated, viewable.LocalTimeGenerated);
        FileTimeToSystemTime(viewable.localtimeGenerated, zeit);
        // Ist in dem Datensatz eine SID vorhanden
        if pbuf^.UserSidLength <> 0
        then
        // Wenn ja, dann Namen raussuchen
        BEGIN
          LookUpAccountSid(source, next_pointer_step(pbuf, pbuf^.UserSidOffset), usrName, usrSize, domainName, domainSize, peuse);
          viewable.Username:= usrName;
          if not (viewable.Username = '')
          then // entsprechend speichern
            viewable.UserName := Format('%s', [usrName])
          else
            viewable.UserName:= 'N/A';
        END
        else
          viewable.UserName:= 'N/A';
          // Username entweder vorhanden oder auf 'N/A' gesetzt
        error := RegOpenKeyEx(HKEY_LOCAL_MACHINE, PChar('SYSTEM\CurrentControlSet\Services\Eventlog\'+event_log_name+'\'+viewable.sourcename), 0, KEY_ALL_ACCESS, regkey); // Registrierung öffnen
        if error = ERROR_SUCCESS THEN
        BEGIN // Schlüssel in der Registrierung vorhanden
          h1:= nil;
          regbuffersize:= 1024;
          GetMem(h1, 1024);
          error:= RegQueryValueEx(regkey, 'EventMessageFile', nil, nil, PByte(h1), @regbuffersize); // Schlüssel auslesen
          if error = ERROR_SUCCESS THEN
          BEGIN // Zugehörigen DLL-Namen speichern & Nachrichtentext ermitteln
            SetString(viewable.SourceFile, PChar(h1), lstrlen(PChar(h1)));
            freemem(h1);
            viewable.MessageText:= geteventmessagetext(pbuf^.EventID, viewable.sourcefile, pbuf, viewable); // Nachrichtentext ins lesbare konvertieren
            view:=viewable.EventType+';'+Format('%2.2d/%2.2d/%4.4d', [zeit.wMonth, zeit.wDay, zeit.wYear])+';'+Format('%2.2d:%2.2d:%2.2d', [zeit.wHour, zeit.wMinute, zeit.wSecond])+';'+viewable.SourceName+';'; // Logstring anlegen
            if viewable.EventCategory = 'then viewable.EventCategory:= 'None';
            view:= view+viewable.EventCategory+';'+inttostr(pbuf^.EventID)+';'+viewable.Username+';'+viewable.ComputerName+';'+viewable.MessageText+';';
            liste.Add(view); // Logstring der Liste hinzufügen
          END // Zugehörigen DLL-Namen speichern & Nachrichtentext ermitteln
          ELSE
          BEGIN // Keine DLL-Datei in der Registry eingetragen
            view:=viewable.EventType+';'+Format('%2.2d/%2.2d/%4.4d', [zeit.wMonth, zeit.wDay, zeit.wYear])+';'+Format('%2.2d:%2.2d:%2.2d', [zeit.wHour, zeit.wMinute, zeit.wSecond])+';'+viewable.SourceName+';'; // Logstring anlegen
            if viewable.EventCategory = 'then viewable.EventCategory:= 'None';
            hw:= next_pointer_step(pbuf, pbuf^.Stringoffset);
            viewable.MessageText:= 'KEINE DLL-DATEI VORHANDEN: ';
            if pbuf^.Numstrings < 1 then view:= 'Nicht erkennbare Daten'
            else
            BEGIN
              for j:=1 to pbuf^.Numstrings DO // Parameter im Nachrichtentext ersetzen
              BEGIN
                SetString(hs, hw, lstrlen(hw));
                inc (hw, lstrlen(hw)+1);
                viewable.MessageText:= viewable.MessageText+hs;
              END;
              view:= view+viewable.EventCategory+';'+inttostr(pbuf^.EventID)+';'+viewable.Username+';'+viewable.ComputerName+';'+viewable.MessageText+';';
            END;
            liste.Add(view); // Logstring der Liste hinzufügen
            Freemem(hw);
          END;
          RegCloseKey(regkey);
        END // Schlüssel in der Registrierung vorhanden
        ELSE // Kein Eintrag in der Registrierung vorhanden
        BEGIN // Keine DLL-Datei in der Registry eingetragen
          view:=viewable.EventType+';'+Format('%2.2d/%2.2d/%4.4d', [zeit.wMonth, zeit.wDay, zeit.wYear])+';'+Format('%2.2d:%2.2d:%2.2d', [zeit.wHour, zeit.wMinute, zeit.wSecond])+';'+viewable.SourceName+';'; // Logstring anlegen
          if viewable.EventCategory = 'then viewable.EventCategory:= 'None';
          hw:= next_pointer_step(pbuf, pbuf^.Stringoffset);
          viewable.MessageText:= 'KEINE DLL-DATEI VORHANDEN: ';
          if pbuf^.Numstrings < 1 then view:= 'Nicht erkennbare Daten'
          else
          BEGIN
            for j:=1 to pbuf^.Numstrings DO // Parameter im Nachrichtentext ersetzen
            BEGIN
              SetString(hs, hw, lstrlen(hw));
              inc (hw, lstrlen(hw)+1);
              viewable.MessageText:= viewable.MessageText+hs;
            END;
            view:= view+viewable.EventCategory+';'+inttostr(pbuf^.EventID)+';'+viewable.Username+';'+viewable.ComputerName+';'+viewable.MessageText+';';
          END;
          liste.Add(view); // Logstring der Liste hinzufügen
          Freemem(hw);
        END;
        Freemem(pbuf);
      END; // FOR-Schleife
    END;
  END;
  CloseEventLog(event);
end;
Die Variablen Typ und Liste werden in einer aufrufenden Instanz erstellt und auch wieder freigegeben.

Gruß

Matthias
  Mit Zitat antworten Zitat