我正在尝试获取 C# 中“特殊”事件日志的列表,例如“Microsoft\Windows\Audio\CaptureMonitor”日志以及所有其他类似的日志。当我使用 System.Diagnostics.EventLog.GetEventLogs() 时,它们似乎没有返回。有没有一种特殊的方法来获取所有特殊事件日志的列表?
问问题
1281 次
2 回答
1
老实说,我承认我不知道这些视图如何与 EventLogs 和 EventSources 相关联,但请看一下注册表项:
HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\WINEVT\Channels
看看这是否会让你走上正确的道路。还结帐:
于 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.Reader
Namespace 。尝试以下操作:
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 回答