事件查看器所有事件ID的含义

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了事件查看器所有事件ID的含义相关的知识,希望对你有一定的参考价值。

谢谢大家了,给我介绍一个详细介绍所有事件ID的含义。

到参考资料中输入ID值,搜索一下就能找到。
不过是英文站点,对普通人来说没有多大意思,除非你是专门搞电脑的,那里的故障说明和解决方法很有用处。
参考资料:http://www.eventid.net/
参考技术A 我是新手无法回答提问,谢谢!

在事件查看器的情况下无法捕获未来事件

【中文标题】在事件查看器的情况下无法捕获未来事件【英文标题】:Not able to capture Future events in Case of Event Viewer 【发布时间】:2019-05-16 06:50:13 【问题描述】:

我试图通过订阅“安全”频道来捕获旧的和未来的 Windows 事件日志。但是我只得到旧的事件,并且所有未来的事件都丢失了。

目前正在处理 Windows 事件日志。 我想要来自特定事件记录 ID 和所有未来事件的旧事件。 为此,我订阅了特定的频道,例如“安全”并尝试捕获我想要的事件。 但是在订阅的安全通道的情况下,我使用“EvtSubscribeStartAtOldestRecord”标志,以便订阅所有旧事件和未来事件,但我只收到旧事件并且未来事件丢失。

EvtSubscribe (                                           
         NULL,                                           
         arrWaitHandle[1],                                           
         pwszChannel,                                        
         wsQuery,                                            
         NULL,                                           
         NULL,                                           
         NULL,                                           
         EvtSubscribeStartAtOldestRecord                                             
         );

为了订阅频道,我使用上面的 API 和 EvtSubscribeStartAtOldestRecord 标志,因为我想要旧事件以及未来事件,但在“安全”频道的情况下,我只得到旧事件并且未捕获未来事件。

我观察到在其他渠道的情况下,例如“应用程序”或“系统”,我得到了旧事件和未来事件。 但是对于“安全”频道,我只收到了旧事件。

【问题讨论】:

也许代码中存在我们看不到的错误。显示minimal reproducible example。 【参考方案1】:

我可以使用域管理员帐户捕获旧事件和未来事件,使用以下代码,这是Subscribing to Events 上的示例,我已经更改了其中的一些:

#include <windows.h>
#include <conio.h>
#include <stdio.h>
#include <winevt.h>

#pragma comment(lib, "wevtapi.lib")

#define ARRAY_SIZE 10

DWORD EnumerateResults(EVT_HANDLE hResults);
DWORD PrintEvent(EVT_HANDLE hEvent);
BOOL IsKeyEvent(HANDLE hStdIn);

void __cdecl wmain()

    DWORD status = ERROR_SUCCESS;
    EVT_HANDLE hSubscription = NULL;
    HANDLE aWaitHandles[2];
    DWORD dwWait = 0;

    // Get a handle for console input, so you can break out of the loop.
    aWaitHandles[0] = GetStdHandle(STD_INPUT_HANDLE);
    if (INVALID_HANDLE_VALUE == aWaitHandles[0])
    
        wprintf(L"GetStdHandle failed with %lu.\n", GetLastError());
        goto cleanup;
    

    // Get a handle to a manual reset event object that the subscription will signal
    // when events become available that match your query criteria.
    aWaitHandles[1] = CreateEvent(NULL, TRUE, TRUE, NULL);
    if (NULL == aWaitHandles[1])
    
        wprintf(L"CreateEvent failed with %lu.\n", GetLastError());
        goto cleanup;
    

    // Subscribe to events.
    hSubscription = EvtSubscribe(NULL, aWaitHandles[1], L"Security", NULL, NULL, NULL, NULL, EvtSubscribeStartAtOldestRecord);
    if (NULL == hSubscription)
    
        status = GetLastError();

        if (ERROR_EVT_CHANNEL_NOT_FOUND == status)
            wprintf(L"Channel was not found.\n");
        else if (ERROR_EVT_INVALID_QUERY == status)
            wprintf(L"The query was not found.\n");
        else
            wprintf(L"EvtSubscribe failed with %lu.\n", status);

        goto cleanup;
    

    wprintf(L"Press any key to quit.\n");

    // Loop until the user presses a key or there is an error.
    while (true)
    
        dwWait = WaitForMultipleObjects(sizeof(aWaitHandles) / sizeof(HANDLE), aWaitHandles, FALSE, INFINITE);

        if (0 == dwWait - WAIT_OBJECT_0)  // Console input
        
            if (IsKeyEvent(aWaitHandles[0]))
                break;
        
        else if (1 == dwWait - WAIT_OBJECT_0) // Query results
        
            if (ERROR_NO_MORE_ITEMS != (status = EnumerateResults(hSubscription)))
            
                break;
            

            ResetEvent(aWaitHandles[1]);
        
        else
        
            if (WAIT_FAILED == dwWait)
            
                wprintf(L"WaitForSingleObject failed with %lu\n", GetLastError());
            
            break;
        
    

cleanup:

    if (hSubscription)
        EvtClose(hSubscription);

    if (aWaitHandles[0])
        CloseHandle(aWaitHandles[0]);

    if (aWaitHandles[1])
        CloseHandle(aWaitHandles[1]);


// Enumerate the events in the result set.
DWORD EnumerateResults(EVT_HANDLE hResults)

    DWORD status = ERROR_SUCCESS;
    EVT_HANDLE hEvents[ARRAY_SIZE];
    DWORD dwReturned = 0;

    while (true)
    
        // Get a block of events from the result set.
        if (!EvtNext(hResults, ARRAY_SIZE, hEvents, INFINITE, 0, &dwReturned))
        
            if (ERROR_NO_MORE_ITEMS != (status = GetLastError()))
            
                wprintf(L"EvtNext failed with %lu\n", status);
            

            goto cleanup;
        

        // For each event, call the PrintEvent function which renders the
        // event for display.
        for (DWORD i = 0; i < dwReturned; i++)
        
            if (ERROR_SUCCESS == (status = PrintEvent(hEvents[i])))
            
                EvtClose(hEvents[i]);
                hEvents[i] = NULL;
            
            else
            
                goto cleanup;
            
        
    

cleanup:

    // Closes any events in case an error occurred above.
    for (DWORD i = 0; i < dwReturned; i++)
    
        if (NULL != hEvents[i])
            EvtClose(hEvents[i]);
    

    return status;


// Render the event as an XML string and print it.
DWORD PrintEvent(EVT_HANDLE hEvent)

    DWORD status = ERROR_SUCCESS;
    DWORD dwBufferSize = 0;
    DWORD dwBufferUsed = 0;
    DWORD dwPropertyCount = 0;
    LPWSTR pRenderedContent = NULL;

    // The EvtRenderEventXml flag tells EvtRender to render the event as an XML string.
    if (!EvtRender(NULL, hEvent, EvtRenderEventXml, dwBufferSize, pRenderedContent, &dwBufferUsed, &dwPropertyCount))
    
        if (ERROR_INSUFFICIENT_BUFFER == (status = GetLastError()))
        
            dwBufferSize = dwBufferUsed;
            pRenderedContent = (LPWSTR)malloc(dwBufferSize);
            if (pRenderedContent)
            
                EvtRender(NULL, hEvent, EvtRenderEventXml, dwBufferSize, pRenderedContent, &dwBufferUsed, &dwPropertyCount);
            
            else
            
                wprintf(L"malloc failed\n");
                status = ERROR_OUTOFMEMORY;
                goto cleanup;
            
        

        if (ERROR_SUCCESS != (status = GetLastError()))
        
            wprintf(L"EvtRender failed with %d\n", GetLastError());
            goto cleanup;
        
    

    wprintf(L"\n\n%s", pRenderedContent);

cleanup:

    if (pRenderedContent)
        free(pRenderedContent);

    return status;


// Determines whether the console input was a key event.
BOOL IsKeyEvent(HANDLE hStdIn)

    INPUT_RECORD Record[128];
    DWORD dwRecordsRead = 0;
    BOOL fKeyPress = FALSE;

    if (ReadConsoleInput(hStdIn, Record, 128, &dwRecordsRead))
    
        for (DWORD i = 0; i < dwRecordsRead; i++)
        
            if (KEY_EVENT == Record[i].EventType)
            
                fKeyPress = TRUE;
                break;
            
        
    

    return fKeyPress;

普通用户无权读取安全日志。安全日志专为系统使用而设计。但是,如果用户被授予SE_SECURITY_NAME 权限(“管理审计和安全日志”用户权限),则用户可以读取和清除安全日志。

更新:

当我在事件回调中设置断点时,未来的事件也会被捕获,但控制台输出不会更新任何内容。按任意键退出后,控制台中出现了一些输入。所以我刷新了控制台输出缓冲区,然后解决问题。

在函数DWORD PrintEvent(EVT_HANDLE hEvent)


   ...
   wprintf(L"\n\n%s", pRenderedContent);
   fflush(stdout);
   ...

【讨论】:

但是当我将第二个参数作为 L" *[System[EventRecordID >RecordNo]]" 传递给 EvtSubscribe 时,我只会得到满足上述查询的旧事件,并且未捕获未来事件。跨度> @ARJ 这在 Windows 中似乎确实是一个错误。(至少没有记录在案)。我做了测试,它仅在使用EventRecordID + EvtSubscribeStartAtOldestRecord 调用EvtSubscribe 时发生。请参阅 msdn 上的 thread,使用 TimeCreated 代替确实有效。 @ARJ,我突然发现,在按任意键退出后,控制台中出现了一些输入。所以我在 wprintf(L"\n\n%s", pRenderedContent); 之后添加一个刷新,然后解决捕获问题。查看更新。

以上是关于事件查看器所有事件ID的含义的主要内容,如果未能解决你的问题,请参考以下文章

请大家帮忙解决事件查看器中的ID29和17的问题!!!!!

事件查看器事件ID部分说明

事件查看器常见ID代码解释

缺少事件查看器说明

Windows.old 事件查看器日志

服务器事件查看器里面全部是ANONYMOUS LOGON这个账户的登陆日志