EventLog von entferntem Host lesen

  • VB.NET

Es gibt 5 Antworten in diesem Thema. Der letzte Beitrag () ist von Mono.

    EventLog von entferntem Host lesen

    Moin zusammen,

    ich möchte gerne per VB.NET EventLogs von entfernten Hosts auslesen. Hier mein bisheriger Code:

    VB.NET-Quellcode

    1. Imports System.Diagnostics
    2. Imports System.Linq
    3. Public Class Form1
    4. Dim DT As DataTable
    5. Dim DV As DataView
    6. Private Sub LadenButton_Click(sender As Object, e As EventArgs) Handles LadenButton.Click
    7. DT = New DataTable
    8. DV = New DataView
    9. DT.Columns.Add(New DataColumn With {.ColumnName = "Typ", .DataType = GetType(String)})
    10. DT.Columns.Add(New DataColumn With {.ColumnName = "Datum", .DataType = GetType(Date)})
    11. DT.Columns.Add(New DataColumn With {.ColumnName = "Quelle", .DataType = GetType(String)})
    12. DT.Columns.Add(New DataColumn With {.ColumnName = "Ereignis-ID", .DataType = GetType(String)})
    13. DT.Columns.Add(New DataColumn With {.ColumnName = "Message", .DataType = GetType(String)})
    14. Dim EvtLog As New EventLog("System", IPTextBox.Text)
    15. Dim Daten = From logEvent As EventLogEntry In EvtLog.Entries
    16. Where logEvent.TimeWritten >= DateAdd(DateInterval.Day, -30, Now.Date) _
    17. And (logEvent.EntryType = EventLogEntryType.Error Or logEvent.EntryType = EventLogEntryType.Warning Or logEvent.EntryType = 0) _
    18. Select logEvent
    19. Order By logEvent.TimeWritten ' EntryType = 0 definiert die Kritischen Fehler!
    20. For Each Ereignis As EventLogEntry In Daten
    21. DT.Rows.Add(Ereignis.EntryType.ToString, Ereignis.TimeWritten, Ereignis.Source, EventInstanceToID(Ereignis.InstanceId), Ereignis.Message)
    22. Next
    23. Label1.Text = "Anzahl: " & Daten.Count
    24. DV = DT.DefaultView
    25. DataGridView1.DataSource = DV
    26. EvtLog.Close()
    27. End Sub
    28. Function EventInstanceToID(ByRef lInstance As Long) As String
    29. Dim lEventID As Int32
    30. 'Take just the integer part
    31. lEventID = CInt(lInstance And CLng(Int32.MaxValue))
    32. lEventID = (lEventID And &H3FFFFFFF)
    33. If lEventID.ToString.Length > 5 Then
    34. Return (lEventID.ToString.Substring(lEventID.ToString.Length - 1, 1))
    35. Else
    36. Return (lEventID.ToString)
    37. End If
    38. End Function
    39. End Class


    Der Code funktioniert für Lokal super... allerdings nicht mit anderen Hosts im Netzwerk. Die Fehlermeldung ist immer, er könne den Netzwerkpfad nicht finden, obwohl die Hosts erreichbar sind.

    Wenn ich das laut MSDN richtig verstanden habe, lässt die Eigenschaft EventLog.MachineName auch nur Computernamen zu und keine IP-Adressen.

    Jetzt hab ich schon gegooglet und Alternativen gesucht. Viele reden über WMI... Allerdings habe ich keine Idee davon wie das funktioniert.

    Hat einer von euch ein laufendes Beispiel?

    Danke schonmal!


    Gruß,
    Hendrik
    Der Vorteil der Intelligenz besteht darin, sich dumm stellen zu können. Das Gegenteil davon ist schon schwieriger.
    Hi,

    aber in dem Beispiel benutzten die ja andere Klassen. Und ich kann die Daten nicht anhand einer LINQ-Abfrage ziehen (wie in meinem Code).

    Ich würde ja sogar das Beispiel von MSDN nutzen (auch wenn es meines Erachtens nach nicht so komfortabel ist). Aber ich verstehe diese Zeile nicht:

    VB.NET-Quellcode

    1. ​Dim queryString As String = "*[System/Level=2]" ' XPATH Query


    Was ist ein "XPATH Query" und wie wird der aufgebaut? Was hat das [System/Level=2] zu bedeuten?

    Ich nutze unheimlich gerne LINQ da ich da keinen Query als String coden muss. (Fehlerunanfälliger)
    Der Vorteil der Intelligenz besteht darin, sich dumm stellen zu können. Das Gegenteil davon ist schon schwieriger.
    Ich würde einfach auf dem entferneten Host einen kleinen Dienst laufen lassen der die gesammelten Daten an einen Server übergibt. Das hat nebenbei euch den Vorteil das der Server nicht jeden Host anfragen muss und daher weit weniger belastet wird. Die meisten Monitoring Tools basieren ebenfalls auf diesem Prinzip
    Nicht unbedingt. Und ich finde genau diese Herangehensweise auch scheisse :)
    Ist viel zu Wartungsunfreundlich und wenn der Client ein Problem hat läuft der Dienst vll nicht richtig usw.
    Das ist meine Signatur und sie wird wunderbar sein!