C#与Windows 2000事件查看器的交互操作

cancersyf aspxcn.com 2002-09-02

假设你正在开发的标准的客户-服务器端应用程序需要在运行时访问 Windows 2000 附带的某些实用程序(比如事件查看器),那么请考虑如何让 C# 应用程序与微软视窗2000 内建的“事件查看器”(Event Viewer) 打交道。

有趣的是,微软 .NET 框架已经提供了相当多的类库和命名空间来完成上述高级编程任务。对许多高级语言来说,与 Windows 操作系统实用程序打交道实在太困难了。然而在 .NET 框架下的 C# 解决方案却是非常简单的,而且所生成的 .NET 应用程序也具备令人满意的稳定性。我们不妨从用户和管理员两个不同的角度来看看它的优势究竟在哪里。

用户:C# 应用程序能够监控自身产生的各种运行时错误和被激活的系统事件。它能把这些错误和事件以便于人类理解的日志文件形式记录下来。此时,用户只要点击一个按钮就能看到日志文件记录项的内容,却根本不知道程序已经调用执行了 Windows 2000 的事件查看器。此外,用户能在程序产生错误或者激活系统事件之后立即看到相应的日志文件记录项。

管理员:由 C# 等 .NET 高级语言开发的 GUI(图形用户界面) 前端应用程序不但能把管理员的自定义消息写入日志文件,而且能读取客户端上日志文件所记录的任何一条消息内容,并针对这些消息采取相应的对策;它还能把管理员的自定义消息发送到客户端并在客户端弹出相应的消息框;它还能以在文本框中显示日志文件记录项的内容。以上种种为管理员定制的特性都能在应用程序设计过程中根据需要加以取舍,例如:你可以在适当的时候赋予用户“可写”权限。

总之,C# 应用程序能让用户和管理员都能通过友好的人机界面直接与 Windows 2000 操作系统所附的各种实用程序进行交互操作。为了生成这样的应用程序,你至少应该安装 Windows 2000 操作系统和 .NET 框架 SDK 支持。为了编辑各种消息和记录文本,你完全可以使用 Windows 2000 的记事本;不过你也可以选择第三方文字处理软件,如 Antechinus C# Editor 等,因为后者不但能通过 Internet 轻松地下载得到,而且支持彩色代码、语法呈现等高级功能。

事件查看器是 Windows 2000 内建的实用小工具之一,人们通常称它“微软管理控制台插件”(MMC Snap-in) 。开启事件查看器的步骤是:“开始菜单-> 程序 -> 管理工具 -> 事件查看器” (译者注:或者“开始菜单 -> 设置 -> 控制面板 -> 管理工具 -> 事件查看器”)。事件查看器能帮助人们监控系统中各种软、硬件相关的信息,以及确认各种系统故障和程序错误。

图 1.1 事件查看器

举个例子:当你的 C# 程序产生了一个例外(即运行时错误)时,事件查看器就会把例外录制 (record) 下来,或者把它作为一个记录项写入“应用程序日志”中。此记录项所对应的事件类型是“信息” (Information);如果所产生的是系统错误,则记录项所对应的事件类型就是“错误”(Error)。读过本文,你就应该知道如何在 C# 语言程序中调用事件查看器来读取或写入日志文件记录项了。

写入事件日志记录项

借助微软 .NET 框架所提供的 System.Diagnostics 命名空间内的 EventLog 类,你可以调用事件查看器以读写日志文件记录项。EventLog 类提供了很多属性,比如:Source、Log、Close 和 WriteEntrywith 等,它们可以操纵事件查看器执行各种操作。清单 1.1 中的代码演示了如何在用户点击某个按钮时向事件日志文件新增和写入记录项:

清单 1.1:

//源代码文件: Eventwrite.cs 
//编译命令: csc Eventwrite.cs 
//运行方式: Eventwrite 
using System;
using System.Diagnostics;
using System.Windows.Forms;
using System.Drawing;

public class Eventwrite : Form
{
    Button b1 = new Button();

    public Eventwrite()
    {
        this.Text = "An Article for Developer.com by Anand";
        b1.Text = "Click here";
        b1.Click += new EventHandler(b1_click);
        b1.Location = new Point(100, 50);
        this.Controls.Add(b1);
    }

    public void b1_click(object sender, EventArgs e)
    {
        //此处生成一个 EventLog 类实例。 
        EventLog elog = new EventLog();
        elog.Log = "Application";
        elog.Source = "From Developer.com article";
        elog.WriteEntry("Hello, I'm from C#");
        elog.Close();
        MessageBox.Show("One message successfully written to EventViewer",
        "Anand.N");
    }

    public static void Main()
    {
        Application.Run(new Eventwrite());
    }
}

编译运行这段代码,你将看到如图 1.2 所示的窗体输出:

图 1.2 - Eventwrite.cs 的运行结果

点击窗体中的按钮,程序将开启事件查看器。此时你就可以在 Source 一栏中看到日志记录项 “From Developer.comarticle” 。现在按右键单击该记录项,在弹出菜单中选择 “属性”(properties),则你将在“事件详细信息”(Information Properties) 对话框中的“描述”(Description) 文本框内看到该消息的具体内容“Hello, I'm from C#” (图 1.3).

图 1.3 – 事件查看器的属性

读取事件日志记录项

同样地,你也可以使用 EventLog 类读取事件日志文件中的记录项,不过你得用一个 For 循环反复操作同一变量来指示代码将通过事件查看器读取多少条记录项。清单 1.2 中的代码演示了如何读取 5 条事件日志记录项,并将它们依次显示在消息框中。

清单 1.2:

//源代码文件:Eventread.cs 
//编译命令:csc Eventread.cs 
//运行方式:Eventread 

using System;
using System.Diagnostics;
using System.Windows.Forms;
using System.Drawing;

public class Eventread : Form
{
    Button b1 = new Button();

    public Eventread()
    {
        this.Text = "An Article for Developer.com by Anand";
        b1.Text = "Click here";
        b1.Click += new EventHandler(b1_click);
        b1.Location = new Point(100, 50);
        this.Controls.Add(b1);
    }

    public void b1_click(object sender, EventArgs e)
    {
        EventLog elog = new EventLog();
        elog.Log = "Application";
        elog.Source = "From Developer.com article";

        for (int i = 0; i < 5; i++)
        {
            try
            {
                MessageBox.Show("Message: " + elog.Entries[i].Message + "\n" +
                    "App: " + elog.Entries[i].Source + "\n" +
                    "Entry type: " + elog.Entries[i].EntryType);
            }
            catch { }
        }
    }

    public static void Main()
    {
        Application.Run(new Eventread());
    }
}

代码中的 Entries 是EventLog 类的属性之一,其功能是返回 EventLog.EventLogEntryCollection 类的一个实例。 EventLog.EventLogEntryCollection 类将根据事件日志文件中的每个记录项定义一系列 EventLogEntry 类型。本范例代码定义了 3 种类型以读取日志记录项。尚未定义的类型包括UserName 、TimeGenrated 、TimeWritten 等等。你可以尝试把它们的定义语句加入代码中,然后观察程序的运行结果有什么不同。

Contributors: FHL