Centrum skryptów - Systemy operacyjne

Czy mogę pobrać dokładne zdarzenia niepowodzeń z dziennika zdarzeń bezpieczeństwa? Udostępnij na: Facebook

Skrypciarze odpowiadają na Wasze pytania

Cześć Skrypciarze!

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 Do początku strony


Centrum skryptów - Systemy operacyjne