gpt4 book ai didi

c# - 订阅 Windows 事件日志?

转载 作者:太空狗 更新时间:2023-10-30 00:02:43 24 4
gpt4 key购买 nike

我正在开展一个项目,需要经常检查 Windows 事件日志中的某些事件。我想知道 - 有没有办法为某些事件创建对 Windows 事件日志的订阅?

那么,当事件发生时(例如事件 id = 00001),我可以在代码中收到通知吗?

如果这做不到,那么我将不得不继续搜索事件日志,这样效率不高。

最佳答案

当您使用 C# 时,我认为您应该使用 Windows API 来订阅某些 Windows 事件。您可以使用 EventLogWatcherEventLog 类来完成此操作。您可以在 MSDN 上找到使用 EventLog 创建 Windows 事件日志订阅的示例。 .

如果您更喜欢EventLogWatcher,请引用其有限的documentation .

这是我的例子:

public static void subscribe()
{
EventLogWatcher watcher = null;
try
{
EventLogQuery subscriptionQuery = new EventLogQuery(
"Security", PathType.LogName, "*[System/EventID=4624]");

watcher = new EventLogWatcher(subscriptionQuery);

// Make the watcher listen to the EventRecordWritten
// events. When this event happens, the callback method
// (EventLogEventRead) is called.
watcher.EventRecordWritten +=
new EventHandler<EventRecordWrittenEventArgs>(
EventLogEventRead);

// Activate the subscription
watcher.Enabled = true;

for (int i = 0; i < 5; i++)
{
// Wait for events to occur.
System.Threading.Thread.Sleep(10000);
}
}
catch (EventLogReadingException e)
{
Log("Error reading the log: {0}", e.Message);
}
finally
{
// Stop listening to events
watcher.Enabled = false;

if (watcher != null)
{
watcher.Dispose();
}
}
Console.ReadKey();
}

// Callback method that gets executed when an event is
// reported to the subscription.
public static void EventLogEventRead(object obj,
EventRecordWrittenEventArgs arg)
{
// Make sure there was no error reading the event.
if (arg.EventRecord != null)
{
//////
// This section creates a list of XPath reference strings to select
// the properties that we want to display
// In this example, we will extract the User, TimeCreated, EventID and EventRecordID
//////
// Array of strings containing XPath references
String[] xPathRefs = new String[9];
xPathRefs[0] = "Event/System/TimeCreated/@SystemTime";
xPathRefs[1] = "Event/System/Computer";
xPathRefs[2] = "Event/EventData/Data[@Name=\"TargetUserName\"]";
xPathRefs[3] = "Event/EventData/Data[@Name=\"TargetDomainName\"]";

// Place those strings in an IEnumerable object
IEnumerable<String> xPathEnum = xPathRefs;

// Create the property selection context using the XPath reference
EventLogPropertySelector logPropertyContext = new EventLogPropertySelector(xPathEnum);

IList<object> logEventProps = ((EventLogRecord)arg.EventRecord).GetPropertyValues(logPropertyContext);
Log("Time: ", logEventProps[0]);
Log("Computer: ", logEventProps[1]);
Log("TargetUserName: ", logEventProps[2]);
Log("TargetDomainName: ", logEventProps[3]);
Log("---------------------------------------");

Log("Description: ", arg.EventRecord.FormatDescription());
}
else
{
Log("The event instance was null.");
}
}

关于c# - 订阅 Windows 事件日志?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33510244/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com