Problem z datą podczas wywoływania zapytań WMI

23-Gru-2014

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

Dodaj komentarz:

Autor: Rafał Kraik