我们使用以下.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的描述"错误消息是否包含在条目中?
答案 0 :(得分:2)
在这种情况下,似乎无法正常工作的应用程序使用REG_SZ注册表类型的EventMessageFile而不是REG_SZ_EXPAND注册表类型(在返回值之前将%SystemRoot%扩展为c:\ Windows)。
REG_SZ_EXPAND is the required type,但在我们的情况下,由于bug
中的winsvc/eventlog go package,这些仅使用REG_SZ进行了注册删除并重新创建具有正确类型的EventMessageFile键后,它开始按预期工作。