Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   OpenEventLog: wie lpSourceName herausfinden? (https://www.delphipraxis.net/209725-openeventlog-wie-lpsourcename-herausfinden.html)

CCRDude 14. Jan 2022 19:16

OpenEventLog: wie lpSourceName herausfinden?
 
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 :)

TiGü 17. Jan 2022 08:59

AW: OpenEventLog: wie lpSourceName herausfinden?
 
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

himitsu 17. Jan 2022 09:59

AW: OpenEventLog: wie lpSourceName herausfinden?
 
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

peterbelow 17. Jan 2022 12:28

AW: OpenEventLog: wie lpSourceName herausfinden?
 
Zitat:

Zitat von TiGü (Beitrag 1500694)
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

Delphi-Quellcode:
SystemEventLogHandle := OpenEventLog(nil, PChar(SourceName));

TiGü 17. Jan 2022 14:09

AW: OpenEventLog: wie lpSourceName herausfinden?
 
Zitat:

Zitat von peterbelow (Beitrag 1500718)
Zitat:

Zitat von TiGü (Beitrag 1500694)
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

Delphi-Quellcode:
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.

CCRDude 17. Jan 2022 16:40

AW: OpenEventLog: wie lpSourceName herausfinden?
 
Zitat:

Zitat von TiGü (Beitrag 1500731)
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.)

himitsu 17. Jan 2022 17:40

AW: OpenEventLog: wie lpSourceName herausfinden?
 
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 :angle2:




https://docs.microsoft.com/en-us/win.../event-sources
https://docs.microsoft.com/en-us/win...g/eventlog-key

HolgerX 18. Jan 2022 14:46

AW: OpenEventLog: wie lpSourceName herausfinden?
 
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...


Alle Zeitangaben in WEZ +1. Es ist jetzt 07:51 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