Centrum skryptów - Systemy operacyjne

Jak pobrać listę użytkowników unikatowych z dziennika zdarzeń związanych z zabezpieczeniami?

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.

Jak pobrać listę użytkowników unikatowych z dziennika zdarzeń związanych z zabezpieczeniami?

Cześć Skrypciarze! Pytanie

Cześć Skrypciarze! Jak pobrać listę użytkowników unikatowych z dziennika zdarzeń związanych z zabezpieczeniami?

-- KM

Cześć Skrypciarze! Odpowiedź

Cześć, KM. Nie wiem, dlaczego tak się czasem dzieje, że wydaje się, iż wszystkie siły na Ziemi zaczynają nagle działać przeciwko mnie. Mam takie wrażenie od rana, co chwilę dzieje się coś, co uniemożliwia mi normalną pracę, jak wiadomo oderwanie od pracy powoduje u mnie zdenerwowanie, a wtedy z nerwów nie mogę się skupić i frustruję jeszcze bardziej. Najgorsze są jakieś usterki techniczne, albo nawet nie tyle usterki, co przerwy techniczne. No bo wyobraźcie sobie taką sytuację: idziecie jak zwykle do pracy z zamiarem odpisania na 300 wiadomości e-mail do znajomych i pogrania online z kolegami w Medal of Honor, a tu nagle okazuje się, że Internetu nie będzie przez cały dzień. Wiem, jakie to nieprawdopodobne, ale to taki obrazowy przykład, mnie zdarzyło się dziś coś podobnego. Straszna historia. Opowiem ją innym razem, teraz muszę się bardzo skoncentrować, żeby odpowiedzieć na pytanie KM dotyczące pobierania listy użytkowników unikatowych z dziennika zdarzeń związanych z zabezpieczeniami.

Nie jest to łatwe, ale na szczęście skrypt nie jest długi:

On Error Resume Next



strComputer = "."



Set objWMIService = GetObject("winmgmts:{(Security)}\\" & strComputer & "\root\cimv2")



Set colEvents = objWMIService.ExecQuery _

    ("Select * from Win32_NTLogEvent Where Logfile = 'Security'")



Set objDictionary = CreateObject("Scripting.Dictionary")



For Each objEvent in colEvents

    If Not objDictionary.Exists(objEvent.User) Then

        objDictionary.Add objEvent.User, objEvent.User   

    End If

Next



For Each strKey in objDictionary.Keys

    Wscript.Echo strKey

Next

Skupmy się na tym, jak ten skrypt działa. Na początek, łączymy się z usługą WMI na lokalnym komputerze; gdybyśmy jednak chcieli, moglibyśmy równie dobrze uruchomić go na zdalnym komputerze. (W jaki sposób? Przypisując nazwę tego zdalnego komputera do zmiennej o nazwie strComputer.) Po utworzeniu połączenia z usługą WMI upewniamy się, że nasze wywołanie GetObject wygląda następująco:

GetObject("winmgmts:{(Security)}\\" & strComputer & "\root\cimv2")

Jak widać, w tym skrypcie uwzględniliśmy uprawnienia Security, ujmując je w nawiasy zwykłe i klamrowe i dodając je na końcu, zaraz po monikerze winmgmts. Dlaczego? No cóż, bez tych uprawnień skrypt nie przekaże nam żadnych danych. (Nie otrzymamy komunikatu o błędzie, ale także żadnych innych informacji.) Uprawnienia Security są wymagane przy każdej próbie dostępu do dziennika zdarzeń związanych z zabezpieczeniami. Jeżeli ich nie będzie, cóż, ostrzegałem.

Uwaga. Wcale nie żartuję z tymi uprawnieniami. One naprawdę są potrzebne. Więc nie ma co sprawdzać, czy aby na pewno nie żartuję i nie kombinuję niepotrzebnie, po prostu zróbcie tak, jak mówię.

Po połączeniu się z usługą WMI stosujemy poniższy wiersz kodu w celu pobrania kolekcji wszystkich zdarzeń znajdujących się w dzienniku zdarzeń związanych z zabezpieczeniami:

Set colEvents = objWMIService.ExecQuery _

    ("Select * from Win32_NTLogEvent Where Logfile = 'Security'")

O jednym musimy teraz pamiętać: w zależności od liczby rekordów w dzienniku zdarzeń związanych z zabezpieczeniami, skrypt może działać minutę lub dwie (czasem nawet dłużej). Ja czyszczę swój dziennik zdarzeń z dużą częstotliwością; przy ponad 51 tys. zdarzeń w dzienniku, u mnie skrypt zakończył działanie w ciągu 90 sekund.

Wcześniej czy później otrzymamy kolekcję wszystkich zdarzeń znajdujących się w dzienniku zdarzeń związanych z zabezpieczeniami. Po otrzymaniu tej kolekcji tworzymy wystąpienie obiektu Scripting.Dictionary, które zastosujemy do śledzenia użytkowników unikatowych znajdujących się w dzienniku zdarzeń. Kiedy będziemy gotowi, zabieramy się ostro do pracy.

Najpierw uruchamiamy pętlę For Each, która przejdzie przez wszystkie zdarzenia znajdujące się w kolekcji. Wewnątrz tej pętli stosujemy poniższy wiersz kodu:

If Not objDictionary.Exists(objEvent.User) Then

Sprawdzamy w ten sposób, czy użytkownik określony we właściwości User zdarzenia istnieje już w obiekcie Dictionary. Jeżeli tak, kontynuujemy działanie pętli i sprawdzamy następne zdarzenie w kolekcji; z uwagi na fakt, że nas interesują tylko użytkownicy unikatowi, nie ma potrzeby dodawania tego użytkownika po raz drugi. (Poza tym obiekt nie zezwala na duplikowanie elementów.) Jeżeli użytkownika nie ma w obiekcie Dictionary, stosujemy następujący wiersz kodu, aby go dodać, określając wartość właściwości User jako zarówno Item, jak i Key obiektu Dictionary:

objDictionary.Add objEvent.User, objEvent.User

Teraz wracamy na początek pętli i próbujemy ponownie z następnym zdarzeniem w kolekcji.

Po opuszczeniu pętli stosujemy poniższy wiersz kodu, aby wywołać echo naszej kolekcji użytkowników unikatowych:

For Each strKey in objDictionary.Keys

    Wscript.Echo strKey

Next

Otrzymamy wynik podobny do poniższego:

NT AUTHORITY\NETWORK SERVICE

NT AUTHORITY\LOCAL SERVICE

NT AUTHORITY\SYSTEM

FABRIKAM\kmyer

NT AUTHORITY\ANONYMOUS LOGON

FABRIKAM\packerman

A teraz co? Koniec pracy, cel osiągnięty. Ja idę na obiad.

 Do początku strony Do początku strony

Centrum skryptów - Microsoft Office