![]() |
Windows Ereignisnachrichten
Wie kann ich die von Windows gesendeten Ereignisnachrichten protokollieren?
Wahrscheinlich über RegisterEventSource und ReportEvent, nur damit komm ich noch nicht klar. |
Re: Windows Ereignisnachrichten
1. Das ist "Windows API"!
2. Nachrichten an wen oder was protokollieren? An dein Fenster? An alle Fenster? Dein Fenster: Die WndProc entsprechend anpassen (bei VCL geht das auch) Alle Fenster: Message Hook setzen. Dazu siehe: ![]() |
Re: Windows Ereignisnachrichten
*schwupps*
Oder meinst Du das Ereignisprotokoll? ...:cat:... |
Re: Windows Ereignisnachrichten
Ich meine die Ereignisse die man in der Computerverwaltung unter Ereignisanzeige sieht.
|
Re: Windows Ereignisnachrichten
LOL ... ziemlich (un)klare Audrucksweise ... danke Sakura :)
Also, kannst du kurz mal erläutern, wieso du ein Protokoll (nix anderes sind die Events in der Eventlog) protokollieren willst? IMHO a bisserl unsinnig, oder? Oder willst du nur wissen, wann ein Ereignis eingeht, so wie der Ereignismonitor von (fällt mir nicht mehr ein) ...? Nachtrag: Das ist immernoch Windows API ... und zwar vom Feinsten. |
Re: Windows Ereignisnachrichten
Zitat:
...:cat:... [edit=Luckie] Jetzt muß ich schon bei einem Supermoderator die Quote-tags korrigieren. :? Mfg, Luckie[/edit] |
Re: Windows Ereignisnachrichten
Ich möchte einfach alle Events auflisten, damit ich z.B. eine Nachricht bekomme, wenn etwas bestimmtes passiert.
|
Re: Windows Ereignisnachrichten
Ich schreib dir nachmittag wahrscheinlich was, wenn mir keiner zuvor kommt.
|
Re: Windows Ereignisnachrichten
Nen Beispiel wäre echt klasse! :hello:
Ansonsten besteht halt das große Problem darin, woher weiß ich, wann ein Ereigniss gesendet wird? |
Re: Windows Ereignisnachrichten
|
Re: Windows Ereignisnachrichten
Leider bedienst du dich dabei der Ereignisanzeige, weißt du wie ich selbst die EventInfos bekomme?
|
Re: Windows Ereignisnachrichten
Manchmal sollte man auch was selber machen. Lustig ist bei mir zumindest vorbei. Nimm:
- ReadEventLog - GetOldestEventLogRecord - GetNumberOfEventLogRecords Wie du die Eventlogs auflistest hast du in meinem Programm mit drin ... wie du sie öffnest auch. Der Rest ist Pillepalle. |
Re: Windows Ereignisnachrichten
Nach ewigem Probieren komm ich da trotzdem nicht weiter. Kannst du mir nicht noch nen kleinen Tipp geben? Ich verzweifel mittlerweile daran.
|
Re: Windows Ereignisnachrichten
Gedulde dich ...
|
Re: Windows Ereignisnachrichten
Schau mal
![]() |
Re: Windows Ereignisnachrichten
@Assarbad: Super :hello:
...:cat:... P.S.: Warum hast Du eigentlich nicht die .com-Domain, die ist doch frei. |
Re: Windows Ereignisnachrichten
.com steht für "commercial" :mrgreen:. Trifft bei mir (noch) nicht zu. .info ist eventuell noch interessant. Mal sehen ...
BTW: Ist in der letzten Stunde "Andromeda" entstanden ;) ... für mehr reicht meine Zeit eh nicht, da ich morgen Konsultation und nächste Woche mündl. Prüfung in Partikeltechnologie habe. |
Re: Windows Ereignisnachrichten
:hello: Danke dir!
Hatte vorher das Beispiel von MSDN und kam da an einer Stelle nicht weiter, jetzt hab ich es aber dank deiner Hilfe. Die Umwandlung von ID [pelr^.EventID mod 32768] und EventType war ja einfach, nur bei der Quelle, Kategorie sowie Beschreibung hapert es noch. Hat da jemand ne Idee? |
Re: Windows Ereignisnachrichten
Die Quelle habe ich auch hinbekommen, nur wie bekomme ich die Kategorie, den Benutzer und die Beschreibung?
|
Re: Windows Ereignisnachrichten
Wozu ist pelr^.EventID mod 32768 gut? Die EventID ist ein 32bit unsigned Integer - und soll es auch sein ...!
BTW: Bekommt denn heute keiner mehr, der ne Delphi 5 Enterprise hat was auf die Reihe? Ich versteh das immer nicht, da kaufen (?) sich die Leute eine mehrere Tausend Euro teure Entwicklungsumgebung ... aber alles was über "Komponenten auf das Form ziehen" geht, kriegen sie nicht auf die Reihe. Du bist da nicht der erste Fall! |
Re: Windows Ereignisnachrichten
Also ... mehr gibts nun wirklich nicht!
Ich erwarte die Nennung meines Nicks in der Aboutbox, sowie die Angabe meiner URL ( ![]() ![]()
Delphi-Quellcode:
function GetEventIDText(EventID: DWORD; msgfile: string; pelr: PEVENTLOGRECORD): string;
type PVA_LIST = ^VA_LIST; VA_LIST = array[0..0] of Pointer; var hLib: THandle; ret, flags, nSize: DWORD; ppc, pc, lpc: PChar; i: Integer; // pval: PVA_LIST; begin result := ''; flags := FORMAT_MESSAGE_FROM_HMODULE or FORMAT_MESSAGE_ALLOCATE_BUFFER or FORMAT_MESSAGE_ARGUMENT_ARRAY or FORMAT_MESSAGE_IGNORE_INSERTS; nSize := ExpandEnvironmentStrings(@msgfile[1], nil, 0) + 2; GetMem(pc, nSize); if Assigned(pc) then try ZeroMemory(pc, nSize); ExpandEnvironmentStrings(@msgfile[1], pc, nSize); for i := lstrlen(pc) - 1 downto 0 do if pc[i] = ';' then pc[i] := #0; lpc := pc; while lpc[0] <> #0 do begin hLib := LoadLibraryEx(lpc, 0, DONT_RESOLVE_DLL_REFERENCES); inc(lpc, lstrlen(lpc) + 1); if hLib <> 0 then try ret := FormatMessage(flags, Pointer(hLib), EventID, LANG_USER_DEFAULT, @ppc, 0, nil); if ((ret = 0) and (GetLastError = ERROR_MR_MID_NOT_FOUND) and (lpc[0] <> #0)) then Continue; finally FreeLibrary(hLib); end; end; if ret <> 0 then SetString(result, ppc, lstrlen(ppc)); if Assigned(ppc) then LocalFree(THandle(ppc)); finally Freemem(pc); end; // TODO: insert the replacement strings! end; function GetEventRecordString(pelr: PEVENTLOGRECORD; el: PChar): MYEVENTLOGRECORD; (* This function extracts the data from a EVENTLOGRECORD and the trailing data! "el" is the name of the Eventlog read. It is used to determine the event source. *) const elkey = 'SYSTEM\CurrentControlSet\Services\Eventlog\'; var ft: FILETIME; pc: PChar; uName, dName: array[0..MAX_PATH - 1] of Char; err, uSize, dSize, use: DWORD; key: HKEY; temps: string; begin // Fill record with zeroes ZeroMemory(@result, sizeof(result)); // Fill different members result.RecordNumber := pelr^.RecordNumber; result.EventID := pelr^.EventID; // Convert unix type time format to local filetime ft := UnixTimeToFileTime(pelr^.TimeGenerated); FileTimeToLocalFileTime(ft, result.LocalTimeGenerated); // ... twice ft := UnixTimeToFileTime(pelr^.TimeWritten); FileTimeToLocalFileTime(ft, result.LocalTimeWritten); // Fill more members result.EventType := pelr^.EventType; result.EventCategory := pelr^.EventCategory; // Check wether we need to copy data if pelr^.DataLength <> 0 then begin SetLength(result.Data, pelr^.DataLength); // Copy the data into a string ... this might be more convenient to handle CopyMemory(@result.Data[1], PAdd(pelr, pelr^.DataOffset), pelr^.DataLength); end; // Get event source name pc := PAdd(pelr, sizeof(pelr^)); SetString(result.SourceName, pc, lstrlen(pc)); // Go to computer name ... inc(pc, lstrlen(pc) + 1); SetString(result.ComputerName, pc, lstrlen(pc)); uSize := sizeof(uName); dSize := sizeof(dName); // Is there a SID if pelr^.UserSidLength <> 0 then // Yes, so look up its name ... if LookUpAccountSid(pc, PAdd(pelr, pelr^.UserSidOffset), uName, uSize, dName, dSize, use) then // And set it result.UserName := Format('\\%s\%s', [@dName, @uName]); // Use a temporary variable temps := elkey + string(el) + '\' + result.SourceName; // Try to get the name for the library containing the message string err := RegOpenKey(HKEY_LOCAL_MACHINE, @temps[1], key); if err = ERROR_SUCCESS then try dSize := 0; RegQueryValueEx(key, 'EventMessageFile', nil, nil, nil, @dSize); begin GetMem(pc, dSize); if Assigned(pc) then try ZeroMemory(pc, dSize); if RegQueryValueEx(key, 'EventMessageFile', nil, nil, PByte(pc), @dSize) = ERROR_SUCCESS then SetString(result.SourceFile, pc, lstrlen(pc)); finally FreeMem(pc); end; end; finally RegCloseKey(key); end; // If we found a source file ... if result.SourceFile <> '' then result.MessageText := GetEventIDText(result.EventID, result.SourceFile, pelr); end; |
Re: Windows Ereignisnachrichten
Danke!
Ne kleine Frage aber noch. Was macht das PAdd(), was ist das für ne Function? Da bekomm ich immer undefinierter Bezeichner. |
Re: Windows Ereignisnachrichten
Ist alles beim Sourcecode von Eventloglister dabei. Die Funktion addiert eine Zahl zu einer Adresse (Pointer).
|
Re: Windows Ereignisnachrichten
Wie komme ich an die insertion strings?
|
Re: Windows Ereignisnachrichten
Istn Scherz, oder? Der Code wird zwar nicht benutzt, aber er ist drin. Also bitte nochmal schauen! Habe morgen mündl. Prüfung!
|
Re: Windows Ereignisnachrichten
Eigentlich sollte ich dies ja über NumStrings und StringOffset bekommen, doch irgendwie geht das über diese Positionen nicht. :( Ich bekomm immer nur den ersten und weiß nicht wie ich an die anderen komme?
Viel Erfolg bei deiner mündl. Prüfung! |
Re: Windows Ereignisnachrichten
Woher weiß ich die Anzahl insertion strings? Der Wert von NumStrings ist das nämlich nicht.
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 04:17 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz