2015-11-03 4 views
1

Я работаю над проектом, который часто проверяет журнал событий Windows для определенного события. Я задаюсь вопросом:Подписка на журнал событий Windows?

Is there a way to create a subscription of the Windows Event Log for certain event? 

Так что, когда произошло событие (то есть событие с кодом = 00001), я могу получить уведомление в коде как можно скорее? Я использую C#. Если этого не сделать, тогда мне придется продолжать поиск журнала событий, который неэффективен.

Благодаря

+0

, чтобы проверить журнал событий, есть несколько способов, которые наилучшим образом я использовал в прошлом, чтобы использовать «WMI» для меня чудеса. – MethodMan

ответ

4

Как вы используете C#, я думаю, вы должны использовать Windows API, чтобы подписаться на определенные события Windows. Вы можете сделать это, используя класс EventLogWatcher или EventLog. Вы можете найти пример создания подписки на журнал событий Windows с помощью EventLog по адресу MSDN.

Если вы предпочитаете 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 IEnumberable 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."); 
    } 
} 
Смежные вопросы