3

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

BTW:“事件源”的概念真的很混乱......

4

3 回答 3

3

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

该键下的大多数子键将是系统上的各种事件日志,包括SystemApplication。对于每个日志,它将包含一堆额外的子键,代表该日志的注册源。因此,只需枚举子键即可获取您的列表。

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

于 2010-02-25T16:48:48.833 回答
1

这是枚举源的代码片段。笔记:

  • 每个 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
于 2017-09-13T05:08:07.003 回答
0

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

于 2010-02-25T17:09:18.560 回答