如何在C#中获取所有Windows事件日志(事件查看器日志)及其层次结构和友好名称的列表
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了如何在C#中获取所有Windows事件日志(事件查看器日志)及其层次结构和友好名称的列表,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2723字,纯文字阅读大概需要4分钟。
内容图文
我正在尝试从事件查看器中复制以下内容
我遇到了一些问题.首先,我得到的一些名字不是显示名称或友好名称.例如,对于“Microsoft Office Alerts”,我只是回到“OAlerts”.如何从“OAlerts”获得完整的“Microsoft Office Alerts”?
第二个问题是弄清楚层次结构.似乎所有我能做的就是解析破折号并进行某种最好的猜测.在API中似乎没有一种简单的方法可以解决这个问题. GetLogNames只为您提供所有日志的平面列表
EventLogSession session = new EventLogSession();
List<string> logNames = new List<string>(session.GetLogNames());
foreach (string name in logNames)
{
//EventLogConfiguration config = new EventLogConfiguration(name); //looks useful but doesn't give me any of the info i'm looking for.
Console.WriteLine(name);
}
解决方法:
这篇博客:The EventSource NuGet package and support for the Windows Event Log (Channel Support)有一个链接到一个罕见的EventSource User’s Guide文件,其中说明了这一点:
Do use the EventSourceAttribute’s Name property to provide a
descriptive, qualified name for the ETW event provider represented by
your event source. The default is the short name of your event source
type, which can easily lead to collisions, as ETW provider names share
one machine-wide namespace. An example of a good provider name
“<CompanyName>-<Product>-<Component>
”. Following this 3-element
convention will ensure Event Viewer displays your event logs in a
logical folder hierarchy:“Application and Services
”.
Logs/<CompanyName>/<Product>/<Component>
这往往表明破折号更像是一种惯例而不是严格的要求(所以我相信你可以自己解析它).请注意,博客仍然可以发表评论.
对于不匹配的名称,有一个未记录的EvtIntGetClassicLogDisplayName函数可以获取事件查看器中显示的名称.以下是如何将它与会话和日志名称一起使用:
static void Main(string[] args)
{
var session = new EventLogSession();
foreach (string name in session.GetLogNames())
{
Console.WriteLine(GetDisplayName(session, name));
}
}
这里是支持代码(因为它没有文档,使用风险自负,加上它似乎主要用于这个’OAlert’条目,所以我不确定它是否值得):
public static string GetDisplayName(EventLogSession session, string logName)
{
var sb = new StringBuilder(512);
int bufferUsed = 0;
if (EvtIntGetClassicLogDisplayName(GetSessionHandle(session).DangerousGetHandle(), logName, 0, 0, sb.Capacity, sb, out bufferUsed))
return sb.ToString();
return logName;
}
private static SafeHandle GetSessionHandle(EventLogSession session)
{
return (SafeHandle)session.GetType().GetProperty("Handle", BindingFlags.Instance | BindingFlags.NonPublic).GetValue(session);
}
[DllImport("wevtapi.dll", CharSet = CharSet.Unicode)]
private static extern bool EvtIntGetClassicLogDisplayName(IntPtr session, [MarshalAs(UnmanagedType.LPWStr)] string logName, int locale, int flags, int bufferSize, [MarshalAs(UnmanagedType.LPWStr)] StringBuilder displayName, out int bufferUsed);
内容总结
以上是互联网集市为您收集整理的如何在C#中获取所有Windows事件日志(事件查看器日志)及其层次结构和友好名称的列表全部内容,希望文章能够帮你解决如何在C#中获取所有Windows事件日志(事件查看器日志)及其层次结构和友好名称的列表所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。