Der beste Weg, um den Computer zu finden, auf dem sich ein Benutzer zuletzt angemeldet hat?


23

Ich hoffe, dass irgendwo in Active Directory das "zuletzt angemeldete von [Computer]" geschrieben / gespeichert wird, oder gibt es ein Protokoll, das ich auswerten kann?

Der Zweck, den letzten angemeldeten PC kennen zu wollen, besteht darin, Remote-Support über das Netzwerk anzubieten - unsere Benutzer bewegen sich ziemlich selten herum, aber ich möchte wissen, dass das, worum es geht, an diesem Morgen aktualisiert wurde (wenn sie sich angemeldet haben) vermutlich) mindestens.

Ich denke auch über Anmeldeskripte nach, die die Benutzer- und Computernamen an einen bekannten Ort schreiben, auf den ich verweisen kann, aber einige unserer Benutzer möchten sich nicht für jeweils 15 Tage abmelden.

Wenn es eine elegante Lösung gibt, die Anmeldeskripte verwendet, erwähnen Sie sie auf jeden Fall - aber wenn es nur darum geht, die Station zu entsperren, wäre das sogar noch besser!

Antworten:


26

Im Rahmen unseres Anmeldeskripts sind diese Informationen (und mehr) in einer verborgenen Freigabe auf einem Server mit einer Protokolldatei pro Benutzer angemeldet. Ein Abmeldeskript fügt die Zeit hinzu, zu der sich der Benutzer bei derselben Protokolldatei abgemeldet hat. Einfach einzurichten, keine Kosten und die Informationen sind in einem einfach zu lesenden Format vorhanden.


Durch das Anhängen an das Protokoll erhalten Sie außerdem eine historische Aufzeichnung, die manchmal sehr praktisch sein kann.
John Gardeniers

1
Implementiert dies für den Moment, wird wahrscheinlich in Zukunft auf ein vbs mit mehr Funktionen umsteigen :) Bisher wurde ein SEHR einfaches Batch-Anmeldeskript verwendet: echo% date%,% time%,% username%, logon,% computername% >> \\ server \ logon $ \ logons.csv Mit Excel öffnen und fertig!
Garrett

Wird das Anmeldeskript als Benutzer ausgeführt. In diesem Fall kann der Benutzer auch das Protokoll ändern.
James Yale

@ James, aus diesem Grund verwende ich eine versteckte Freigabe, um die Protokolle zu speichern. Natürlich hängt es davon ab, wie erfahren Ihre Benutzer sind, da der Standort durch einfaches Lesen des Skripts ermittelt werden kann. Ich habe dieses Problem nicht mit meiner aktuellen Gruppe von Benutzern. :)
John Gardeniers

1
Ich habe etwas Ähnliches getan, außer dass das Anmeldeskript einen Webdienst aufgerufen hat, der eine Datenbank aktualisiert hat. Die Datenbank hatte ein Web-Frontend, um den aktuellen Status anzuzeigen. Für mobile Nutzer war dies jedoch problematisch.
Nic

10

Dies geschieht über ein Anmeldeskript, das die Beschreibung des Computerobjekts in AD aktualisiert.

Sie müssen eine benutzerdefinierte Delegierung der Steuerung durchführen, damit "Authentifizierte Benutzer" die Beschreibungseigenschaft von Computerobjekten in der Domäne / den Domänen schreiben können.

Danach benötigen Sie lediglich ein Skript, das die gewünschten Informationen generiert und die Eigenschaften in das Computerobjekt schreibt. Dieses Skript wird dann über ein mit der Domäne verknüpftes Gruppenrichtlinienobjekt als Anmeldeskript zugewiesen.

Wir geben einen Zeitstempel, einen Benutzernamen und eine IP-Adresse in das Beschreibungsfeld ein. Der Zeitstempel steht an erster Stelle, da "alte" Computerobjekte durch Sortieren im Beschreibungsfeld schnell erkannt werden können.

Hier ist das Skript, das ich dafür geschrieben habe, wenn Sie es als Ausgangspunkt verwenden möchten:

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

Wie delegiert man authentifizierte Benutzer, die explizite Schreibberechtigungen für das Beschreibungsfeldobjekt in AD haben?
NULL.Dude

6

Aus ähnlichen Gründen musste ich das gleiche Ergebnis erzielen. irgendwie feststellen, von welchem ​​Rechner sich ein bestimmter Benutzer angemeldet hat. Ich wollte "vor der Tatsache" wissen und konnte Benutzeranmeldeskripte wie oben beschrieben nicht ändern.
Ich habe Powershell auf dem Domänencontroller verwendet, anhand dessen sich der Benutzer authentifiziert hat, um das Sicherheitsereignisprotokoll zu analysieren:

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

Öffnen Sie die CSV-Datei mit Excel oder Ihrem FAV-Editor und suchen Sie nach dem neuesten Eintrag, in dem sowohl der Kontoname (Benutzername) als auch die Quellnetzwerkadresse innerhalb desselben Ereignisses angezeigt werden.
Dies ist möglicherweise keine 100% zuverlässige Lösung (abhängig von den DHCP-Lease-Zeiten usw.), aber es hat bei mir funktioniert.



4

Ich schreibe einfach den Benutzernamen (sowie andere Informationen wie Datum und Uhrzeit, einige Programmversionen usw.) mithilfe eines Anmeldeskripts in die Beschreibung des Computers. Auf diese Weise kann ich schnell und einfach alle Informationen von AD Users & Computers abrufen und als Bonus eine gute Möglichkeit finden, festzustellen, welche PCs in AD noch eine Weile nicht verwendet wurden (und daher höchstwahrscheinlich tote Computer sind).


3

ThatGraemeGuy , danke für das hervorragende Drehbuch! Ich musste es in PowerShell umschreiben, aber es funktioniert immer noch.

$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()

2

Der Trick, um zu wissen, wo sich Benutzer zuletzt angemeldet haben, ist neben den Vorschlägen von Adam die Protokollaggregation. Wenn Sie über mehrere Domänencontroller verfügen, müssen Sie entweder alle überprüfen oder die Protokollierung zentralisieren und dann das einzelne Protokoll überprüfen.

Einige, vielleicht sogar die meisten Tools von Drittanbietern sind intelligent genug, um alle Domänencontroller abzufragen. Aber wenn Sie darüber nachdenken, ein Skript zu schreiben, um es selbst zu analysieren, kann ich nicht stark genug argumentieren, um Ihre Protokolle zu zentralisieren.


1

Idealerweise würden Sie Folgendes für Ihr CSIRT-Team erfassen, um bei Untersuchungen zu helfen.

Benutzer-ID, die sich mit dem Namen der Arbeitsstation anmeldet. MAC-Adresse IP-Adresse Datum / Zeitstempel Anmeldetyp (rdp, interaktiv usw.)

Speichern Sie das dann in einem SQL-Befehl in einer Datenbank, die sie abfragen können. Überall werden Kleinigkeiten protokolliert, aber das Aufzeichnen spart Zeit, indem die Daten von DHCP / WINS-Servern usw. abgerufen werden.


1
Ich denke, das ist ein bisschen übertrieben für "Hey, wie heißt Donnys Computer?" aber vielleicht werden wir eines Tages auf diesem Level sein: P
Garrett

0

Die einzige Möglichkeit, die neuesten Informationen zu erhalten, ist die Suche nach Protokollen. Verwenden Sie ein Tool wie Microsoft Operations Manager oder ein kostenloses Tool wie Snare, um interessante Ereignisprotokolle vom Server an einem zentralen Ort (normale Textdateien oder SQL-Datenbank) zu sammeln, und verwenden Sie dann Tools wie Logparser oder SQL-Abfragen, um den gewünschten Bericht zu erstellen.

Informationen zum Auffinden verschiedener Ereignis-IDs für verschiedene Ereignisse finden Sie in der Ereignisprotokoll-Enzyklopädie

Lassen Sie mich wissen, wenn Sie dieser Route folgen möchten, kann ich Ihnen helfen, die entsprechenden Abfragen für den Logparser zu erstellen.


0

Wenn Sie nach einer historischen Referenz suchen, können Sie ein Tool eines Drittanbieters wie Logon Central von Motivate Systems ausprobieren . Es zeichnet alle Active Directory-Benutzeranmeldungen auf und bietet eine Weboberfläche für Data Mining. Es enthält auch einige ziemlich gute Diagramme, die Anmeldestatistiken in Prozent Auslastung umsetzen.


0

ind Login in AD

Oft müssen wir wissen, ob eine bestimmte Anmeldung Teil einer Anzeigenbenutzergruppe ist. Oder manchmal müssen wir eine AD-Gruppe kennen und wollten wissen, wer alle Logins dazugehören.

Es gibt viele verschiedene Möglichkeiten, dies zu erreichen.

Ich folge diesem Schritt, um eine Verknüpfung auf meinem Desktop zu erstellen, auf der ich die Anmeldungen leicht finden kann. Bitte folgen Sie dem Prozess als

START-> RUN -> rundll32 dsquery, OpenQueryWindow

Hiermit können Sie alle ADs finden, zu denen Sie gehören.

Start-> Einstellungen-> Systemsteuerung -> Administrator-Tools -> Active Directory-Benutzer und -Computer Wählen Sie die Domäne aus, deren Anmeldung Sie suchen möchten, klicken Sie mit der rechten Maustaste auf diese Domäne und wählen Sie die Option „Suchen“.


0

Ich wollte dies als Kommentar zu Marcusjvs Antwort hinzufügen, aber ich habe nicht den Ruf, so dass eine separate Antwort genügen muss:

In diesem Ausdruck wird -AND "Source Network Address" immer als TRUE ausgewertet

Ich denke, was Sie brauchen, ist: get-eventlog "Security" | Dabei enthält {$ .Message-like "* username *" -AND $ .Message.contains ("Source Network Address")}

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.