2012-02-24 15 views
7

Quiero contar el número de inicios y cierres de sesión en los usuarios de sus computadoras. Tomo la información para inicios de sesión/cierres de sesión de los registros de eventos de Windows (de la clase Win32_NTLogEvent WMI). Por ejemplo con el siguiente consulta:Contar inicios y cierres de sesión en la computadora Windows 7

select * from Win32_NtLogEvent 
where EventCode = 4648 and TimeGenerated > '20120224000000.000000-***' 

Pero cuando el equipo se ha reiniciado o iniciado cuenta los inicios de sesión 3, cuando el usuario ha hecho clic o cierre de sesión de bloqueo (desde el menú de inicio) y luego iniciar sesión cuenta de inicio de sesión 1. El usuario se autentica a través de Windows Active Directory. ¿Influye en el número de inicios de sesión? ¿Puedo contar solo el número de inicios de sesión usando credenciales explícitas en los usuarios?

Encontré EventCode: 4608 y 4609 para iniciar y cerrar Windows, pero también necesito el número de inicios de sesión cuando el usuario ha desconectado o bloqueado la computadora.

+0

No sé si esto ayuda: http://msdn.microsoft.com/en-us/library/windows/desktop/ms676845(v=vs.85).aspx – Simon

+0

¿Está tratando de contar el desbloqueo de la estación de trabajo? o tratando de evitar contarlo? –

+0

Estoy tratando de contar el tiempo dedicado de los usuarios en la computadora. –

Respuesta

4

He encontrado esta solución here:

strComputer = "." 
Set objWMIService = GetObject("winmgmts:{(Security)}\\" & _ 
    strComputer & "\root\cimv2") 

Set colEvents = objWMIService.ExecQuery _ 
    ("SELECT * FROM Win32_NTLogEvent WHERE LogFile = 'Security' AND " & _ 
     "EventCode = 528 AND User = 'fabrikam\\kmyer'") 

Wscript.Echo colEvents.Count 

Sólo tiene que sustituir los valores con los que desee.

Ahora bien, este no es un código de Java sino de VB ... Sin embargo, aparentemente utiliza la interfaz de WMI que podría utilizar desde su programa de Java. O podría hacer algo feo e invocar un script por lotes desde Java (o tarea programada) y leer su resultado, o usar un enlace.

Esto, por supuesto, supone que desea comprobar esto en la computadora del usuario, como su pregunta insinuó. Si desea contar los inicios de sesión a un nivel más global y desde diferentes máquinas, debe consultar el Directorio Activo (u otro mecanismo que esté utilizando la infraestructura en red); el hilo enlazado ofrece soluciones para esto también.

Actualización:

Puede echar un vistazo a Eric Fitzgerald 's blog mensaje el Tracking User Logon Activity Using Logon Events, donde tiene los códigos correspondientes (así como fórmulas completas para el seguimiento de la hora exacta).

Parece que desea los códigos de evento 4624 (LOGON) y 4634 (LOGOFF), más otros enumerados allí si planea usar las fórmulas de Fitzgerald para calcular el tiempo de actividad exacto.

+0

Windows 7 no genera evento con el código 528 ... –

+0

@VentsislavMarinov: vea la actualización. – haylem

1

Un mejor enfoque sería utilizar un system service.

La función de devolución de llamada HandlerEx, definida por RegisterServiceCtrlHandlerEx, se puede configurar para recibir session change notifications, incluidos los eventos de inicio de sesión, cierre de sesión, bloqueo y desbloqueo.

No estoy del todo seguro de si los eventos de cierre de sesión recibidos por HandlerEx son confiables o si presentan los mismos problemas que el registro de eventos. Como copia de seguridad, SetConsoleCtrlHandler le permite definir una función de devolución de llamada para recibir notificaciones de cierre de sesión. Estas notificaciones son confiables.

Las funciones de la API de servicios de escritorio remoto, como WTSEnumerateSessions, también pueden ser útiles, permitiéndole enumerar los usuarios actualmente conectados en cualquier momento u obtener información adicional sobre una sesión determinada. Solo un subconjunto de estas funciones están disponibles en las estaciones de trabajo, pero son las que necesita.

Cuestiones relacionadas