由于SecurityException,无法读取事件日志

时间:2013-09-19 13:25:39

标签: c# .net windows security registry

我正在为我的webapp写一个小dll。我正在监控一项服务,我有一个网页,显示服务是否正在运行,停止或其他什么。所以我想获得此服务记录的EventLog的最后10个条目。但是当我正在做的时候,我在调用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为大家提供帮助

1 个答案:

答案 0 :(得分:3)

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

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

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Eventlog\Security

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

您不能只跳过Security文件夹并查看Application。来自documentation

  

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

Further reading和另一个相关的引用:

  

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