WinEvent: XPath nie gryzie

Dziś miałem potrzebę przeszukania logów systemowych, a konkretnie logu Security pod kątem autoryzacji do serwera NPS. Cały problem polegał na tym, iż wszystkie istotne informacje są zwykle zapisywane w części EventData. A niestety przy użyciu Get-EventLog nie ma zbyt przyjaznego dostępu do tych danych, no chyba jedynie poprzez przeszukiwanie pozycji Message.

Na ratunek jednak przychodzi nam cmdlet Get-WinEvent wraz z parametrem –FilterXPath (lub –FilterXML, choć osobiście wolę XPath – bardziej czytelny). Zanim jednak przejdziemy do przeszukiwania logów spróbujmy spreparować zapytanie w bardziej przyjaznej formie.

Na początek zdecydujmy pod jakim kątem chcemy przeszukiwać nasze logi:

$SearchParam = "CallingStationID"
$SearchValue = "10.10.60.20"

Następnie tworzymy filtr zapytania w formie XPath i podajemy nazwę loga jakiego ma się ono tyczyć, czyli Security:

$FilterXPath = "*[EventData[Data[@Name='$SearchParam']='$SearchValue']]"
$LogName = "Security"

I tak w przypadku parametru FilterXPath zapytanie będzie wyglądało tak:

Get-winevent –LogName $LogName –FilterXPath $FilterXPath

Natomiast przy użyciu filtrowania poprzez użycie kody xml, konieczne jest stworzenie odpowiednie ścieżki filtruxml:

$FilterXML = "<select>$FilterXPath</select>"

A dopiero późnie zastosowanie go w zapytaniu Get-WinEvent:

Get-winevent -FilterXML $FilterXML

Ok, Wyciągneliśmy jakieś logi, ale jak widzimy są one trochę mało czytelne dla użytkownika. Spróbujmy zatem przefiltrować wynik prezentowany na ekranie:

$Output = @{Name="TimeCreated";Expression={$_.TimeCreated}},@{Name="SubjectUserName";Expression={$_.Properties[1].Value}},@{Name="CallingStationID";Expression={$_.Properties[9].Value}},@{Name="Status";Expression={$_.KeywordsDisplayNames}}
Get-winevent –LogName $LogName –FilterXPath $FilterXPath | Select-Object $Output

Dobrze już lepiej, ale nie do końca. Jak widzimy zostały zwrócone wszystkie pasujące pozycje do zapytania CallingStationID = 10.10.60.20, co może doprowadzić do zwrócenia zbyt dużej puli informacji co też nie jest zbyt dobre. Najprzydatniejszym rodzajem „odsiania” niepotrzebnych danych jest poprostu filtrowanie po dacie zdarzenia. Niestety filtrowanie po dacie przy użyciu XPath nie jest zbyt przyjemne. Można stosować notację w formie porównywania dat:

*[System[TimeCreated[@SystemTime < '2011-12-19T10:35:30.829988900Z']]][$Output = @{Name="TimeCreated";Expression={$_.TimeCreated}},@{Name="SubjectUserName";Expression={$_.Properties[1].Value}},@{Name="CallingStationID";Expression={$_.Properties[9].Value}},@{Name="Status";Expression={$_.KeywordsDisplayNames}} Get-winevent –LogName $LogName –FilterXPath $FilterXPath | Select-Object $Output

Niemniej ciągle występował u mnie problem ze konwersją strefy czasowej co przy odrobinie nieuwagi może wprowadzić pewne przekłamania. Dlatego najlepiej zastosować drobny trik z użyciem timediff. Gdy chcemy znaleźć logi nie starsze niż np. dzień nie ma problemu. Wystarczy zastosować poniższe rozwiązanie:

*[System[TimeCreated[timediff(@SystemTime) < 86400000]]]

Gdzie 86400000 to po prostu wartość 24h w milisekundach: 1000ms * 60s * 6min * 24h

Co jednak gdy chcemy znaleźć logi z konkretnego przedziału? Nic straconego, wtedy możemy np. porównać dwa zapytania z timediff. Ale by tego dokonać najpierw musimy sobie spreparować odpowiednie wartości czasu w milisekundach od chwili obecnej:

$SearchFromDate = "2011-12-19 08:50:00"
$SearchToDate = "2011-12-19 09:00:00"

$now = Get-Date
$FromDate = ($now-([DateTime]$SearchFromDate)).TotalMilliseconds
$ToDate = ($now-([DateTime]$SearchToDate)).TotalMilliseconds

A następnie modyfikujemy zapytanie:

$FilterXPath = "*[System[TimeCreated[timediff(@SystemTime) < $FromDate and timediff(@SystemTime) > $ToDate]] and EventData[Data[@Name='$SearchParam']='$SearchValue']]"
Get-winevent –LogName $LogName –FilterXPath $FilterXPath | Select-Object $Output

Advertisements

Skomentuj

Wprowadź swoje dane lub kliknij jedną z tych ikon, aby się zalogować:

Logo WordPress.com

Komentujesz korzystając z konta WordPress.com. Log Out / Zmień )

Zdjęcie z Twittera

Komentujesz korzystając z konta Twitter. Log Out / Zmień )

Facebook photo

Komentujesz korzystając z konta Facebook. Log Out / Zmień )

Google+ photo

Komentujesz korzystając z konta Google+. Log Out / Zmień )

Connecting to %s