Aplikacja .NET C# powinna przeczytać i wyfiltrować zdarzenia z EventLog systemu lokalnego i zdalnego. Pomysł prosty, może można lepiej, ale składam zapytanie WMI, które następnie jest uruchamiane przez System.Management.ManagementObjectSearcher. Wygląda to mniej więcej tak (daty i inne wartości filtra zostawiam celowo „na sztywno”):
scope = new ManagementScope(„\\\\”+serverName+”\\root\\cimv2”);scope.Connect(); query = „Select * from Win32_NTLogEvent Where Logfile = 'System’ AND TimeWritten >= '2014-12-01′ AND TimeWritten <=’2015-01-01′”;
query += ” AND EventCode = 7040 ” ;
query += ” AND SourceName = 'Service Control Manager”;
query+= ” AND Message LIKE '%SQL%'”;
Potem uruchomienie zapytania:
queryObj = new ObjectQuery(query);eventsWMI = new System.Management.ManagementObjectSearcher(scope,queryObj); foreach (System.Management.ManagementObject e in eventsWMI.Get())
{ //…. }
I…. błąd! Probemem okazały się daty. Niektóre systemy nie potrafią zrozumieć daty podanej napisami, tak jak zrobiłem to powyżej. Zmiana polega na wcześniejszym skonwertowaniu dat:
string wmi_startDate = System.Management.ManagementDateTimeConverter.ToDmtfDateTime(DateTime.Now.AddDays(-10));string wmi_finishDate = System.Management.ManagementDateTimeConverter.ToDmtfDateTime(DateTime.Now);
Teraz zapytanie zmianiam na:
query = „Select * from Win32_NTLogEvent Where Logfile = 'System’ AND TimeWritten >= '” + wmi_startDate + „’ AND TimeWritten <='” + wmi_finishDate + „'”;i to działa…. Super!
Pomogło: http://powershell.com/cs/blogs/tips/archive/2009/03/11/filtering-events-by-date-and-time.aspx