2010-02-25 33 views
3

如果我選擇在EventLog查看器中篩選「應用程序」日誌,我可以看到許多使用「應用程序」日誌註冊的源。我如何通過C#編程式地枚舉所有這些源代碼?而且我似乎無法用「應用程序」和「系統」日誌註冊我自己的事件源,爲什麼?如何枚舉事件日誌的所有註冊源

BTW:的「事件源」實在是混淆概念...

回答

3

有可能是你可以爲這個引用一個更合適的.NET或Windows API,但信息最終存儲在註冊表中Eventlog服務密鑰。該服務的根密鑰是在這裏: HKLM\SYSTEM\CurrentControlSet\Services\Eventlog

大多數項下的子項將是該系統包括SystemApplication上的各種事件日誌。對於每個日誌,它將包含一堆代表該日誌的註冊源的附加子項。只需枚舉子鍵即可獲取您的列表。

在XP/2003操作系統,日誌的子項還包含一個名爲Sources一個REG_MULTI_SZ值應匹配源子項的列表。該值似乎不再用於Win7/2008 R2計算機(不確定Vista)。

0

查看System.Diagnostics.EventLog類的文檔,該文檔應該會顯示所有文檔。

+0

唉,System.Diagnostics.Eventlog不具備的功能,列出所有註冊的事件源。您只能檢查具有給定名稱的事件源是否存在。但是,如果您不知道名稱,則無法獲取現有事件源的列表。 – 2014-01-08 08:57:31

1

這裏是枚舉源代碼片段。 注:

  • 每個SOURCENAME必須是每臺機器唯一的,每個日誌NOT。 (這就是爲什麼我沒有使用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 
相關問題