Das Windows-Ereignisprotokoll per Programmcode exportieren

Unter Verwendung der EvtExportLog-Funktion, schaffe ich es zurzeit nicht, korrekte Werte für die Path- und/oder Query-Parameter zu verwenden.

Mein Ziel ist es, die lokalen Ereignisprotokolle Application und System zu exportieren.

Ich habe folgendes probiert:

EvtExportLog(
    IntPtr.Zero, 
    "Application", 
    "*", 
    "C:\\SomePath\\Application.evtx", 
    EventExportLogFlags.LogFilePath);

mit der folgenden P/Invoke-Definition:

[Flags]
private enum EventExportLogFlags
{
    ChannelPath = 1,
    LogFilePath = 2,
    TolerateQueryErrors = 0x1000
};

[DllImport(@"wevtapi.dll", 
    CallingConvention = CallingConvention.Winapi,
    CharSet = CharSet.Auto,
    SetLastError = true)]
private static extern bool EvtExportLog(
    IntPtr sessionHandle,
    string path,
    string query,
    string targetPath,
    [MarshalAs(UnmanagedType.I4)] EventExportLogFlags flags);

Leider gibt die Funktion immer false zurück und den Fehlercode 2 (ERROR_FILE_NOT_FOUND).

Meine Frage:

Was muss ich in Path und Query angeben, um die lokalen Event Logs Application und System zu exportieren?

(Hier meine Original-Frage auf Stack Overflow)

Um meine eigene Frage zu beantworten:

Meine Path- und Query-Parameter waren tatsächlich schon korrekt. Was falsch war, war der Flags-Parameter.

Anstatt dem EventExportLogFlags.LogFilePath-Parameter, musste ich den EventExportLogFlags.ChannelPath-Parameter angeben.

Dann hat der Export funktioniert:

EvtExportLog(
    IntPtr.Zero, 
    "Application", 
    "*", 
    "C:\\SomePath\\Application.evtx", 
    EventExportLogFlags.ChannelPath); // <-- HIER!

Es wurde ein Export mit dem gesamten Eventlog erstellt.

Für das System-Protokoll einfach „System“ statt „Application“ angeben.