如果我選擇在EventLog查看器中篩選「應用程序」日誌,我可以看到許多使用「應用程序」日誌註冊的源。我如何通過C#編程式地枚舉所有這些源代碼?而且我似乎無法用「應用程序」和「系統」日誌註冊我自己的事件源,爲什麼?如何枚舉事件日誌的所有註冊源
BTW:的「事件源」實在是混淆概念...
如果我選擇在EventLog查看器中篩選「應用程序」日誌,我可以看到許多使用「應用程序」日誌註冊的源。我如何通過C#編程式地枚舉所有這些源代碼?而且我似乎無法用「應用程序」和「系統」日誌註冊我自己的事件源,爲什麼?如何枚舉事件日誌的所有註冊源
BTW:的「事件源」實在是混淆概念...
有可能是你可以爲這個引用一個更合適的.NET或Windows API,但信息最終存儲在註冊表中Eventlog服務密鑰。該服務的根密鑰是在這裏: HKLM\SYSTEM\CurrentControlSet\Services\Eventlog
大多數項下的子項將是該系統包括System
和Application
上的各種事件日誌。對於每個日誌,它將包含一堆代表該日誌的註冊源的附加子項。只需枚舉子鍵即可獲取您的列表。
在XP/2003操作系統,日誌的子項還包含一個名爲Sources
一個REG_MULTI_SZ值應匹配源子項的列表。該值似乎不再用於Win7/2008 R2計算機(不確定Vista)。
查看System.Diagnostics.EventLog類的文檔,該文檔應該會顯示所有文檔。
這裏是枚舉源代碼片段。 注:
<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不具備的功能,列出所有註冊的事件源。您只能檢查具有給定名稱的事件源是否存在。但是,如果您不知道名稱,則無法獲取現有事件源的列表。 – 2014-01-08 08:57:31