我正在为我的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为大家提供帮助
答案 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 (服务器计算机名称)属性。