c++怎么获取Windows日志的那个常规内容(不要详细内容)

求问c++怎么获取Windows日志的那个常规内容啊,就是日志提前后,想得到message,也就是那个常规内容

img

img


就是日志的这个内容

基于new bing的回答参考:
注意,在读取事件日志时需要管理员权限才能成功读取。如果以普通用户身份运行此代码,则没有足够的权限来访问事件日志。

#include <windows.h>
#include <iostream>
#include <string>

#pragma comment(lib, "advapi32")

// 这些宏定义了事件日志读取操作所需的常量值
#ifndef EVENTLOG_READ
#define EVENTLOG_READ 0x0001
#endif

#ifndef EVENTLOG_SEQUENTIAL_READ
#define EVENTLOG_SEQUENTIAL_READ 0x0001
#endif

// 这个函数用于从 Windows 事件日志中检索记录并将其打印到控制台
void GetWindowsEventLogs()
{
    HANDLE hEventLog; // 事件日志句柄
    LPCTSTR lpctstrServerName = NULL; // 服务器名称(为空表示本地计算机)
    LPCTSTR lpctstrLogName = TEXT("Application"); // 日志名称(这里使用应用程序日志)
    DWORD fdwAccess = EVENTLOG_READ | EVENTLOG_SEQUENTIAL_READ; // 访问事件日志的权限
    DWORD fdwFilter = EVENTLOG_BACKWARDS_READ | EVENTLOG_SEEK_READ; // 事件过滤器选项
    EVENTLOGRECORD *pevlr; // 事件日志记录指针
    char *pchBuffer; // 指向事件消息字符串的指针
    DWORD dwBytesRead; // 已读取的字节数
    DWORD dwBytesNeeded; // 储存事件记录大小所需的字节数
    DWORD dwCount; // 储存事件记录总数的变量

    // 打开事件日志并返回句柄
    hEventLog = OpenEventLog(lpctstrServerName, lpctstrLogName);

    if (hEventLog == NULL) // 如果无法连接到事件日志,则输出错误消息并退出函数
    {
        std::cout << "Cannot open event log" << std::endl;
        return;
    }

    // 获取事件日志中的记录总数,并将结果存储在 dwCount 变量中。
    if (!GetNumberOfEventLogRecords(hEventLog, &dwCount))
    {
        std::cout << "Cannot get the number of event log records" << std::endl;
        CloseEventLog(hEventLog);
        return;
    }

    // 为 EVENTLOGRECORD 结构分配内存
    pevlr = (EVENTLOGRECORD *)malloc(sizeof(EVENTLOGRECORD));

    // 迭代遍历事件日志,以获取每个事件的详细信息
    while (true)
    {
        // 从事件日志读取一条记录,并将其存储在 pevlr 指向的缓冲区中
        if (!ReadEventLog(hEventLog, fdwFilter, 0, pevlr, sizeof(EVENTLOGRECORD), &dwBytesRead, &dwBytesNeeded))
            break; // 如果不能读取事件,说明已经读取完毕

        // 为事件消息字符串分配内存
        pchBuffer = (char*)malloc(pevlr->Length);

        // 再次读取事件以获取事件消息字符串
        if (!ReadEventLog(hEventLog, fdwFilter, 0, pchBuffer, pevlr->Length, &dwBytesRead, &dwBytesNeeded))
        {
            // 如果不能读取事件消息字符串,则释放之前分配的内存并退出迭代循环
            free(pchBuffer);
            break;
        }

        // 将事件消息字符串转换为 std::string 对象
        EVENTLOGRECORD *pRecord = (EVENTLOGRECORD*)pchBuffer;
        std::string message((char*)((char*) pRecord + pRecord->StringOffset));

        // 输出包含事件详细信息的字符串
        std::cout << "Type: " << pRecord->EventType << ", Source: " << (char*)((char*) pRecord + sizeof(EVENTLOGRECORD)) << ", Message: " << message << std::endl;

        // 释放之前分配的内存
        free(pchBuffer);
    }

    // 释放 pevlr 指向的内存
    free(pevlr);

    // 关闭事件日志句柄
    CloseEventLog(hEventLog);
}

int main()
{
    // 调用 GetWindowsEventLogs 函数来检索和打印事件日志记录
    GetWindowsEventLogs();
    return 0;
}


  • 这篇博客: C++Windows.h基础教程1中的 3.Message 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:
  • Message翻译成中文的意思是消息盒子

    下面是最简单易懂的使用方法:

    MessageBox("这是一个最简单的消息框!");

    MessageBox("这是一个有标题的消息框!","标题"); 

    MessageBox("这是一个确定 取消的消息框!","标题", MB_OKCANCEL );

    MessageBox("这是一个两种属性的消息框!","标题",MB_ICONEXCLAMATION|MB_OKCANCEL );

    MessageBox("这是一个警告的消息框!","标题", MB_ICONEXCLAMATION );

    按钮的形式:

    MB_OKCANCEL 确定取消

    MB_YESNO 是否

    MB_YESNOCANCEL 是否取消 

    返回值:

    IDCANCEL 取消被选

    IDNO 否被选
    IDOK 确定被选
    IDYES 是被选 

  • 以下回答由chatgpt基于相关博客总结生成:

    对于获取Windows日志中的常规内容,可以使用Windows Event Log API来实现。具体步骤如下:

    1. 引入头文件和链接库:需要在代码中引入头文件evntlog.h和windows.h,并且需要链接库wevtapi.lib。

    2. 打开事件日志:调用OpenEventLog函数打开指定日志,例如可以使用Application或System等预定义的日志。

    HANDLE hEventLog = OpenEventLog(nullptr, L"Application");

    1. 读取事件日志:使用ReadEventLog函数读取事件日志。

    // 先确定要读取的日志起始位置和最大读取数量 DWORD dwReadFlags = EVENTLOG_BACKWARDS_READ | EVENTLOG_SEQUENTIAL_READ; DWORD dwRecordOffset = 0; DWORD dwBytesRead = 0; DWORD dwBytesNeeded = 0; EVENTLOGRECORD * pEventLogRecord = nullptr; while (ReadEventLog(hEventLog, dwReadFlags, dwRecordOffset, pEventLogRecord, 0, &dwBytesRead, &dwBytesNeeded)) { // 遍历读取到的事件记录 DWORD dwThisRecordOffset = 0; while (dwThisRecordOffset < dwBytesRead) { pEventLogRecord = (EVENTLOGRECORD *)((LPBYTE)pEventLogRecord + dwThisRecordOffset);

        // 处理事件记录
        // ...
    
        dwThisRecordOffset += pEventLogRecord->Length;
    }
    
    dwRecordOffset = pEventLogRecord->RecordNumber;
    if (dwBytesRead < dwBytesNeeded)
    {
        break;
    }
    

    }

    1. 关闭事件日志:使用CloseEventLog函数关闭事件日志。

    CloseEventLog(hEventLog);

    需要注意的是,上述步骤中涉及的类型和函数需要根据具体的实现进行调整,例如需要考虑日志过滤、处理事件记录等。同时还需要对事件日志中不同的事件类型和属性有一定的了解,才能更好地获取到需要的信息。

可以借鉴下

#include "stdafx.h"
#include <iostream>
 
using namespace std;
 
int execmd(char* cmd, char* result) {
    char buffer[128];                         // 缓冲区                        
    FILE* pipe = _popen(cmd, "r");            // 管道 
    
    // 管道打开失败
    if (!pipe){return 0;}
 
    // 检测管道中的结束符,0表示没有结束
    while(!feof(pipe)){
        // 从管道中读取数据
        if (fgets(buffer, 128, pipe)) {             
            // 拼接 char
            strcat(result, buffer);
        }
    }
 
    //关闭管道 
    _pclose(pipe);           
 
    return 1;                                 
}
 
int main()
{
    char result[0x7ffff] = "";        // 存放结果
    
    // 获取命令行返回值(保险起见这里获取 300 条日志信息)
    if (execmd("wevtutil qe System /c:300 /rd:true /f:text", result) == 1) {
        cout << result << endl;
    }
 
    // 查找关键数据
    string s = result;
    while ((s.find("igfx")) != -1) {
        cout << "找到了 igfx " << endl;
        break;
    }
 
    system("pause");   
    return 0;
}