2009-05-14 17 views
3

Ich habe den folgenden Code in einer C# -Konsolenanwendung und einem C# Windows-Dienst. Es funktioniert in der Konsolen-App. Es nimmt das angegebene Ereignis auf und ruft MatchEvent() korrekt auf. Derselbe Code in einem C# -Windows-Dienst nimmt das selbe spezifizierte Ereignis nicht an, es sieht es nie, sieht aber die anderen Ereignisse. Das betreffende Ereignis wird in das Anwendungsprotokoll geschrieben. Daher versuche ich nicht, das Sicherheitsprotokoll zu lesen.Warum würde das EntryWritten-Ereignis dieses Ereignisprotokolls nie ausgelöst?

Ich dachte, es war ein Kontoberechtigungen (der Dienst wurde als LocalSystem ausgeführt). Ich änderte den Dienst, um dasselbe Konto zu verwenden, auf dem ich die Konsolenanwendung ausführte, und ich sehe immer noch dasselbe Verhalten. Ich habe überprüft, dass mit GP oder der benutzerdefinierten Registrierung nichts getan wurde, um Berechtigungen zu ändern (es ist ein neu installiertes Betriebssystem) und das Konto, das mit beiden Apps verwendet wird, ist ein Localadmin.

Gibt es etwas, das mir fehlt? Ich habe auch EventLogPermission recherchiert, aber das scheint nicht zu funktionieren, da ich Ereignisse aus dem eventLog erhalte.

Der Code:

private void WatchLogs() 
{ 
    try 
    { 
     _eventLogs = EventLog.GetEventLogs(); 

     foreach (EventLog eventLog in _eventLogs) 
     { 
      if (eventLog.LogDisplayName.Contains("Security")) 
      { 
       _logger.DebugFormat(string.Format("{0}: not watching", eventLog.LogDisplayName)); 
      } 
      else 
      { 
       eventLog.EntryWritten += EventLogEntryWritten; 
       eventLog.EnableRaisingEvents = true; 

       if (_logger.IsInfoEnabled) 
       { 
        _logger.InfoFormat("Monitoring: {0} | Raising Events: {1}", eventLog.LogDisplayName, 
             eventLog.EnableRaisingEvents); 
       } 
      } 
     } 
    } 
    catch (Win32Exception ee) 
    { 
     _logger.DebugFormat(string.Format("{0}: not watching({1})", eventLog.LogDisplayName, ee.Message)); 
    } 
    catch (SecurityException securityException) 
    { 
     _logger.ErrorFormat("Error accessing eventlog: {0} : {1}", eventLog.LogDisplayName, securityException.Message); 
    } 
} 

private void EventLogEntryWritten(object sender, EntryWrittenEventArgs currentEvent) 
{ 
    var log = (EventLog) sender; 

    if (_logger.IsDebugEnabled) 
    _logger.DebugFormat(
     "Event Raised: |Log:{0}|Source:{1}|EventID:{2}|",log.LogDisplayName, 
     currentEvent.Entry.Source,currentEvent.Entry.EventID); 

    MatchEvent(currentEvent); 
} 

Antwort

0

Ja, Sie verpassen Ereignisse, wenn sie innerhalb des Abrufintervalls auftreten. Sie können WMI (über System.Management) verwenden, um das Abfrageintervall zu ändern. This ist ein älterer Artikel, aber es gibt Ihnen die Informationen, die Sie dazu benötigen. Siehe den Abschnitt Managementereignisse.

Sie möchten Ihren WriteEntry (wenn Sie auch in das Ereignisprotokoll schreiben) auch in einem separaten Thread ausführen, damit Sie keine Ereignisse blockieren.

+0

Wenn es neu geschrieben wird, könnte dies "subscribe" zum Ereignisprotokoll wie die .NET-Klasse? –

+0

Ja, absolut. Sie müssen ein wenig über Verwaltungsereignisse in WMI lesen. Der Server-Explorer in VS 2008 (vielleicht auch im Jahr 2005, aber ich kann mich nicht erinnern) hat einen WMI-Knoten Sie können mit der rechten Maustaste auf diese klicken, um Optionen zum Generieren von Code zu erhalten, und einige Dialoge, die Ihnen helfen, Event-Handler usw. hochzuladen Ich habe es in letzter Zeit nicht benutzt - die eingebaute Version, aber es ist im Grunde das Gleiche. Schau dir den Link zum Artikel an, um zu sehen, was ich meine. –

0

worden Herumspielen mit diesem aus- und einschalten. Es scheint, obwohl ich immer noch nicht zu 100 Prozent sicher, dass Folgendes geschieht:

  • Die Ereignisse sind Cluster-Ereignisse, und so kann entweder von Knoten zu dem lokalen System, aber die EventLog Klasse nur geschrieben werden, nimmt Ereignisse written lokal auf.
  • Das System reagiert auf die WriteEntry() - Methode nur dann, wenn das letzte Ereignis mindestens 6 Sekunden perviosuly aufgetreten ist. Die Ereignisse, die ich war Suche innerhalb von Sekunden voneinander, und wurden von anderen verwandten, aber nicht wichtig Ereignisse überschwemmt.

Jede Bestätigung von diesem wäre hilfreich. Info hier erhalten: msdn

Verwandte Themen