2009-05-14 2 views
3

J'ai le code suivant dans une application console C# et un service Windows C#. Cela fonctionne dans l'application de console. Il détecte l'événement spécifié et appelle MatchEvent() correctement. Le même code dans un service C# Windows ne prend pas le même événement spécifié, il ne le voit jamais, mais voit les autres événements. L'événement en question est écrit dans le journal des applications. Je n'essaie donc pas de lire le journal de sécurité.Pourquoi l'événement EntryWritten de ce journal d'événements ne se déclencherait-il jamais?

Je pensais que c'était une question des autorisations de compte (le service a été exécuté comme LocalSystem). J'ai changé le service pour utiliser le même compte que celui utilisé pour le consoleapp, et je vois toujours le même comportement. J'ai vérifié qu'il n'y avait rien fait avec GP ou le registre personnalisé pour changer les autorisations (c'est un OS nouvellement installé) et le compte utilisé avec les deux applications est un localadmin.

Y a-t-il quelque chose qui me manque? J'ai également fait des recherches sur EventLogPermission, mais cela ne semble pas s'appliquer, puisque je récupère des événements dans eventLogPermission.

Le 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); 
} 

Répondre

0

Oui, vous manquez des événements s'ils surviennent dans l'inteval d'interrogation. Vous pouvez utiliser WMI (via System.Management) pour modifier l'intervalle d'interrogation. This est un article plus ancien, mais il vous donnera les informations dont vous avez besoin pour ce faire. Voir la section sur les événements de gestion.

Vous devez également exécuter votre WriteEntry (si vous écrivez également dans le journal des événements) sur un thread distinct, afin de ne pas bloquer les événements de réception.

+0

si réécrit, cela peut-il s'abonner à l'eventlog comme le fait la classe .NET? –

+0

Oui, absolument, vous devrez faire un peu de lecture sur les événements de gestion dans WMI L'Explorateur de serveurs dans VS 2008 (peut-être en 2005 aussi, mais je ne m'en souviens pas) a un nœud WMI.Vous pouvez faire un clic droit sur ceux pour obtenir des options pour générer du code, et quelques boîtes de dialogue qui vous aideront à envoyer des gestionnaires d'événements etc .... J'avais l'habitude d'être dans un addin téléchargeable séparé de MS.Je ne l'ai pas utilisé récemment - la version intégrée, mais c'est fondamentalement la même chose.Vérifiez le lien vers l'article pour voir ce que je veux dire. –

0

été déconner avec ce sous et hors tension. Il semble, bien que je toujours pas 100 pour cent sûr, que les éléments suivants sont happening:

  • Les événements sont des événements grappes, et ainsi peuvent être écrits à partir des nœuds à le système local, mais la classe EventLog seulement ramasse les événements writtern localement.
  • Le système répond à la méthode WriteEntry() uniquement si le dernier événement d'écriture s'est produit au moins six fois secondes. Les événements que j'étais se sont produits en secondes l'un de l'autre, et ont été submergés par autres événements connexes, mais pas importants .

Toute confirmation de ce serait utile. Informations obtenues ici: msdn

Questions connexes