由于安全异常,无法读取事件日志

本文关键字:读取 事件 日志 异常 于安全 安全 | 更新日期: 2023-09-27 18:31:54

我正在为我的网络应用程序编写一个小dll。我正在监视一项服务,我有一个网页,显示服务是否正在运行、已停止或其他内容。所以我想让这个服务记录的事件日志的最后 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



解决

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

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

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

由于安全异常,无法读取事件日志

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

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

HKEY_LOCAL_MACHINE'SYSTEM'CurrentControlSet'Services'Eventlog'Security

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

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

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

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

仅从日志读取时,无需指定源。只能指定 EventLog 实例的"日志名称"和"计算机名称(服务器计算机名称)"属性。