1

我正在尝试获取 C# 中“特殊”事件日志的列表,例如“Microsoft\Windows\Audio\CaptureMonitor”日志以及所有其他类似的日志。当我使用 System.Diagnostics.EventLog.GetEventLogs() 时,它们似乎没有返回。有没有一种特殊的方法来获取所有特殊事件日志的列表?

4

2 回答 2

1

老实说,我承认我不知道这些视图如何与 EventLogs 和 EventSources 相关联,但请看一下注册表项:

HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\WINEVT\Channels

看看这是否会让你走上正确的道路。还结帐:

如何在 Windows 事件系统中创建日志名层次结构?

于 2013-03-14T20:08:09.587 回答
0

您可以使用WevtUtil.exe 工具

要从命令行访问事件日志信息,请使用 WevtUtil.exe 工具。此工具位于 %SystemRoot%\System32 目录中。对于 WevtUtil.exe 工具帮助,请使用wevtutil /? 命令。

我猜您可能会使用 a System.Diagnostigs.Process,启动该工具,然后捕获并解析控制台输出。

using System;
using System.Diagnostics;
using System.Linq;

class Program
{
    static void Main(string[] args)
    {
        var output = "";
        var p = new Process();
        var psi = new ProcessStartInfo("wevtutil.exe", "el");

        psi.CreateNoWindow = true;
        psi.RedirectStandardOutput = true;
        psi.UseShellExecute = false;
        p.StartInfo = psi;
        p.Start();

        using (var processOutput = p.StandardOutput)
        {
            output = processOutput.ReadToEnd();
        }

        p.WaitForExit();

        var eventLogs = output
            .Split(new string[] { "\r\n" }, StringSplitOptions.RemoveEmptyEntries)
            .ToList();

        foreach (var item in eventLogs)
        {
            Console.WriteLine(item);
        }
    }
}

要读取事件日志,您可以使用相同的方法(例如 call wevtutil qe Microsoft-Windows-Audio/CaptureMonitor /f:text)或System.Diagnostics.Eventing.ReaderNamespace 。尝试以下操作:

using System;
using System.Diagnostics.Eventing.Reader;

class Program
{
    static void Main(string[] args)
    {
        EventLogQuery subscriptionQuery = 
            new EventLogQuery("Microsoft-Windows-Audio/CaptureMonitor", 
                PathType.LogName, "*");

        using (EventLogReader logReader = 
            new EventLogReader(subscriptionQuery))
        {
            DisplayEventAndLogInformation(logReader);
        }
    }

    private static void DisplayEventAndLogInformation(EventLogReader logReader)
    {
        for (EventRecord eventInstance = logReader.ReadEvent();
            null != eventInstance; eventInstance = logReader.ReadEvent())
        {
            Console.WriteLine("--------------------------------------");
            Console.WriteLine("Event ID: {0}", eventInstance.Id);
            Console.WriteLine("Publisher: {0}", eventInstance.ProviderName);

            try
            {
                Console.WriteLine("Description: {0}", 
                    eventInstance.FormatDescription());
            }
            catch (EventLogException)
            {
                // The event description contains parameters, 
                // and no parameters were passed to the 
                // FormatDescription method, so an exception is thrown.
            }

            // Cast the EventRecord object as an EventLogRecord 
            // object to access the EventLogRecord class properties
            EventLogRecord logRecord = (EventLogRecord)eventInstance;
            Console.WriteLine("Container Event Log: {0}", 
                logRecord.ContainerLog);
        }
    }
}

您可能需要根据需要稍微调整EventLogQuery构造函数的查询参数 ( *)。如何:查询事件主题显示了一个实现示例。

于 2013-03-14T18:56:08.960 回答