求问c++怎么获取Windows日志的那个常规内容啊,就是日志提前后,想得到message,也就是那个常规内容
基于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;
}
Message翻译成中文的意思是消息盒子
下面是最简单易懂的使用方法:
MessageBox("这是一个最简单的消息框!");
MessageBox("这是一个有标题的消息框!","标题");
MessageBox("这是一个确定 取消的消息框!","标题", MB_OKCANCEL );
MessageBox("这是一个两种属性的消息框!","标题",MB_ICONEXCLAMATION|MB_OKCANCEL );
MessageBox("这是一个警告的消息框!","标题", MB_ICONEXCLAMATION );
按钮的形式:
MB_OKCANCEL 确定取消
MB_YESNO 是否
MB_YESNOCANCEL 是否取消
返回值:
IDCANCEL 取消被选
IDNO 否被选
IDOK 确定被选
IDYES 是被选
对于获取Windows日志中的常规内容,可以使用Windows Event Log API来实现。具体步骤如下:
引入头文件和链接库:需要在代码中引入头文件evntlog.h和windows.h,并且需要链接库wevtapi.lib。
打开事件日志:调用OpenEventLog函数打开指定日志,例如可以使用Application或System等预定义的日志。
HANDLE hEventLog = OpenEventLog(nullptr, L"Application");
// 先确定要读取的日志起始位置和最大读取数量 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;
}
}
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;
}