如何使用ReadEventLog获取完整日志描述
答案:2 悬赏:0 手机版
解决时间 2021-02-08 22:18
- 提问者网友:ミ烙印ゝ
- 2021-02-07 21:58
如何使用ReadEventLog获取完整日志描述
最佳答案
- 五星知识达人网友:青灯有味
- 2021-02-07 23:18
//************************************************************************************
// * 函数名称: StartEventLog
// * 功 能: 启动读取事件日志
// * 入口参数: eventLogSourceName 事件名
// * 返 回 值: 无
// * 备 注:
//************************************************************************************
BOOL CSys_ReadInfo::StartEventLog()
{
// 打开事件日志
m_hSysInfo = OpenEventLog(NULL,m_eventLogSourceName);
if (NULL == m_hSysInfo)
{
return FALSE;
}
// 读取系统事件日志信息
if(!ReadSystemEventInfo()){return FALSE;}
// 关于事件日志句柄
CloseEventLog(m_hSysInfo);
return TRUE;
}
//************************************************************************************
// * 函数名称: ReadSystemEventInfo
// * 功 能: 读取系统事件查看器信息
// * 入口参数: HWND hwnd
// * 返 回 值: 无
// * 备 注:
//************************************************************************************
BOOL CSys_ReadInfo::ReadSystemEventInfo()
{
setlocale(LC_ALL,"Chinese-simplified"); // 设置当前的场景为简体中文
ASSERT(m_hSysInfo != NULL);
::SendMessage(m_Mainhwnd,WM_DELETELIST,0,0);// 清空列表
g_SysEventInfo.clear(); // 清空链表所有元素
DWORD read_len; // 读取信息条数
DWORD next_len; // 下一条信息
char Data[BUFFER_SIZE]; // 事件查看器信息
CTime time; // 系统日期时间
int iNum = 0;
tagSystemEventLogInfo tagSysEventLogInfo; // 系统事件日志测点
try
{
while(ReadEventLog(m_hSysInfo,
EVENTLOG_FORWARDS_READ | // 向前读
EVENTLOG_SEQUENTIAL_READ, // 循序读
0,Data,sizeof(Data),&read_len,&next_len))
{
for (unsigned int i = 0; i < read_len;)
{
EVENTLOGRECORD *ptr = (EVENTLOGRECORD *)(Data + i);
// 类型状态
int iEventType = GetCateGory(ptr->EventType);
UINT uOffset = 0; // 偏移量
uOffset = sizeof(EVENTLOGRECORD);
// 类型
tagSysEventLogInfo.Sys_EventType = iEventType;
tagSysEventLogInfo.Sys_EventCategory = m_strEventCategory;
// 日期
time_t tm(ptr->TimeWritten);
time = (CTime)tm;
tagSysEventLogInfo.Sys_EventDate.Format("%.4d-%.2d-%.2d",time.GetYear(),time.GetMonth(),time.GetDay());
// 时间
tagSysEventLogInfo.Sys_EventTime.Format("%.2d:%.2d:%.2d",time.GetHour(),time.GetMinute(),time.GetSecond());
// 事件ID
tagSysEventLogInfo.Sys_EventID.Format("%u",(short)ptr->EventID);
// 事件来源
tagSysEventLogInfo.Sys_EventSource.Format("%s",(LPTSTR)(LPBYTE)ptr + uOffset);
uOffset += strlen(tagSysEventLogInfo.Sys_EventSource) + sizeof(TCHAR);
// 计算机
tagSysEventLogInfo.Sys_ComputerName.Format("%s",(LPTSTR)(LPBYTE)ptr + uOffset);
uOffset += strlen(tagSysEventLogInfo.Sys_ComputerName) + sizeof(TCHAR);
// 用户
if (ptr->UserSidLength > 0)
{
TCHAR lpszRefDomainName[MAX_PATH + 1];
TCHAR lpszUserName[MAX_PATH + 1];
SID_NAME_USE _SidNameUse = (SID_NAME_USE)(SidTypeUser - 1);
PSID pUserSID = 0;
DWORD cbName;
DWORD cbRefDomainName;
BOOL bRetVal = FALSE;
pUserSID = (SID *)GlobalAlloc(GPTR,ptr->UserSidLength);
memcpy(pUserSID,(PSID)((LPBYTE)ptr + ptr->UserSidOffset),ptr->UserSidLength);
cbName = cbRefDomainName = MAX_PATH + 1;
*lpszRefDomainName = *lpszUserName = '\0';
bRetVal = LookupAccountSid(0,pUserSID,lpszUserName,&cbName,lpszRefDomainName,
&cbRefDomainName,&_SidNameUse);
if (bRetVal)
{
tagSysEventLogInfo.Sys_ComputerUser.Format("%s",lpszUserName);
}
else
{
tagSysEventLogInfo.Sys_ComputerUser = "N/A";
}
SafeDeletePointer(pUserSID,ptr->UserSidLength);
}
else
{
tagSysEventLogInfo.Sys_ComputerUser = "N/A";
}
// 描述
UINT uSize = 0; // 文本大小
UINT uStringOffset; // 描述偏移量
uStringOffset = ptr->StringOffset;
uSize = ptr->DataOffset - ptr->StringOffset;
if (uSize > 0)
{
LPBYTE pStrings = 0; // 记录事件
TCHAR *szExpandedString = 0; // 描述文本
UINT uStepOfString = 0; // 偏移量
pStrings = (LPBYTE)GlobalAlloc(GPTR,uSize * sizeof(BYTE) + 1);
memcpy(pStrings,(TCHAR *)ptr + uStringOffset,uSize);
pStrings[uSize] = '\0';
uStepOfString = 0;
szExpandedString = (TCHAR *)GlobalAlloc(GPTR,(uSize + MAX_MSG_LENGTH) * sizeof(TCHAR) + 1);
for (int i = 0; i < ptr->NumStrings; i++)
{
if (i == 0)
{
strcpy(szExpandedString,(TCHAR *)pStrings + uStepOfString);
if (i < (UINT)ptr->NumStrings - 1)
{
strcat(szExpandedString,",");
}
}
else
{
strcat(szExpandedString,(TCHAR *)pStrings + uStepOfString);
}
uStepOfString = strlen((TCHAR *)pStrings + uStepOfString) + 1;
}
tagSysEventLogInfo.Sys_EventDesc.Format("%s",szExpandedString);
SafeDeletePointer(szExpandedString,uSize * sizeof(BYTE) + 1);
SafeDeletePointer(pStrings,(uSize + MAX_MSG_LENGTH) * sizeof(TCHAR) + 1);
}
// 数据
tagSysEventLogInfo.Sys_EventData.Format("%s",(LPBYTE)((LPBYTE)ptr + ptr->DataOffset),ptr->DataLength);
//---
// 组织结构
// 类型+日期+时间+事件ID+事件来源+计算机名+用户+描述+数据
//---
char Buffer[BUFFER_SIZE]; // 数据存储缓存
sprintf(Buffer,"%d|%s|%s|%s|%s|%s|%s|%s|%s",
tagSysEventLogInfo.Sys_EventType,
tagSysEventLogInfo.Sys_EventDate,
tagSysEventLogInfo.Sys_EventTime,
tagSysEventLogInfo.Sys_EventID,
tagSysEventLogInfo.Sys_EventSource,
tagSysEventLogInfo.Sys_ComputerName,
tagSysEventLogInfo.Sys_ComputerUser,
tagSysEventLogInfo.Sys_EventDesc,
tagSysEventLogInfo.Sys_EventData);
::SendMessage(m_Mainhwnd,WM_SYSTEMINFO,0,(LPARAM)(LPCTSTR)Buffer);
i += ptr->Length;
g_SysEventInfo.push_back(tagSysEventLogInfo);
}
}
return TRUE;
}
catch(...)
{
throw 1001;
return FALSE;
}
}
// * 函数名称: StartEventLog
// * 功 能: 启动读取事件日志
// * 入口参数: eventLogSourceName 事件名
// * 返 回 值: 无
// * 备 注:
//************************************************************************************
BOOL CSys_ReadInfo::StartEventLog()
{
// 打开事件日志
m_hSysInfo = OpenEventLog(NULL,m_eventLogSourceName);
if (NULL == m_hSysInfo)
{
return FALSE;
}
// 读取系统事件日志信息
if(!ReadSystemEventInfo()){return FALSE;}
// 关于事件日志句柄
CloseEventLog(m_hSysInfo);
return TRUE;
}
//************************************************************************************
// * 函数名称: ReadSystemEventInfo
// * 功 能: 读取系统事件查看器信息
// * 入口参数: HWND hwnd
// * 返 回 值: 无
// * 备 注:
//************************************************************************************
BOOL CSys_ReadInfo::ReadSystemEventInfo()
{
setlocale(LC_ALL,"Chinese-simplified"); // 设置当前的场景为简体中文
ASSERT(m_hSysInfo != NULL);
::SendMessage(m_Mainhwnd,WM_DELETELIST,0,0);// 清空列表
g_SysEventInfo.clear(); // 清空链表所有元素
DWORD read_len; // 读取信息条数
DWORD next_len; // 下一条信息
char Data[BUFFER_SIZE]; // 事件查看器信息
CTime time; // 系统日期时间
int iNum = 0;
tagSystemEventLogInfo tagSysEventLogInfo; // 系统事件日志测点
try
{
while(ReadEventLog(m_hSysInfo,
EVENTLOG_FORWARDS_READ | // 向前读
EVENTLOG_SEQUENTIAL_READ, // 循序读
0,Data,sizeof(Data),&read_len,&next_len))
{
for (unsigned int i = 0; i < read_len;)
{
EVENTLOGRECORD *ptr = (EVENTLOGRECORD *)(Data + i);
// 类型状态
int iEventType = GetCateGory(ptr->EventType);
UINT uOffset = 0; // 偏移量
uOffset = sizeof(EVENTLOGRECORD);
// 类型
tagSysEventLogInfo.Sys_EventType = iEventType;
tagSysEventLogInfo.Sys_EventCategory = m_strEventCategory;
// 日期
time_t tm(ptr->TimeWritten);
time = (CTime)tm;
tagSysEventLogInfo.Sys_EventDate.Format("%.4d-%.2d-%.2d",time.GetYear(),time.GetMonth(),time.GetDay());
// 时间
tagSysEventLogInfo.Sys_EventTime.Format("%.2d:%.2d:%.2d",time.GetHour(),time.GetMinute(),time.GetSecond());
// 事件ID
tagSysEventLogInfo.Sys_EventID.Format("%u",(short)ptr->EventID);
// 事件来源
tagSysEventLogInfo.Sys_EventSource.Format("%s",(LPTSTR)(LPBYTE)ptr + uOffset);
uOffset += strlen(tagSysEventLogInfo.Sys_EventSource) + sizeof(TCHAR);
// 计算机
tagSysEventLogInfo.Sys_ComputerName.Format("%s",(LPTSTR)(LPBYTE)ptr + uOffset);
uOffset += strlen(tagSysEventLogInfo.Sys_ComputerName) + sizeof(TCHAR);
// 用户
if (ptr->UserSidLength > 0)
{
TCHAR lpszRefDomainName[MAX_PATH + 1];
TCHAR lpszUserName[MAX_PATH + 1];
SID_NAME_USE _SidNameUse = (SID_NAME_USE)(SidTypeUser - 1);
PSID pUserSID = 0;
DWORD cbName;
DWORD cbRefDomainName;
BOOL bRetVal = FALSE;
pUserSID = (SID *)GlobalAlloc(GPTR,ptr->UserSidLength);
memcpy(pUserSID,(PSID)((LPBYTE)ptr + ptr->UserSidOffset),ptr->UserSidLength);
cbName = cbRefDomainName = MAX_PATH + 1;
*lpszRefDomainName = *lpszUserName = '\0';
bRetVal = LookupAccountSid(0,pUserSID,lpszUserName,&cbName,lpszRefDomainName,
&cbRefDomainName,&_SidNameUse);
if (bRetVal)
{
tagSysEventLogInfo.Sys_ComputerUser.Format("%s",lpszUserName);
}
else
{
tagSysEventLogInfo.Sys_ComputerUser = "N/A";
}
SafeDeletePointer(pUserSID,ptr->UserSidLength);
}
else
{
tagSysEventLogInfo.Sys_ComputerUser = "N/A";
}
// 描述
UINT uSize = 0; // 文本大小
UINT uStringOffset; // 描述偏移量
uStringOffset = ptr->StringOffset;
uSize = ptr->DataOffset - ptr->StringOffset;
if (uSize > 0)
{
LPBYTE pStrings = 0; // 记录事件
TCHAR *szExpandedString = 0; // 描述文本
UINT uStepOfString = 0; // 偏移量
pStrings = (LPBYTE)GlobalAlloc(GPTR,uSize * sizeof(BYTE) + 1);
memcpy(pStrings,(TCHAR *)ptr + uStringOffset,uSize);
pStrings[uSize] = '\0';
uStepOfString = 0;
szExpandedString = (TCHAR *)GlobalAlloc(GPTR,(uSize + MAX_MSG_LENGTH) * sizeof(TCHAR) + 1);
for (int i = 0; i < ptr->NumStrings; i++)
{
if (i == 0)
{
strcpy(szExpandedString,(TCHAR *)pStrings + uStepOfString);
if (i < (UINT)ptr->NumStrings - 1)
{
strcat(szExpandedString,",");
}
}
else
{
strcat(szExpandedString,(TCHAR *)pStrings + uStepOfString);
}
uStepOfString = strlen((TCHAR *)pStrings + uStepOfString) + 1;
}
tagSysEventLogInfo.Sys_EventDesc.Format("%s",szExpandedString);
SafeDeletePointer(szExpandedString,uSize * sizeof(BYTE) + 1);
SafeDeletePointer(pStrings,(uSize + MAX_MSG_LENGTH) * sizeof(TCHAR) + 1);
}
// 数据
tagSysEventLogInfo.Sys_EventData.Format("%s",(LPBYTE)((LPBYTE)ptr + ptr->DataOffset),ptr->DataLength);
//---
// 组织结构
// 类型+日期+时间+事件ID+事件来源+计算机名+用户+描述+数据
//---
char Buffer[BUFFER_SIZE]; // 数据存储缓存
sprintf(Buffer,"%d|%s|%s|%s|%s|%s|%s|%s|%s",
tagSysEventLogInfo.Sys_EventType,
tagSysEventLogInfo.Sys_EventDate,
tagSysEventLogInfo.Sys_EventTime,
tagSysEventLogInfo.Sys_EventID,
tagSysEventLogInfo.Sys_EventSource,
tagSysEventLogInfo.Sys_ComputerName,
tagSysEventLogInfo.Sys_ComputerUser,
tagSysEventLogInfo.Sys_EventDesc,
tagSysEventLogInfo.Sys_EventData);
::SendMessage(m_Mainhwnd,WM_SYSTEMINFO,0,(LPARAM)(LPCTSTR)Buffer);
i += ptr->Length;
g_SysEventInfo.push_back(tagSysEventLogInfo);
}
}
return TRUE;
}
catch(...)
{
throw 1001;
return FALSE;
}
}
全部回答
- 1楼网友:神也偏爱
- 2021-02-07 23:46
这个请你放心,event log只是系统日志,包括你系统启动以来所发生的任何重要事件的一个log记录 禁用没有关系,但是不太建议你禁用,毕竟这个服务并不占资源,而你电脑出问题的话可以从中查找原因
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
推荐资讯