Czy mogę pobrać dokładne zdarzenia niepowodzeń z dziennika zdarzeń bezpieczeństwa?
Skrypciarze odpowiadają na Wasze pytania
Witamy w rubryce TechNet, w której Skrypciarze z firmy Microsoft odpowiadają na częste pytania dotyczące używania skryptów w administracji systemu. Jeśli macie jakieś pytania z tej dziedziny, zachęcamy do wysłania e-maila na adres: scripter@microsoft.com. Nie możemy zagwarantować odpowiedzi na każde otrzymane pytanie, ale staramy się jak możemy. |
Czy mogę pobrać dokładne zdarzenia niepowodzeń z dziennika zdarzeń bezpieczeństwa?
Cześć Skrypciarzu! Czy istnieje sposób na pobranie dokładnych zdarzeń Failure Audit (inspekcja awarii) z dziennika zdarzeń bezpieczeństwa?
-- KA
Cześć KA! Ciekawe, że zawsze, gdy chodzi o niepowodzenie, ludzie zwracają się do Skrypciarzy. Skąd pewność, że wiemy cokolwiek o niepowodzeniach?
OK., masz rację, to było głupie pytanie. Jeśli chodzi o Twoje pytanie, pobranie dokładnych zdarzeń inspekcji niepowodzeń zabezpieczeń z dziennika zdarzeń bezpieczeństwa jest bardzo łatwe; tak się składa, że mamy pod ręką skrypt, który właśnie tym się zajmuje:
strComputer = "."
Set objWMIService = GetObject("winmgmts:" _
& "{impersonationLevel=impersonate,(Security)}!\\" & _
strComputer & "\root\cimv2")
Set colLoggedEvents = objWMIService.ExecQuery _
("Select * FROM Win32_NTLogEvent WHERE Logfile = 'Security' " & _
"AND EventType = 5")
For Each objEvent in colLoggedEvents
Wscript.Echo "==================================================="
Wscript.Echo "Category: " & objEvent.Category
Wscript.Echo "Computer Name: " & objEvent.ComputerName
Wscript.Echo "Event Code: " & objEvent.EventCode
Wscript.Echo "Message: " & objEvent.Message
Wscript.Echo "Record Number: " & objEvent.RecordNumber
Wscript.Echo "Source Name: " & objEvent.SourceName
Wscript.Echo "Time Written: " & objEvent.TimeWritten
Wscript.Echo "Event Type: " & objEvent.Type
Wscript.Echo "User: " & objEvent.User
Wscript.Echo
Next
Skrypt niewielki i całkiem prosty, choć na dwie rzeczy powinieneś zwrócić uwagę. Po pierwsze, zauważ, że podczas łączenia się z WMI wstawiliśmy parametr (Security):
Set objWMIService = GetObject("winmgmts:" _
& "{impersonationLevel=impersonate,(Security)}!\\" & _
strComputer & "\root\cimv2")
Zawsze, gdy pracujesz z dziennikiem zdarzeń bezpieczeństwa, musisz wstawić ten parametr; jeśli tego nie zrobisz, skrypt nie zadziała. Owszem, wiemy, że jesteś administratorem lokalnym, wiemy również, że masz prawo czytać dziennik bezpieczeństwa zdarzeń. Na nieszczęście (lub odwrotnie), dla WMI to żadna różnica: i tak musisz wstawić parametr (Security).
Po drugie, zwróć uwagę na dwie części klauzuli WHERE:
("Select * from Win32_NTLogEvent WHERE Logfile = 'Security' " & _
"AND EventType = 5")
W tym skrypcie chcemy pobrać wyłącznie zdarzenia spełniające następujące kryteria: zarejestrowane w dzienniku zdarzeń bezpieczeństwa i mające wartość EventType równą 5. Jak już zapewnie odgadłeś, w języku WMI wartość EventType równa 5 oznacza inspekcję niepowodzenia (Failure Audit). Możesz również wyszukać EventType równy 1 (Error – błąd), 2 (Warning – ostrzeżenie), 3 (Information – informacja), lub 4 (Security Audit Success – powodzenie inspekcji bezpieczeństwa). Ponieważ jednak naszym celem są zdarzenia Failure Audit, w Security Logfile (plik dziennika bezpieczeństwa) wyszukujemy EventType równy 5. Tym sposobem:
WHERE Logfile = 'Security' AND EventType = 5
Fajne, nie? Jeśli chciałbyś dowiedzieć się czegoś więcej o dziennikach zdarzeń (w tym o kilku przykładowych kwerendach, które mogą Ci się przydać), przejrzyj rozdział o dziennikach (j.ang.) w Przewodniku Skryptowania Microsoft Windows 2000.
Skoro już tu jesteś, to chcielibyśmy coś jeszcze dodać. Skrypt w obecnej formie wyświetli właściwość TimeWritten (tzn. datę i godzinę zarejestrowania zdarzenia w dzienniku zdarzeń) używając domyślnego dla WMI formatu UTC. Innymi słowy, otrzymasz wynik podobny do tego:
20041025124000.000000-420
No… pięknie… Ale nie wpadaj w panikę. Oto zmodyfikowana wersja tego skryptu, zawierająca funkcję (WMIDateStringTodate), która przekonwertuje wartość UTC na coś łatwiejszego do odczytania:
strComputer = "."
Set objWMIService = GetObject("winmgmts:" _
& "{impersonationLevel=impersonate,(Security)}!\\" & _
strComputer & "\root\cimv2")
Set colLoggedEvents = objWMIService.ExecQuery _
("Select * FROM Win32_NTLogEvent WHERE Logfile = 'Security' " & _
"AND EventType = 5")
For Each objEvent in colLoggedEvents
Wscript.Echo "==================================================="
Wscript.Echo "Category: " & objEvent.Category
Wscript.Echo "Computer Name: " & objEvent.ComputerName
Wscript.Echo "Event Code: " & objEvent.EventCode
Wscript.Echo "Message: " & objEvent.Message
Wscript.Echo "Record Number: " & objEvent.RecordNumber
Wscript.Echo "Source Name: " & objEvent.SourceName
dtmEventDate = objEvent.TimeWritten
strTimeWritten = WMIDateStringToDate(dtmEventDate)
Wscript.Echo "Time Written: " & strTimeWritten
Wscript.Echo "Event Type: " & objEvent.Type
Wscript.Echo "User: " & objEvent.User
Wscript.Echo
Next
Function WMIDateStringToDate(dtmEventDate)
WMIDateStringToDate = CDate(Mid(dtmEventDate, 5, 2) & "/" & _
Mid(dtmEventDate, 7, 2) & "/" & Left(dtmEventDate, 4) _
& " " & Mid (dtmEventDate, 9, 2) & ":" & _
Mid(dtmEventDate, 11, 2) & ":" & Mid(dtmEventDate, _
13, 2))
End Function
Dziś nie będziemy wyjaśniać, jak to działa, ale jeśli macie jakieś pytania na ten temat, to dajcie nam znać. Być może zajmiemy się tym bardziej szczegółowo w przyszłości.
Do początku strony