Как перечислить все зарегистрированные источники для EventLog - PullRequest
3 голосов
/ 25 февраля 2010

Если я выберу фильтрацию журнала «Приложение» в средстве просмотра EventLog, я смогу увидеть много источников, зарегистрированных в журнале «Приложение». Как я могу программно перечислить все эти источники через C #? И кажется, что я не могу зарегистрировать свой собственный источник в журнале «Приложение» и «Система», почему?

Кстати: понятие "источник событий" действительно сбивает с толку ...

Ответы [ 3 ]

3 голосов
/ 25 февраля 2010

Возможно, для этого есть более подходящий .NET или Windows API, но информация в конечном итоге хранится в реестре под ключом службы Eventlog. Корневой ключ службы находится здесь: HKLM\SYSTEM\CurrentControlSet\Services\Eventlog

Большинство подразделов этого ключа будут различными журналами событий в системе, включая System и Application. Для каждого журнала он будет содержать несколько дополнительных подразделов, представляющих зарегистрированные источники для этого журнала. Поэтому просто перечислите подключи, чтобы получить список.

В операционных системах XP / 2003 подраздел журнала также содержит значение REG_MULTI_SZ, называемое Sources, которое должно соответствовать списку исходных подразделов. Это значение больше не используется на машинах с Win7 / 2008 R2 (не уверен насчет Vista).

1 голос
/ 13 сентября 2017

Вот фрагмент кода для перечисления источников. Примечание:

  • Каждое SourceName должно быть уникальным для каждой машины, а НЕ для журнала. (Вот почему я не использовал SourceName как подкласс EventLog)
  • Вам нужны права администратора для перечисления логов. Используйте в Настройках / Windows-Настройки:
    <requestedPrivileges xmlns="urn:schemas-microsoft-com:asm.v3"> <requestedExecutionLevel level="requireAdministrator" uiAccess="false" /> </requestedPrivileges>
  • Если вы создаете новый источник, вы должны подождать, пока он не будет зарегистрирован в системе
  • Если вы переключаете источник на другой журнал, вы должны перезапустить между удалением и (повторным) созданием источника.

Imports System.Diagnostics
Imports  Microsoft.Win32

Public Class ClsEventSources

Friend Class MySourcesInfo
  Friend LogName As String
  Friend SourceName As String
End Class

Private MyEventLogList As New List(Of EventLog)
Private MySourceList As New List(Of MySourcesInfo)

Private Const RegEventLogPath As String = "SYSTEM\CurrentControlSet\Services\Eventlog\"

  Private Sub New()

    MyEventLogList = EventLog.GetEventLogs.ToList

    For Each Ev In MyEventLogList 

        For Each SubKeyName In _
           Registry.LocalMachine.OpenSubKey(RegEventLogPath & _
                                  Ev.Log).GetSubKeyNames

            MySourceList.Add(New MySourcesInfo With _
                      {.LogName = Ev.Log, .SourceName = SubKeyName})
        Next     

    Next

  End Sub

End Class
0 голосов
/ 25 февраля 2010

Посмотрите документацию по классу System.Diagnostics.EventLog, которая должна раскрыть все.

...