¿La mejor manera de encontrar la computadora desde la que un usuario inició sesión por última vez?

23

Espero que en algún lugar de Active Directory se escriba / almacene el "último inicio de sesión desde [computadora]", o que haya un registro que pueda analizar.

El propósito de querer saber desde qué última PC inició sesión es ofrecer soporte remoto a través de la red: nuestros usuarios se mueven con poca frecuencia, pero me gustaría saber que lo que sea que esté consultando se está actualizando esa mañana (cuando iniciaron sesión , presumiblemente) como mínimo.

También estoy considerando las secuencias de comandos de inicio de sesión que escriben los nombres de usuario y computadora en una ubicación conocida a la que puedo hacer referencia, pero a algunos de nuestros usuarios no les gusta cerrar sesión durante 15 días seguidos.

Si hay una solución elegante que usa secuencias de comandos de inicio de sesión, definitivamente menciónela, pero si resulta que simplemente desbloquea la estación, ¡eso sería aún mejor!

Garrett
fuente

Respuestas:

26

Como parte de nuestro script de inicio de sesión, tengo esa información (y más) iniciada en un recurso compartido oculto en un servidor, con un archivo de registro por usuario. Las secuencias de comandos de cierre de sesión agregan el tiempo en que el usuario cierra sesión en el mismo archivo de registro. Fácil de configurar, sin costo y la información está disponible en un formato fácil de leer.

John Gardeniers
fuente
Además, al agregar al registro, obtienes un registro histórico, que a veces puede ser muy útil.
John Gardeniers
1
Implementado esto por ahora, probablemente pasará a un vbs con más funciones en el futuro :) Hasta ahora, usando un script de inicio de sesión por lotes MUY simple: echo% date%,% time%,% username%, logon,% computername% >> \\ server \ logon $ \ logons.csv ¡Abre con Excel y listo!
Garrett
¿El script de inicio de sesión se ejecuta como el usuario, en cuyo caso el usuario también podría entrar y modificar el registro?
James Yale el
@ James, es por eso que uso oculto un recurso compartido oculto para almacenar los registros. Por supuesto, dependerá de cuán inteligentes sean sus usuarios, ya que la ubicación se puede obtener simplemente leyendo el guión. No tengo ese problema con mi conjunto actual de usuarios. :)
John Gardeniers
1
Hice algo similar, excepto que el script de inicio de sesión hizo una llamada a un servicio web que actualizó una base de datos. La base de datos tenía un front-end web para ver el estado actual. Sin embargo, fue problemático para los usuarios móviles.
Nic
10

Hacemos esto mediante un script de inicio de sesión que actualiza la descripción del objeto de la computadora en AD.

Debe realizar una delegación de control personalizada para permitir que los "Usuarios autenticados" escriban la propiedad de descripción de los objetos de la computadora en los dominios.

Una vez hecho esto, todo lo que necesita es un script que genere la información que desee y escriba las propiedades en el objeto de la computadora. Este script se asigna como un script de inicio de sesión a través de un objeto de Política de grupo vinculado al dominio.

Ponemos una marca de tiempo, nombre de usuario, IP (s) en el campo de descripción. La marca de tiempo viene primero porque hace que sea fácil ver rápidamente los objetos "viejos" de la computadora al ordenarlos en el campo de descripción.

Aquí está el guión que escribí para esto si quieres usarlo como punto de partida:

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
fuente
¿Cómo delegar a los usuarios autenticados permisos de escritura explícitamente en el objeto de campo de descripción en AD?
NULL.Dude
6

Tuve que lograr el mismo resultado por razones similares; determinar de alguna manera desde qué máquina inició sesión un usuario específico. Quería saber "antes del hecho", y no pude cambiar los scripts de inicio de sesión del usuario como se discutió anteriormente.
Utilicé powershell en el DC con el que el usuario se estaba autenticando para analizar el registro de eventos de seguridad:

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

Abra el .csv con Excel o su editor de favoritos y busque la entrada más reciente que muestre el Nombre de cuenta (Nombre de usuario) y la Dirección de red de origen dentro del mismo evento.
Puede que esta no sea una solución 100% confiable (dependiendo de los tiempos de arrendamiento de DHCP, etc.), pero funcionó para mí.

marcusjv
fuente
6

Puede habilitar la auditoría para eventos de inicio de sesión de cuenta. Estos eventos (incluido el desbloqueo de la estación de trabajo) se almacenarán en el registro de seguridad de DC.

También hay herramientas de terceros que pueden facilitarlo, como True Last Logon .

Adam Brand
fuente
4

Solo escribo el nombre de usuario (así como otra información, como la fecha y la hora, algunas versiones del programa, etc.) en la descripción de la computadora usando un script de inicio de sesión. De esa manera, puedo obtener toda la información de los usuarios y computadoras de AD de forma rápida y fácil, y como beneficio adicional, tengo una buena manera de identificar qué PC que todavía están en AD no se han usado por un tiempo (y, por lo tanto, probablemente sean máquinas muertas).

Maximus Minimus
fuente
3

ThatGraemeGuy , gracias por el excelente guión! Tuve que reescribirlo en PowerShell, pero aún funciona.

$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
fuente
2

El truco para saber con certeza dónde se conectaron los usuarios por última vez aparte de las sugerencias de Adam es la agregación de registros. Si tiene varios controladores de dominio, debe verificarlos todos o centralizar su registro y luego verificar el registro único.

Algunas, tal vez incluso la mayoría, las herramientas de terceros son lo suficientemente inteligentes como para consultar todos los controladores de dominio. Pero si está pensando en escribir un guión para analizarlo usted mismo, no puedo argumentar con suficiente fuerza para centralizar sus registros.

Laura Thomas
fuente
1

Idealmente, capturaría lo siguiente para su equipo CSIRT para ayudar en las invitaciones.

ID de usuario que inicia sesión con el nombre de la estación de trabajo Dirección MAC Dirección IP Fecha / Tipo de inicio de sesión de marca de tiempo (rdp, interfaz, etc.)

Luego volcar eso en un comando sql en una base de datos que pueden consultar. Los bits y las piezas se registran por todas partes, pero grabar esto ahorra tiempo al extraer los datos de los servidores DHCP / WINS, etc.


fuente
1
Creo que esto es un poco exagerado para "Oye, ¿cuál es el nombre de la computadora de Donny?" pero tal vez algún día estaremos a ese nivel: P
Garrett
0

La única forma de tener la información más reciente es mediante la búsqueda de registros. Use una herramienta como Microsoft Operations Manager o una herramienta gratuita como trampa para agregar registros de eventos interesantes del servidor al lugar central (archivos de texto normales o base de datos SQL) y luego use herramientas como logparser o consultas SQL para generar el informe que desee.

para encontrar diferentes ID de eventos para diferentes eventos, vaya a la Enciclopedia de registro de eventos

Avíseme, si desea seguir esta ruta, puedo ayudarlo a crear las consultas apropiadas para logparser.

KAPes
fuente
0

Si busca una referencia histórica, puede probar una herramienta de terceros como Logon Central de Motivate Systems. Registra todos los inicios de sesión de usuarios de Active Directory y proporciona una interfaz web para la minería de datos. También incluye algunos gráficos bastante buenos que traducen las estadísticas de inicio de sesión al porcentaje de uso.


fuente
0

ind Inicie sesión en AD

Muchas veces necesitamos saber si un inicio de sesión particular es parte del grupo de usuarios de anuncios. O a veces necesitamos conocer un grupo de AD y queremos saber quiénes son todos los inicios de sesión.

Hay muchas formas diferentes de lograr esto.

Sigo este paso para crear un acceso directo en mi escritorio donde puedo encontrar fácilmente los inicios de sesión. Siga el proceso como

START-> RUN -> rundll32 dsquery, OpenQueryWindow

Puede encontrar todo el AD del que forma parte, utilizando esto.

Inicio-> Configuración-> Panel de control -> Herramientas del administrador -> Usuario y equipos de Active Directory Seleccione el dominio que desea buscar, haga clic derecho en ese dominio y elija la opción "Buscar".

Lepide
fuente
0

Iba a agregar esto como un comentario a la respuesta de marcusjv anterior, pero no tengo la reputación, por lo que una respuesta por separado tendrá que hacer:

En esa expresión -Y "Dirección de red de origen" siempre se evaluará como VERDADERO

Creo que lo que necesita es: get-eventlog "Seguridad" | donde {$ .Message -like "* username *" -AND $ .Message.contains ("Dirección de red de origen")}

SS64
fuente