如何枚举EventLog的所有已注册源

时间:2010-02-25 15:53:11

标签: windows event-log event-viewer

如果我选择在EventLog查看器中过滤“应用程序”日志,我可以看到很多源在“应用程序”日志中注册。我怎么能通过C#以编程方式枚举所有这些来源?似乎我无法使用“应用程序”和“系统”日志注册我自己的evento源,为什么?

BTW:“事件来源”的概念确实令人困惑......

3 个答案:

答案 0 :(得分:3)

可能有一个更合适的.NET或Windows API可供您参考,但信息最终存储在Eventlog服务密钥下的注册表中。服务的根密钥在这里: HKLM\SYSTEM\CurrentControlSet\Services\Eventlog

该密钥下的大多数子密钥将是系统上的各种事件日志,包括SystemApplication。对于每个日志,它将包含一组附加子键,这些子键表示该日志的已注册源。所以只需枚举子键即可获得列表。

在XP / 2003操作系统上,日志的子项还包含一个名为Sources的REG_MULTI_SZ值,该值应与源子项列表匹配。该值似乎不再用于Win7 / 2008 R2计算机(不确定Vista)。

答案 1 :(得分:1)

这是一个用于枚举源代码的代码片段。 注意:

  • 每个SourceName的每个SourceName必须是唯一的,而不是每个日志。 (这就是为什么我没有像使用EventLog的子类那样使用SourceName)
  • 您需要管理员权限来枚举日志。在设置/ 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

答案 2 :(得分:0)

查看System.Diagnostics.EventLog类的文档,该类应该显示所有内容。

相关问题