Почему событие EntryWritten этого журнала событий никогда не запускается? - PullRequest
3 голосов
/ 14 мая 2009

У меня есть следующий код в консольном приложении C # и службе Windows C #. Работает в консольном приложении. Он подхватывает указанное событие и правильно вызывает MatchEvent (). Один и тот же код в службе Windows C # не принимает одно и то же указанное событие, он никогда не видит его, но видит другие события. Данное событие записывается в журнал приложений, поэтому я не пытаюсь прочитать журнал безопасности.

Я подумал, что это проблема с правами доступа к учетной записи (служба работала как LocalSystem). Я изменил службу, чтобы использовать ту же учетную запись, в которой я запускал consoleapp, и я все еще вижу то же поведение. Я убедился, что с GP или пользовательским реестром ничего не было сделано для изменения разрешений (это свежая установленная ОС), и учетная запись, используемая в обоих приложениях, является localadmin.

Есть что-то, чего мне не хватает? Я также исследовал EventLogPermission, но, похоже, это не применимо, так как я получаю события из eventLog.

Код:

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

Ответы [ 2 ]

0 голосов
/ 18 мая 2009

Да, вы пропускаете события, если они происходят в интервале опроса. Вы можете использовать WMI (через System.Management), чтобы изменить интервал опроса. Это старая статья, но она предоставит вам информацию, необходимую для этого. См. Раздел «События управления».

Вы также захотите выполнить свой WriteEntry (если вы также пишете в журнал событий) в отдельном потоке, чтобы не блокировать получение событий.

0 голосов
/ 16 мая 2009

Возился с этим время от времени. Кажется, хотя я все еще не уверен на 100 процентов, что происходит следующее:

  • События являются кластерными событиями, и так может быть записан с любого узла в локальная система, но EventLog класс только забирает события локально.
  • Система реагирует на Метод WriteEntry () только если последний Событие записи произошло как минимум шесть секунды первосулы. События, которыми я был поиск произошел за считанные секунды друг от друга, и были завалены другие связанные, но не важные события.

Любое подтверждение этого было бы полезно. Информация получена здесь: msdn

...