Najlepszy sposób na znalezienie komputera, z którego użytkownik ostatnio się logował?

23

Mam nadzieję, że gdzieś w usłudze Active Directory jest zapisywane / przechowywane „ostatnie logowanie z [komputera]”, czy istnieje dziennik, który mogę przeanalizować?

Chcąc dowiedzieć się, z którego komputera ostatnio zalogowano, jest zaoferowanie zdalnej pomocy przez sieć - nasi użytkownicy poruszają się dość rzadko, ale chciałbym wiedzieć, że wszystko, z czym się konsultowałem, aktualizowało się rano (kiedy się zalogowali) , przypuszczalnie) co najmniej.

Rozważam również skrypty logowania, które zapisują nazwy użytkownika i komputera w znanej lokalizacji, do której mogę się odwoływać, ale niektórzy z naszych użytkowników nie lubią się wylogowywać przez 15 dni.

Jeśli istnieje eleganckie rozwiązanie wykorzystujące skrypty logowania, zdecydowanie wspomnij o nim - ale jeśli zdarza się, że działa tylko w celu odblokowania stacji, byłoby jeszcze lepiej!

Garrett
źródło

Odpowiedzi:

26

W ramach naszego skryptu logowania mam te informacje (i więcej) zalogowane do ukrytego udziału na serwerze, z jednym plikiem dziennika na użytkownika. Skrypty wylogowywania zwiększają czas wylogowania użytkownika do tego samego pliku dziennika. Łatwy w konfiguracji, bez kosztów, a informacje są dostępne w czytelnym formacie.

John Gardeniers
źródło
Dodatkowo, dołączając się do dziennika, otrzymujesz zapis historyczny, który czasami może być bardzo przydatny.
John Gardeniers
1
Zaimplementowano to na razie, prawdopodobnie przejdzie do vbs z większą liczbą funkcji w przyszłości :) Jak dotąd, używając BARDZO prostego skryptu logowania wsadowego: echo% data%,% czas%,% nazwa użytkownika%, logowanie,% nazwa_komputera% >> \\ server \ logon $ \ logons.csv Otwórz w programie Excel i gotowe!
Garrett,
Czy skrypt logowania działa jako użytkownik, w którym to przypadku użytkownik może również wejść i zmodyfikować dziennik?
James Yale
@James, dlatego używam ukrytego ukrytego udziału do przechowywania dzienników. Oczywiście będzie to zależeć od tego, jak sprytni są Twoi użytkownicy, ponieważ lokalizację można uzyskać po prostu czytając skrypt. Nie mam tego problemu z moim bieżącym zestawem użytkowników. :)
John Gardeniers
1
Zrobiłem coś podobnego, z wyjątkiem tego, że skrypt logowania wywołał serwis internetowy, który zaktualizował bazę danych. Baza danych miała interfejs internetowy do wyświetlania bieżącego stanu. Było to jednak problematyczne dla użytkowników mobilnych.
Nic
10

Robimy to za pomocą skryptu logowania, który aktualizuje opis obiektu komputerowego w AD.

Musisz wykonać niestandardowe przekazanie kontroli, aby umożliwić „Uwierzytelnionym użytkownikom” zapisywanie właściwości opisu obiektów komputerowych w domenie / domenach.

Gdy to zrobisz, wszystko czego potrzebujesz to skrypt, który generuje dowolne informacje i zapisuje właściwości do obiektu komputerowego. Ten skrypt jest następnie przypisywany jako skrypt logowania za pośrednictwem obiektu zasad grupy połączonego z domeną.

W polu opisu umieszczamy znacznik czasu, nazwę użytkownika, adresy IP. Znacznik czasu jest najważniejszy, ponieważ ułatwia szybkie przeglądanie „starych” obiektów komputerowych poprzez sortowanie według pola opisu.

Oto skrypt, który dla tego napisałem, jeśli chcesz użyć go jako punktu wyjścia:

On Error Resume Next

Set objSysInfo = CreateObject("ADSystemInfo") 'Bind to AD
Set objNet = CreateObject("WScript.Network")

strCompDN = objSysInfo.ComputerName 'DN for computer, e.g. "CN=VISTAWORKSTATION,OU=Child OU Name,OU=Parent OU Name,DC=domain,DC=com"
Set objComp = GetObject("LDAP://" & strCompDN) 'IADsComputer object

strUserDN = objSysInfo.UserName 'DN for user, e.g. "CN=John Smith,OU=Child OU Name,OU=Parent OU Name,DC=domain,DC=com"
Set objUser = GetObject("LDAP://" & strUserDN) 'IADsUser object

strUsrLogin = LCase(objNet.UserName)

strNow = Now
strDateStamp = DatePart("yyyy",strNow) & _
    Right("0" & DatePart("m",strNow), 2) & _
    Right("0" & DatePart("d",strNow), 2) & _
    "@" & _
    Right("0" & DatePart("h",strNow), 2) & _
    Right("0" & DatePart("n",strNow), 2)

'RegExp object used to perform a simple match on IP address
Set objRE = New RegExp
objRE.IgnoreCase = True
'Note this regexp pattern isn't "correct" for matching an IPv4 address properly, but since WMI will return an
'array of IP addresses, this is sufficient to distinguish IPv4 vs IPv6
objRE.Pattern = "^\d+\.\d+\.\d+\.\d+$"

strIP = ""

'Connect to WMI and retreive all network adapters
Set objWMI = GetObject("winmgmts:")
Set colNICs = objWMI.ExecQuery("SELECT * FROM Win32_NetworkAdapterConfiguration")

'Get the IP(s) assigned to whichever network adapter has our default gateway
If colNICs.Count > 0 Then
    For Each objNIC in colNICs
        If IsArray(objNIC.DefaultIPGateway) Then
            arrIP = objNIC.IPAddress
            For i = 0 To UBound(arrip)
                If objRE.Test(arrIP(i)) Then strIP = strIP & " " & arrIP(i)
            Next
            strMAC = objNIC.MACAddress
        End If  
    Next
End If

strIP = Trim(strIP)

objComp.Description = strDateStamp & " " & strUsrLogin & " " & strIP
objComp.Put "extensionAttribute1", strUsrLogin
objComp.Put "extensionAttribute2", strIP
objComp.Put "extensionAttribute3", strMAC

objComp.SetInfo
ThatGraemeGuy
źródło
Jak delegować uwierzytelnionych użytkowników zapisywanie uprawnień do obiektu pola opisu w AD?
NULL. Koleś
6

Musiałem osiągnąć ten sam wynik z podobnych powodów; jakoś określić, z którego komputera zalogował się określony użytkownik. Chciałem wiedzieć „przed faktem” i nie mogłem zmienić skryptów logowania użytkownika, jak omówiono powyżej.
Użyłem programu PowerShell na kontrolerze domeny, przed którym użytkownik uwierzytelniał się, aby przeanalizować dziennik zdarzeń zabezpieczeń:

get-eventlog "Security" | where {$_.Message -like "*Username*" -AND "Source Network Address"} | export-csv C:\Temp\test.csv

Otwórz crack .csv za pomocą programu Excel lub edytora ulubionych i poszukaj najnowszego wpisu, który pokazuje zarówno nazwę konta (nazwę użytkownika), jak i źródłowy adres sieciowy w ramach tego samego zdarzenia.
To może nie być w 100% niezawodne rozwiązanie (w zależności od czasów dzierżawy DHCP itp.), Ale zadziałało dla mnie.

marcusjv
źródło
6

Możesz włączyć inspekcję zdarzeń logowania do konta. Te zdarzenia (w tym odblokowanie stacji roboczej) zostaną zapisane w dzienniku bezpieczeństwa kontrolera domeny.

Istnieją również narzędzia innych firm, które mogą to ułatwić, takie jak True Last Logon .

Adam Brand
źródło
4

Po prostu wpisuję nazwę użytkownika (a także inne informacje, takie jak data i godzina, niektóre wersje programów itp.) W opisie komputera za pomocą skryptu logowania. W ten sposób mogę szybko i łatwo pobrać wszystkie informacje z użytkowników i komputerów AD, a jako bonus mam dobry sposób na identyfikację komputerów, które jeszcze w AD nie były używane od dłuższego czasu (a zatem najprawdopodobniej są martwymi maszynami).

Maximus Minimus
źródło
3

ThatGraemeGuy , dzięki za doskonały skrypt! Musiałem przepisać go w PowerShell, ale nadal działa.

$CompDN = "(&(objectCategory=computer)(objectClass=computer)(cn=$env:COMPUTERNAME))"
$strCompDN = [string]([adsisearcher]$CompDN).FindOne().Properties.distinguishedname
$objComp = [ADSI]("LDAP://"+$strCompDN)

# quit if computer is a server or DC
if (($strCompDN -like '*Controller*') -or ($strCompDN -like '*SERVER*')) { exit }

$strUsrLogin = $env:username
$strDateStamp = Get-Date -f 'yyyy-MM-dd@HH:mm'
$IPPattern = "^\d+\.\d+\.\d+\.\d+$"

$colNICs = gwmi Win32_NetworkAdapterConfiguration
if ($colNICs.Count -gt 0) {
foreach ($objNIC in $colNICs){
        if ($objNIC.DefaultIPGateway) {
            $arrIP = $objNIC.IPAddress
            for ($i=0; $i -lt $colNICs.Count; $i++) { 
            if ($arrIP[$i] -match $IPPattern) { $strIP = $arrIP[$i]; $strMAC = $objNIC.MACAddress }
            }
        }
    }
}

$objComp.Description = $strDateStamp + " - " + $strUsrLogin + " - " + $strIP
$objComp.extensionAttribute1 = $strUsrLogin
$objComp.extensionAttribute2 = $strIP
$objComp.extensionAttribute3 = $strMAC
$objComp.SetInfo()
Matvey Solodovnikov
źródło
2

Sztuczka polegająca na tym, aby z całą pewnością wiedzieć, gdzie użytkownicy ostatnio się logowali oprócz sugestii Adama, polega na agregacji dziennika. Jeśli masz wiele kontrolerów domeny, musisz sprawdzić je wszystkie lub scentralizować rejestrowanie, a następnie sprawdzić pojedynczy dziennik.

Niektóre, a nawet większość narzędzi innych firm są wystarczająco inteligentne, aby przesyłać zapytania do wszystkich kontrolerów domeny. Ale jeśli zastanawiasz się nad napisaniem skryptu, aby sam go przeanalizować, nie mogę argumentować wystarczająco silnie, aby scentralizować twoje dzienniki.

Laura Thomas
źródło
1

Idealnie byłoby uchwycić następujące informacje dla zespołu CSIRT, aby pomóc w przeprowadzeniu dochodzenia.

identyfikator użytkownika logujący się przy użyciu nazwy stacji roboczej adres MAC adres IP data / znacznik czasu typ logowania (rdp, interfactive itp.)

Następnie zrzuć to do polecenia sql do bazy danych, którą mogą zapytać. Bity i kawałki są rejestrowane w dowolnym miejscu, ale rejestrowanie tego oszczędza czas pobierania danych z serwerów DHCP / WINS itp.


źródło
1
Myślę, że to trochę przesada w przypadku „Hej, jak nazywa się komputer Donny?” ale może kiedyś będziemy na tym poziomie: P
Garrett
0

Jedynym sposobem na uzyskanie najświeższych informacji jest wyszukiwanie w logach. Użyj narzędzia takiego jak Microsoft Operations Manager lub darmowego narzędzia, takiego jak werbel, aby agregować interesujące dzienniki zdarzeń z serwera do centralnego miejsca (normalne pliki tekstowe lub baza danych SQL), a następnie użyj narzędzi takich jak logparser lub zapytania SQL, aby wygenerować raport, który chcesz.

aby znaleźć różne identyfikatory zdarzeń dla różnych zdarzeń, przejdź do Encyklopedii dziennika zdarzeń

Daj mi znać, jeśli chcesz podążać tą drogą, pomogę ci utworzyć odpowiednie zapytania dla logparsera.

KAPes
źródło
0

Jeśli szukasz informacji historycznych, możesz wypróbować narzędzie innej firmy, takie jak Logon Central z Motivate Systems. Rejestruje wszystkie logowania użytkowników Active Directory i zapewnia interfejs sieciowy do eksploracji danych. Zawiera także całkiem niezłe wykresy, które tłumaczą statystyki logowania na procent wykorzystania.


źródło
0

ind Zaloguj się w AD

Wiele razy musimy wiedzieć, czy określony login należy do grupy użytkowników reklam. Lub czasami musimy znać grupę AD i chcieliśmy wiedzieć, kto jest częścią tego loginu.

Istnieje wiele różnych sposobów osiągnięcia tego celu.

Wykonuję ten krok, aby utworzyć skrót na pulpicie, na którym mogę łatwo znaleźć dane logowania. Postępuj zgodnie z procedurą jak

START-> RUN -> rundll32 dsquery, OpenQueryWindow

Korzystając z tego, możesz znaleźć wszystkie reklamy, których jesteś częścią.

Start-> Ustawienia-> Panel sterowania -> Narzędzia administratora -> Użytkownik i komputery usługi Active Directory Wybierz domenę, w której chcesz się zalogować, kliknij tę domenę prawym przyciskiem myszy i wybierz opcję „Znajdź”.

Lepide
źródło
0

Chciałem dodać to jako komentarz do powyższej odpowiedzi marcusjv, ale nie mam reputacji, więc osobna odpowiedź będzie musiała:

W tym wyrażeniu -AND „Źródłowy adres sieciowy” zawsze będzie mieć wartość PRAWDA

Myślę, że potrzebujesz: get-eventlog „Security” | gdzie {$ .Message-like „* nazwa użytkownika *” -AND $ .Message.contains („Source Network Address”)}

SS64
źródło