如何使用ReadEventLog获取完整日志描述?

silver307 2009-10-09 11:00:03
目前程序读取的日志描述:
1.中文字体有些读不出来
2.中文字体有些显示为乱码

实现功能:
例1:描述的网址前面有很多的中文描述,但没有读出
序号:1
日期:2009-09-29
时间:15:52:33
类型:信息
来源:HHCTRL
事件:1904
计算机:SILVER28
用户:N/A
描述:
http://cn.bing.com/search?q=EVENTLOGRECORD&go=&form=QBRE&filt=all,http://go.microsoft.com/fwlink?LinkID=45840

例2:读取的中文字体比较乱
序号:221
日期:2009-09-28
时间:11:47:05
类型:成功审核
来源:Security
事件:850
计算机:SILVER28
用户:SYSTEM
描述:
本地策略,标准呗圆呗赃略策略呗圆呗?


准备使用Unicode字体库,但程序已写完,改动比较大,不知道有没有写过类似功能的朋友告解一二呀
...全文
977 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
qq_42344518 2021-07-21
  • 打赏
  • 举报
回复

楼主有没有完整的代码

yf1311 2012-02-09
  • 打赏
  • 举报
回复
不知道楼主 最后是用什么方法做出来的 难道真的要用Unicode?
gyrilyuuu 2011-05-25
  • 打赏
  • 举报
回复
Mark
MoXiaoRab 2009-10-09
  • 打赏
  • 举报
回复
代码好多...
MSDN参考过了吗?
silver307 2009-10-09
  • 打赏
  • 举报
回复
我全部贴出吧

//************************************************************************************
// * 函数名称: 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;
}
}
silver307 2009-10-09
  • 打赏
  • 举报
回复
while(ReadEventLog(m_hSysInfo,
EVENTLOG_FORWARDS_READ | // 向前读
EVENTLOG_SEQUENTIAL_READ, // 循序读
0,Data,sizeof(Data),&read_len,&next_len))
{}

有用,上面是其中读取描述部分的代码
MoXiaoRab 2009-10-09
  • 打赏
  • 举报
回复
原来是这样解析。问什么不使用日志的操作API呢?
silver307 2009-10-09
  • 打赏
  • 举报
回复
// 描述
UINT uSize = 0; // 文本大小
UINT uStringOffset; // 描述偏移量
uStringOffset = ptr->StringOffset;
uSize = ptr->DataOffset - ptr->StringOffset;
if (uSize > 0)
{
LPBYTE pStrings = 0; // 记录事件ID
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);
}
MoXiaoRab 2009-10-09
  • 打赏
  • 举报
回复
你怎么读的?列点代码看看

2,640

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 硬件/系统
社区管理员
  • 硬件/系统社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧