sviluppo-web-qa.it

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

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 raramente, ma mi piacerebbe sapere che tutto ciò che sto consultando si 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!

24
Garrett

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.

26
John Gardeniers

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ò di cui hai bisogno è uno script che genera qualsiasi informazione tu voglia e scrive 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
10
ThatGraemeGuy

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 dell'utente come discusso sopra.
Ho usato powershell su DC contro 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.
Potrebbe non essere una soluzione affidabile al 100% (a seconda dei tempi di leasing DHCP, ecc.), Ma ha funzionato per me.

6
marcusjv

È 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 .

6
Adam Brand

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).

4
Maximus Minimus

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 '[email protected]: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()
3

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 registro singolo.

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.

2
Laura Thomas

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
Scott

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")}

1
SS64

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
Lepide

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 diversi eventi, passare da Enciclopedia del registro eventi

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

0
KAPes

Se stai cercando un riferimento storico, puoi provare uno strumento di terze parti come Logon Central da 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
Scott