Как проверить, существует ли этот журнал событий?

В одном из моих проектов мне нужно проверить, существует ли на компьютере журнал событий "Microsoft-Exchange-ManagedAvailability/Monitoring" (источником событий является ManagedAvailability).

я использовал

EventLog.Exists("Microsoft-Exchange-ManagedAvailability/Monitoring")

а также

EventLog.SourceExists("ManagedAvailability")

Оба возвращают false, но журнал событий существует. Он находится в разделе "Журналы приложений и служб"/Microsoft/, см. Снимок экрана.

Итак, как я могу проверить, существует ли этот журнал?

Спасибо

введите описание изображения здесь

3 ответа

Похоже, что EventLog.Exists() не поддерживает новый, так как Vista, формат дефис-формат-с-косой чертой. Process Monitor показывает, что пытается открыть HKLM\System\CurrentControlSet\Services\EventLog\Microsoft-Exchange-ManagedAvailability/Monitoring, который не существует - это в HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\WINEVT\Channels\Microsoft-Windows-SENSE/Operational,

Так что, я думаю, вам придется либо попытаться открыть и перехватить исключительную ситуацию (некрасиво), либо получить список всех журналов событий и найти свой:

EventLogSession.GlobalSession.GetLogNames().Any(
    s => string.Equals(s, "Microsoft-Exchange-ManagedAvailability/Monitoring", StringComparison.OrdinalIgnoreCase))

Есть ли у вас соответствующие разрешения для доступа к источнику событий. Например, вам могут потребоваться разрешения администратора для проверки источника события.

Из MSDN

Поскольку этот метод обращается к реестру, у вас должны быть соответствующие разрешения реестра на локальном компьютере; в противном случае запрос возвращает false.

EDIT1

Можете ли вы попробовать использовать следующий код, чтобы проверить, какие logName событий перечислены на вашем компьютере. После получения списка проверьте, существует или нет logName события, если оно существует, передайте то же имя в своем коде для logName события.

Кроме того, вы можете перейти к журналу событий, для которого вам нужна информация (Правый клик) -> Свойства -> Полное имя. Это имя следует использовать в методе Exists.

System.Diagnostics.Eventing.Reader.EventLogSession.GlobalSession.GetLogNames()

Вы запускаете это на компьютере с контролем учетных записей (UAC)? Я только что проверил страницу MSDN на EventLog и нашел этот кусок:

Поскольку этот метод обращается к реестру, у вас должны быть соответствующие разрешения реестра на локальном компьютере; в противном случае запрос возвращает false.

Я не знаю, как именно журнал событий связан с реестром, но я проделал другую работу с реестром. Если это та же проблема, вам нужно повысить уровень прав на выполнение. Для этого вам нужно добавить файл манифеста приложения в решение и установить requestedExecutionLevel level="requireAdministrator", что означает, что когда вы запускаете приложение на машине с UAC, оно будет спрашивать "Вы уверены?". Также необходимо убедиться, что в свойствах проекта указан манифест для использования.

Еще одна ловушка, с которой я столкнулся, заключалась в том, что при отладке в Visual Studio он будет работать с уровнем выполнения VS, а не с тем, который указан в манифесте ( см. Здесь). Самое простое решение - настроить VS для запуска от имени администратора в свойствах ярлыка.

Другие вопросы по тегам