如果我选择在 EventLog 查看器中过滤“应用程序”日志,我可以看到很多在“应用程序”日志中注册的源。如何通过 C# 以编程方式枚举所有这些源?而且似乎我无法使用“应用程序”和“系统”日志注册自己的事件源,为什么?
BTW:“事件源”的概念真的很混乱......
如果我选择在 EventLog 查看器中过滤“应用程序”日志,我可以看到很多在“应用程序”日志中注册的源。如何通过 C# 以编程方式枚举所有这些源?而且似乎我无法使用“应用程序”和“系统”日志注册自己的事件源,为什么?
BTW:“事件源”的概念真的很混乱......
可能有更合适的 .NET 或 Windows API 可供您参考,但信息最终存储在 Eventlog 服务键下的注册表中。该服务的根密钥在这里:
HKLM\SYSTEM\CurrentControlSet\Services\Eventlog
该键下的大多数子键将是系统上的各种事件日志,包括System
和Application
。对于每个日志,它将包含一堆额外的子键,代表该日志的注册源。因此,只需枚举子键即可获取您的列表。
在 XP/2003 操作系统上,日志的子项还包含一个名为 REG_MULTI_SZ 的值Sources
,该值应与源子项的列表匹配。该值似乎不再用于 Win7/2008 R2 机器(不确定 Vista)。
这是枚举源的代码片段。笔记:
<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
查看 System.Diagnostics.EventLog 类的文档,它应该会显示所有内容。