Il modo migliore per trovare il computer da cui un utente ha effettuato l'ultimo accesso?


23

Spero che da qualche parte in Active Directory venga scritto / memorizzato l '"ultimo accesso da [computer]" o che ci sia un registro che posso analizzare?

Lo scopo di voler sapere l'ultimo PC da cui è stato effettuato l'accesso è quello di offrire supporto remoto sulla rete: i nostri utenti si spostano abbastanza di rado, ma mi piacerebbe sapere che qualunque cosa io stia consultando stava aggiornando quella mattina (quando hanno effettuato l'accesso , presumibilmente) al minimo.

Sto anche prendendo in considerazione gli script di accesso che scrivono i nomi degli utenti e dei computer in una posizione nota a cui posso fare riferimento, ma ad alcuni dei nostri utenti non piace disconnettersi per 15 giorni alla volta.

Se esiste una soluzione elegante che utilizza script di accesso, menzionalo sicuramente, ma se dovesse funzionare semplicemente per sbloccare la stazione, sarebbe ancora meglio!

Risposte:


26

Come parte del nostro script di accesso ho queste informazioni (e altro) registrate in una condivisione nascosta su un server, con un file di registro per utente. Gli script di disconnessione aggiungono il tempo in cui l'utente si è disconnesso nello stesso file di registro. Facile da configurare, senza costi e le informazioni sono disponibili in un formato di facile lettura.


Inoltre, aggiungendo al registro, si ottiene un record storico, che a volte può essere molto utile.
John Gardeniers,

1
Implementato per ora, probabilmente passerà a un vbs con più funzionalità in futuro :) Finora, usando uno script di accesso batch MOLTO semplice: echo% date%,% time%,% username%, logon,% nomecomputer% >> \\ server \ logon $ \ logons.csv Apri con Excel e sei pronto!
Garrett,

Lo script di accesso viene eseguito come utente, nel qual caso l'utente può anche accedere e modificare il registro?
James Yale,

@James, questo è il motivo per cui uso nascosto una condivisione nascosta per archiviare i registri. Naturalmente dipenderà da quanto siano esperti i tuoi utenti, poiché la posizione può essere ottenuta semplicemente leggendo lo script. Non ho questo problema con il mio attuale set di utenti. :)
John Gardeniers,

1
Ho fatto qualcosa di simile, tranne che lo script di accesso ha effettuato una chiamata a un servizio Web che ha aggiornato un database. Il database aveva un front-end Web per visualizzare lo stato corrente. Tuttavia, era problematico per gli utenti mobili.
Nic

10

Lo facciamo tramite script di accesso che aggiorna la descrizione dell'oggetto computer in AD.

È necessario eseguire una delega di controllo personalizzata per consentire a "Utenti autenticati" di scrivere la proprietà descrizione degli oggetti computer nel dominio / i.

Una volta fatto, tutto ciò che serve è uno script che generi qualsiasi informazione tu voglia e scriva le proprietà sull'oggetto computer. Questo script viene quindi assegnato come script di accesso tramite un oggetto Criteri di gruppo collegato al dominio.

Inseriamo un timestamp, nome utente, IP (s) nel campo della descrizione. Il timestamp viene prima perché rende facile vedere rapidamente "vecchi" oggetti di computer ordinando nel campo della descrizione.

Ecco lo script che ho scritto per questo se vuoi usarlo come punto di partenza:

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

Come delegare gli utenti autenticati scrivere esplicitamente le autorizzazioni sull'oggetto campo descrizione in AD?
NULL

6

Ho dovuto ottenere lo stesso risultato per ragioni simili; in qualche modo determinare da quale macchina un utente specifico ha effettuato l'accesso. Volevo sapere "prima del fatto" e non ho potuto modificare gli script di accesso degli utenti come discusso sopra.
Ho usato PowerShell sul controller di dominio su cui l'utente stava eseguendo l'autenticazione per analizzare il registro eventi di sicurezza:

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

Apri il file .csv con Excel o il tuo editor preferito e cerca la voce più recente che mostra sia il nome account (nome utente) sia l'indirizzo di rete di origine all'interno dello stesso evento.
Questa potrebbe non essere una soluzione affidabile al 100% (a seconda dei tempi di leasing DHCP, ecc.), Ma ha funzionato per me.


6

È possibile abilitare il controllo per gli eventi di accesso all'account. Questi eventi (incluso lo sblocco della workstation) verranno archiviati nel registro di sicurezza del controller di dominio.

Esistono anche strumenti di terze parti che possono semplificarlo, come True Last Logon .


4

Scrivo semplicemente il nome utente (così come altre informazioni, come data e ora, alcune versioni del programma e così via) nella descrizione del computer usando uno script di accesso. In questo modo posso estrarre tutte le informazioni dagli Utenti e dai computer AD in modo rapido e semplice e come bonus ho un buon modo per identificare quali PC ancora in AD non sono stati utilizzati da un po 'di tempo (e quindi sono probabilmente macchine morte).


3

ThatGraemeGuy , grazie per l'eccellente sceneggiatura! Ho dovuto riscriverlo in PowerShell, ma funziona ancora.

$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

Il trucco per sapere con certezza dove gli utenti hanno effettuato l'ultimo accesso oltre ai suggerimenti di Adam è l'aggregazione dei registri. Se si dispone di più controller di dominio, è necessario controllarli tutti oppure centralizzare la registrazione e quindi controllare il singolo registro.

Alcuni, forse anche la maggior parte, strumenti di terze parti sono abbastanza intelligenti da interrogare tutti i controller di dominio. Ma se stai pensando di scrivere una sceneggiatura per analizzarla da solo, non posso discutere abbastanza forte per la centralizzazione dei tuoi registri.


1

Idealmente, dovresti acquisire quanto segue per il tuo team CSIRT per aiutare nelle istigazioni.

userid accesso con nome workstation Indirizzo MAC Indirizzo IP Tipo di accesso data / data / ora (rdp, interfactive ecc)

Dump quindi in un comando sql in un database che possono interrogare. Bit e pezzi sono registrati dappertutto, ma la registrazione in questo modo consente di risparmiare tempo estraendo i dati dai server DHCP / WINS ecc ...


1
Penso che questo sia un po 'eccessivo per "Ehi, come si chiama il computer di Donny?" ma forse un giorno saremo a quel livello: P
Garrett,

0

L'unico modo per avere le informazioni più recenti è tramite la ricerca del registro. Utilizzare uno strumento come Microsoft Operations Manager o uno strumento gratuito come il rullante per aggregare registri eventi interessanti dal server in posizione centrale (normali file di testo o database SQL) e quindi utilizzare strumenti come logparser o query SQL per generare il report desiderato.

per trovare diversi ID evento per eventi diversi, passare attraverso l' Enciclopedia registro eventi

Fammi sapere, se vuoi seguire questa strada, posso aiutarti a creare le query appropriate per logparser.


0

Se stai cercando un riferimento storico, puoi provare uno strumento di terze parti come Logon Central di Motivate Systems. Registra tutti gli accessi utente di Active Directory e fornisce un'interfaccia Web per il data mining. Include anche alcuni grafici piuttosto buoni che traducono le statistiche di accesso in percentuale di utilizzo.


0

ind Accedi in AD

Molte volte è necessario sapere se un determinato accesso fa parte del gruppo di utenti dell'annuncio. O a volte abbiamo bisogno di conoscere un gruppo AD e volevamo sapere chi ne fa parte tutti gli accessi.

Ci sono molti modi diversi per raggiungere questo obiettivo.

Seguo questo passaggio per creare un collegamento sul mio desktop in cui posso facilmente trovare gli accessi Seguire la procedura come

START-> RUN -> rundll32 dsquery, OpenQueryWindow

Puoi trovare tutto l'AD di cui fai parte, usando questo.

Start-> Impostazioni-> Pannello di controllo -> Strumenti amministratore -> Utenti e computer di Active Directory Seleziona il dominio che desideri trovare, fai clic con il pulsante destro del mouse su quel dominio e scegli l'opzione "Trova".


0

Stavo per aggiungere questo come commento alla risposta di marcusjv sopra, ma non ho la reputazione, quindi una risposta separata dovrà fare:

In quell'espressione -E "Indirizzo di rete di origine" verrà sempre valutato come VERO

Penso che ciò di cui hai bisogno sia: get-eventlog "Sicurezza" | dove {$ .Message -like "* username *" -AND $ .Message.contains ("Indirizzo di rete di origine")}

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.