2010-02-25 6 views
3

Si je choisis pour filtrer la « demande » connecter le spectateur EventLog, je peux voir beaucoup de sources enregistrées avec le journal « Application ». Comment pourrais-je énumérer par programme toutes ces sources via C#? Et il me semble que je ne peux pas enregistrer ma propre source evento avec le journal "Application" et "System", pourquoi?Comment énumérer toutes les sources de registerd pour un EventLog

BTW: Le concept de « source d'événement » est vraiment déroutant ...

Répondre

3

Il pourrait y avoir une API .NET ou Windows plus approprié, vous pouvez faire référence à cet effet, mais l'info est finalement stockée dans le registre sous la clé de service Eventlog. La clé racine du service est ici: HKLM\SYSTEM\CurrentControlSet\Services\Eventlog

La plupart des sous-clés sous cette clé seront les différents journaux d'événements sur le système, y compris System et Application. Pour chaque journal, il contiendra un tas de sous-clés supplémentaires qui représentent les sources enregistrées pour ce journal. Il suffit donc d'énumérer les sous-clés pour obtenir votre liste.

Sur les systèmes d'exploitation XP/2003, la sous-clé du journal contient également une valeur REG_MULTI_SZ appelée Sources qui doit correspondre à la liste des sous-clés source. Cette valeur ne semble plus être utilisée sur les machines Win7/2008 R2 (pas sûr de Vista).

0

Regardez la documentation de la classe System.Diagnostics.EventLog, qui devrait révéler.

+0

Hélas, System.Diagnostics.EventLog n'a pas de fonction à la liste de toutes les sources d'événements enregistrés. Vous pouvez uniquement vérifier si une source d'événement avec un nom donné existe. Mais si vous ne connaissez pas le nom, vous ne pouvez pas obtenir la liste des sources d'événements existantes. –

1

Voici un extrait de code pour énumérer les sources. Note:

  • Chaque SourceName doit être unique par machine, pas par journal. (C'est pourquoi je na pas utiliser SourceName comme une sous-classe de EventLog)
  • Vous devez admin privilges aux journaux de ENUM. Utilisation dans Paramètres/Windows Settings:
    <requestedPrivileges xmlns="urn:schemas-microsoft-com:asm.v3"> <requestedExecutionLevel level="requireAdministrator" uiAccess="false" /> </requestedPrivileges>
  • Si vous créez une nouvelle source vous devez attendre un certain temps jusqu'à ce qu'il soit enregistré au système
  • Si vous passez d'une source à l'autre journal, vous doit redémarrer entre la suppression et la (re) création de la source.

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 
Questions connexes