用托管C++监视Windows事件日志
随着病毒、流氓软件、广告软件等数量的增加。,许多人开始使用注册表监视器。这些监视器通常会弹出一个警告窗口,提示用户在安装软件时修改注册表。然而,当涉及到安全问题时,经常被忽略的地方是Windows事件日志——尤其是安全日志,它通常记录Windows操作系统和关键系统应用程序的操作,如非法登录尝试、端口扫描和其他与安全相关的事件。
本文将演示如何在应用程序中监控Windows事件日志。当然,程序可以扩展,比如当事件日志记录了特定的事件类型时,发送电子邮件通知用户。
使用。用于监控的网络事件日志
本文中的代码使用。NET 1.0/1.1托管C++语法。如果使用的是更高版本的。您需要在“项目属性”对话框中设置/clr:oldSyntax编译选项,或者调整以下代码以符合新的托管语法。
钥匙。用于Windows事件日志的. NET类型是Diagnostics::EventLog类。
1.定义一个托管类并实现事件日志通知处理程序。
当引发“新事件日志条目”事件时,将调用处理程序(OnNewLogEntry)。同时,请注意这里的EntryWrittenEventHandler。以下是示例代码:
//监视新事件日志条目的示例代码
_ _ GC类NewLogentryEventHandler
{
Public:
NewLogentryEventHandler(){ }
Public:
VoidnewLogEntry(object * sender,entrywritneventargs * e)
{
/获取并处理最近创建的条目
eventlog entry * entry = e-> entry;
}
};
2.实例化一个EventLog对象并将其EnableRaisingEvents属性设置为true。
属性EventLog::EnableRaisingEvents是一个布尔类型,它控制在向EventLog对象指定的日志中添加项目时是否引发事件:
EventLog* log = new EventLog("应用");
log-> EnableRaisingEvents = true
3.将事件处理程序连接到“新事件日志条目”事件。
首先,实例化定义事件处理程序的对象(在本例中为NewLogEntryEventHandler),然后将事件方法(OnNewLogEntry)添加到EventLog::EntryWritten的事件处理程序列表中:
NewLogEntryEventHandler * handler = new NewLogEntryEventHandler();
log-> entry written+=
new EntryWrittenEventHandler(处理程序,& NewLogEntryEventHandler::OnNewLogEntry);
4.编写处理特定事件的代码。
回顾OnNewLogEntry方法,您可以看到传递给事件处理程序的EntryWrittenEventArgs对象有一个名为EventLogEntry的成员,它包含有关记录项的详细信息,特别是以下属性:
MachineName -创建事件日志的计算机系统的名称。
Source -创建此事件的事件源或程序源。
消息-用户可以在事件查看器中阅读该文本值,它描述了记录的事件。
事件类型-该值(表示EventLogEntryType)是一个枚举值,表示记录的事件类型:信息(默认)、警告、错误、审核成功和审核失败。
事件ID -特定于事件程序的编号。
数据——这个值通常用于存储二进制信息,比如内存转储,它也与事件有关。
缺点
从上面可以看出,。NET使得访问事件日志变得非常简单。但是,在处理事件日志时有一些限制:
只能在本地系统上监视事件。
的。NET文档没有说明如果短时间内记录了大量事件,是否能保证每个事件都能被触发。
如果监控频繁更新的事件日志,事件可能不会立即触发,事件项之间可能会有滞后,然后突然大量的事件通知会进入消息队列。
位律师回复
0条评论