AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Win32/Win64 API (native code) OpenEventLog: wie lpSourceName herausfinden?

OpenEventLog: wie lpSourceName herausfinden?

Ein Thema von CCRDude · begonnen am 14. Jan 2022 · letzter Beitrag vom 18. Jan 2022
Antwort Antwort
CCRDude

Registriert seit: 9. Jun 2011
664 Beiträge
 
FreePascal / Lazarus
 
#1

OpenEventLog: wie lpSourceName herausfinden?

  Alt 14. Jan 2022, 20:16
Ich möchte OpenEventLog benutzen, um das Windows Defender-Log zu durchstöbern. Dazu muss ich den Namen des Logs übergeben, den ich einfach nicht rausfinde. Kann mir jemand helfen?

Code:
HANDLE OpenEventLogA(
  [in] LPCSTR lpUNCServerName,
  [in] LPCSTR lpSourceName
);
Im Event Viewer findet sich das Log unter:
Event Viewer (Local) > Applications and Services Logs > Microsoft > Windows > Windows Defender > Operational
In den Log Properties findet sich der "Full Name" des Logs als:
Microsoft-Windows-Windows Defender/Operational
Als Source findet sich in den Events:
Windows Defender
Die Datei, die das Log beinhaltet, befindet sich in:
%SystemRoot%\System32\Winevt\Logs\Microsoft-Windows-Windows Defender%4Operational.evtx
Und der zugehörige Registry-Eintrag findet sich unter):
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Servic es\EventLog\System\WinDefend
Laut Doku wäre das passend, denn:
Zitat:
The source name must be a subkey of a logfile entry under the EventLog key in the registry.
Als Test habe ich einen kleinen Viewer gebaut, der andere Logs schon lesen kann. Das klappt je nach Log einfach bis gar nicht:

Code:
   // standard names seem to work easily:
   NewTabSheet('Application');
   NewTabSheet('System');

   // these have files with same name, and registry entries with name/name, and work:
   NewTabSheet('Veeam Agent');
   NewTabSheet('Spybot 3');

   // failing attempts to access the Windows Defender Log:
   //NewTabSheet('Microsoft-Windows-Windows Defender/Operational');
   //NewTabSheet('Microsoft\Windows\Windows Defender\Operational');
   //NewTabSheet('Microsoft-Windows-Windows Defender');
   //NewTabSheet('Microsoft\Windows\Windows Defender');
   //NewTabSheet('Windows Defender');
   //NewTabSheet('WinDefend');
Aus welchem Namen muss ich den Namen des lpSourceName-Parameters herleiten?
(und wie ist der mit dem Namen in der Registry verknüpft, die brauche ich ja, um die Dateinamen der Message-DLL(s) dazu zu bekommen)

Laut Doku wäre es ja WinDefend, aber dabei erhalte ich das übergeordnete "System"-Log, mit keinem einzigen Eintrag, der "passt" (also auch filtern nicht hilfreich).

Bin für jeden weiteren Tipp dankbar

Geändert von CCRDude (14. Jan 2022 um 20:44 Uhr)
  Mit Zitat antworten Zitat
TiGü

Registriert seit: 6. Apr 2011
Ort: Berlin
2.856 Beiträge
 
Delphi 10.2 Tokyo Enterprise
 
#2

AW: OpenEventLog: wie lpSourceName herausfinden?

  Alt 17. Jan 2022, 09:59
Hier kommen verschiedene Handle-Werte bei rum:

Delphi-Quellcode:
program Project1;

{$APPTYPE CONSOLE}

{$R *.res}

uses
  System.SysUtils,
  Winapi.Windows;

var
  SourceName: string;
  SystemEventLogHandle,
  WinDefendEventLogHandle: THandle;

begin
  try
    SourceName := 'System';
    SystemEventLogHandle := OpenEventLog(nil, @SourceName);
    Writeln(SourceName, ': ', SystemEventLogHandle.ToHexString);

    SourceName :='System\WinDefend';
    WinDefendEventLogHandle := OpenEventLog(nil, @SourceName);
    Writeln(SourceName, ': ', WinDefendEventLogHandle.ToHexString);
  except
    on E: Exception do
      Writeln(E.ClassName, ': ', E.Message);
  end;
  Readln;
end.
Ausgabe:

Code:
System: 006D7370
System\WinDefend: 006D8480
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu
Online

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
38.927 Beiträge
 
Delphi 10.4 Sydney
 
#3

AW: OpenEventLog: wie lpSourceName herausfinden?

  Alt 17. Jan 2022, 10:59
Das ist egal.

Ob eine Funktion beim Öffnen des "Selben" jeweils eigene Handle liefert, oder das gleiche Handle mit einer Referenzzählung, ist ihr überlassen.
Ein unterschiedliches Handle besagt nichts darüber, was drin ist.



Delphi-Quellcode:
program Project1;

{$APPTYPE CONSOLE}

{$R *.res}

uses
  System.SysUtils,
  Winapi.Windows;

var
  SourceName: string;
  SystemEventLogHandle,
  WinDefendEventLogHandle: THandle;

begin
  try
    SourceName := 'System';
    SystemEventLogHandle := OpenEventLog(nil, @SourceName);
    Writeln(SourceName, ': ', SystemEventLogHandle.ToHexString);

    SourceName :='System';
    WinDefendEventLogHandle := OpenEventLog(nil, @SourceName);
    Writeln(SourceName, ': ', WinDefendEventLogHandle.ToHexString);
  except
    on E: Exception do
      Writeln(E.ClassName, ': ', E.Message);
  end;
  Readln;
end.
System: 005C1880
System: 005BF928
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
Delphi-Tage 2005-2014

Geändert von himitsu (17. Jan 2022 um 11:02 Uhr)
  Mit Zitat antworten Zitat
peterbelow

Registriert seit: 12. Jan 2019
Ort: Hessen
398 Beiträge
 
Delphi 11 Alexandria
 
#4

AW: OpenEventLog: wie lpSourceName herausfinden?

  Alt 17. Jan 2022, 13:28
Hier kommen verschiedene Handle-Werte bei rum:

Delphi-Quellcode:
var
  SourceName: string;
  SystemEventLogHandle,
  WinDefendEventLogHandle: THandle;

begin
  try
    SourceName := 'System';
    SystemEventLogHandle := OpenEventLog(nil, @SourceName);
Der Aufruf ist falsch kodiert, @Sourcename gibt die Addresse der Variablen SourceName, nicht die des Inhalts. Versuch mal

SystemEventLogHandle := OpenEventLog(nil, PChar(SourceName));
Peter Below
  Mit Zitat antworten Zitat
TiGü

Registriert seit: 6. Apr 2011
Ort: Berlin
2.856 Beiträge
 
Delphi 10.2 Tokyo Enterprise
 
#5

AW: OpenEventLog: wie lpSourceName herausfinden?

  Alt 17. Jan 2022, 15:09
Hier kommen verschiedene Handle-Werte bei rum:

Delphi-Quellcode:
var
  SourceName: string;
  SystemEventLogHandle,
  WinDefendEventLogHandle: THandle;

begin
  try
    SourceName := 'System';
    SystemEventLogHandle := OpenEventLog(nil, @SourceName);
Der Aufruf ist falsch kodiert, @Sourcename gibt die Addresse der Variablen SourceName, nicht die des Inhalts. Versuch mal

SystemEventLogHandle := OpenEventLog(nil, PChar(SourceName));


Jo, stimmt schon!
Hilft aber trotzdem nicht weiter, weil diese Kackschnittstelle einen immer auf 'Application' zurückwirft, wenn sie den Namen nicht auflösen kann. Tolle Wurst!

Delphi-Quellcode:
procedure OpenAndPrintEventLog(const SourceName: string);
var
    EventLogHandle: THandle;
    NumberOfRecords: DWORD;
    RetValue: LongBool;
begin
    EventLogHandle := OpenEventLog(nil, PChar(SourceName));

    Writeln(SourceName, ': ', EventLogHandle.ToHexString);
    NumberOfRecords := 0;
    RetValue := GetNumberOfEventLogRecords(EventLogHandle, NumberOfRecords);
    if RetValue then
    begin
        Writeln(SourceName, ' has ', NumberOfRecords, ' records');
    end
    else
    begin
        Writeln(SourceName, ' has no records');
    end;
end;

begin
    try
         OpenAndPrintEventLog('System');
         OpenAndPrintEventLog('System\WinDefend');
         OpenAndPrintEventLog('Application');
         OpenAndPrintEventLog('Security');
         OpenAndPrintEventLog('Windows PowerShell');
         OpenAndPrintEventLog('Microsoft\Windows\Win32k');
    except
        on E: Exception do
                Writeln(E.ClassName, ': ', E.Message);
    end;
    Readln;
end.
  Mit Zitat antworten Zitat
CCRDude

Registriert seit: 9. Jun 2011
664 Beiträge
 
FreePascal / Lazarus
 
#6

AW: OpenEventLog: wie lpSourceName herausfinden?

  Alt 17. Jan 2022, 17:40
Jo, stimmt schon!
Hilft aber trotzdem nicht weiter, weil diese Kackschnittstelle einen immer auf 'Application' zurückwirft, wenn sie den Namen nicht auflösen kann. Tolle Wurst!
WinDefend wirft bei mir auf System zurück, alle anderen gar nicht existierenden Namen tatsächlich auf Application. Insofern scheint der Name WinDefend ansatzweise richtig zu sein.

Das MSDN-Beispiel prüft den "Provider", den ersten String hinter dem jeweiligen Record. Die habe ich mir für System aber alle ausgeben lassen, und WinDefend oder Windows Defender oder Microsoft-Windows-Defender.

Schaue ich in die Registry zum Eintrag von WinDefend, finde ich dort noch eine ProviderGuid. Kann die noch involviert sein?

Ich teile hier mal meine Reader-Klasse, das ist ein funktionierender Aufruf von OpenEventLog. Zugegeben Lazarus/FreePascal, aber im Delphi-Modus:
https://www.ccrdude.net/snippets/

(Nachtrag: hier steht, das OpenEventLog Legacy-Code ist. Ich werde mich mal an die Evt-Funktionen machen.)

Geändert von CCRDude (17. Jan 2022 um 17:47 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu
Online

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
38.927 Beiträge
 
Delphi 10.4 Sydney
 
#7

AW: OpenEventLog: wie lpSourceName herausfinden?

  Alt 17. Jan 2022, 18:40
Zitat:
[in] lpSourceName

The name of the log.

If you specify a custom log and it cannot be found, the event logging service opens the Application log; however, there will be no associated message or category string file.
MSDN-Library durchsuchenOpenEventLog




https://docs.microsoft.com/en-us/win.../event-sources
https://docs.microsoft.com/en-us/win...g/eventlog-key
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
Delphi-Tage 2005-2014
  Mit Zitat antworten Zitat
HolgerX

Registriert seit: 10. Apr 2006
Ort: Leverkusen
924 Beiträge
 
Delphi 6 Professional
 
#8

AW: OpenEventLog: wie lpSourceName herausfinden?

  Alt Gestern, 15:46
Hmm..

Dir ist bewusst, das OpenEventLog eigentlich nur die Primären LogFiles kann?
(Applikation/System..)
In den Filtern der Ereignisanzeige von Windows 'Protokoll' genannt.

Die Namen findest Du in der Reg unter HKLM\SYSTEM\CurrentControlSet\Services\Eventlog

Diese entsprechen (intern) den wohl tatsächlichen LogFiles...
Jedes dieser LogFile hat dann Provider, in der Ereignisanzeige 'Quelle' genannt.

Mit WMI kannst Du dann auch die Sourcen/Provider selectieren:
"SELECT * FROM Win32_NTLogEvent where LogFile='System' and SourceName ='WinDefend' "

Optional geht das seit Vista über die neuere (Nachfolger) API 'Windows Events API' (winevt.h).
Dort kannst Du dann die Liste der Channels (Protokolle) per 'EvtOpenChannelEnum' / 'EvtNextChannelPath' auslesen, wie auch die separaten Einträge...
(Ja ich Verwende Delphi 6 Pro und will NICHT wechseln!)
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 17:29 Uhr.
Powered by vBulletin® Copyright ©2000 - 2022, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2021 by Daniel R. Wolf