2

我正在为我的 webapp 编写一个小 dll。我正在监控一项服务,我有一个网页显示服务是否正在运行、停止或其他。所以我想获取此服务记录的最后 10 个 EventLog 条目。但是当我这样做时,我在调用时遇到异常ToArray()。我应该怎么办?

    public static IEnumerable<EventLogEntry> GetEventLogs(string serviceName)
    {
        if (!EventLog.SourceExists(serviceName))
            throw new ArgumentException("Service not found", "serviceName");
        var myLog = new EventLog { Source = "MySource" };

        var entries = myLog.Entries;
        return (from EventLogEntry entry in entries
                where entry.Source == serviceName
                select entry).ToArray();
    }

所以EventLog.SourceExists(serviceName)返回true,但在失败之后。

遍历Security文件夹时失败,但我Application只需要



解决了

但是,我可以从指定的文件夹中读取,这很有趣。这取决于类的Log属性EventLog。所以我应该简单地用这个替换一行

var myLog = new EventLog {Source = "MySource", Log = "Application"};

另一个笑话是它有时会起作用。有时不会。例如,此代码适用于我的服务,但netprofm服务失败。tnx 帮助大家

4

1 回答 1

4

您需要具有管理员权限才能读取事件日志。你是否以管理员身份运行?

您还可以在注册表中修改对此的权限:

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Eventlog\Security

右键单击该条目,选择权限,并确保您具有访问权限。

您不能只跳过安全文件夹而只查看应用程序。从文档中:

要在 Windows Vista 和更高版本或 Windows Server 2003 中搜索事件源,您必须具有管理权限。此要求的原因是必须搜索所有事件日志,包括安全性,以确定事件源是否唯一。从 Windows Vista 开始,用户无权访问安全日志;因此,会引发 SecurityException。

进一步阅读和另一个相关引用:

仅从日志中读取时无需指定 Source。您只能为 EventLog 实例指定日志名称和 MachineName(服务器计算机名称)属性。

于 2013-09-19T13:38:15.963 回答