使用EntryWrittenEventHandler访问事件消息时的“事件ID的描述”

时间:2015-03-18 19:02:04

标签: .net event-log

我们使用以下.NET 4.5代码捕获创建时的事件日志条目:

var log = new EventLog("Application");
log.EnableRaisingEvents = true;
log.EntryWritten += new EntryWrittenEventHandler(OnEntryWritten);

// Define other methods and classes here
protected static void OnEntryWritten(object source, EntryWrittenEventArgs evt)
{
    var e = evt.Entry;
    var v = new
    {
        EntryType = e.EntryType,
        Index = e.Index,
        InstanceId = e.InstanceId,
        MachineName = e.MachineName,
        Message = e.Message,
        Source = e.Source,
        TimeGenerated = e.TimeGenerated.ToUniversalTime(),
        TimeWritten = e.TimeWritten.ToUniversalTime(),
        UserName = e.UserName,
    };
    v.Dump(); //Testing in LinqPad
}

但是条目显示以下内容作为其消息:

  

事件ID' 1903'在源' HHCTRL'不可能是   找到。本地计算机可能没有必要的注册表   用于显示消息的信息或消息DLL文件,或者您可以   没有权限访问它们。以下信息是其中的一部分   事件:' http://go.microsoft.com/fwlink?LinkID=45839'

  

事件ID' 1'在Source' scollector'不可能是   找到。本地计算机可能没有必要的注册表   用于显示消息的信息或消息DLL文件,或者您可以   没有权限访问它们。以下信息是其中的一部分   事件:' service_windows.go:194:scollector服务已停止'

这些消息在事件查看器中正确显示(没有关于描述的错误),当我在Powershell中使用get-winevent -LogName Application -MaxEvents 10查看它们时,它们也显示正确。

我尝试添加以下PermissionSet以确保我可以访问事件日志,但它仍然无效。

PermissionSet ps = new PermissionSet(PermissionState.Unrestricted);
ps.AddPermission(new RegistryPermission(RegistryPermissionAccess.AllAccess, System.Environment.MachineName));
ps.AddPermission(new EventLogPermission(EventLogPermissionAccess.Administer, System.Environment.MachineName));
ps.Demand();

服务(或我们测试时的LinqPad)以管理员身份运行,我确认存在HKLM\SYSTEM\CurrentControlSet\Services\EventLog\Application\scollector\EventMessageFile注册表项(我们的自定义服务只使用%SystemRoot%\System32\EventCreate.exe,因此所有邮件格式都只是% 1)。我们需要做些什么来防止"事件ID的描述"错误消息是否包含在条目中?

1 个答案:

答案 0 :(得分:2)

在这种情况下,似乎无法正常工作的应用程序使用REG_SZ注册表类型的EventMessageFile而不是REG_SZ_EXPAND注册表类型(在返回值之前将%SystemRoot%扩展为c:\ Windows)。

EventMessageFile

REG_SZ_EXPAND is the required type,但在我们的情况下,由于bug

中的winsvc/eventlog go package,这些仅使用REG_SZ进行了注册

删除并重新创建具有正确类型的EventMessageFile键后,它开始按预期工作。