由于安全异常,无法读取事件日志
本文关键字:读取 事件 日志 异常 于安全 安全 | 更新日期: 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
解决
但是,有趣的是,我可以从指定的文件夹中读取。这取决于EventLog
类Log
属性。所以我应该简单地用这个替换一行
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 实例的"日志名称"和"计算机名称(服务器计算机名称)"属性。