1

「Microsoft\Windows \ Audio \ CaptureMonitor」ログやその他すべてのログなど、C#の「特別な」イベントログのリストを取得しようとしています。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 /?を使用してください。指図。

を使用し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.Reader名前空間を使用できます。次のことを試してください。

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 に答える