Determinar cuánto tiempo el usuario permanece conectado a Windows
-
08-06-2019 - |
Pregunta
En nuestro producto surgió la necesidad de determinar cuánto tiempo el usuario actual ha iniciado sesión en Windows (específicamente, Vista).Parece que no existe una función API sencilla para esto y no pude encontrar nada relevante con WMI (aunque no soy un experto en WMI, por lo que es posible que me haya perdido algo).
¿Algunas ideas?
Solución
Para las personas que no están familiarizadas con WMI (como yo), aquí hay algunos enlaces:
- Página de MSDN sobre el uso de WMI en varios idiomas: http://msdn.microsoft.com/en-us/library/aa393964(VS.85).aspx
- referencia sobre Win32_Session: http://msdn.microsoft.com/en-us/library/aa394422(VS.85).aspx, pero los objetos en Win32_session son del tipo Win32_LogonSession (http://msdn.microsoft.com/en-us/library/aa394189(VS.85).aspx), que tiene propiedades más interesantes.
- Explorador WMI - una herramienta que puedes utilizar para ejecutar fácilmente consultas como la que publicó Michal.
Y aquí hay un ejemplo de consulta de Win32_Session desde VBS:
strComputer = "."
Set objWMIService = GetObject("winmgmts:" _
& "{impersonationLevel=impersonate}!\\" _
& strComputer & "\root\cimv2")
Set sessions = objWMIService.ExecQuery _
("select * from Win32_Session")
For Each objSession in sessions
Wscript.Echo objSession.StartTime
Next
Alerta 6 sesiones para mi computadora personal, tal vez pueda filtrar por LogonType para enumerar solo los usuarios reales ("interactivos").No pude ver cómo se puede seleccionar la sesión del "usuario actual".
[editar] y aquí hay un resultado de Google para su problema: http://forum.sysinternals.com/forum_posts.asp?TID=3755
Otros consejos
En Powershell y WMI, el siguiente comando de una línea devolverá una lista de objetos que muestran el usuario y la hora en que inició sesión.
Get-WmiObject win32_networkloginprofile | ? {$_.lastlogon -ne $null} | % {[PSCustomObject]@{User=$_.caption; LastLogon=[Management.ManagementDateTimeConverter]::ToDateTime($_.lastlogon)}}
Explicación:
- Recuperar la lista de usuarios conectados desde WMI
- Filtre los usuarios no interactivos (elimina efectivamente
NT AUTHORITY\SYSTEM
) - Reformatea el usuario y el tiempo de inicio de sesión para facilitar la lectura.
Referencias:
- El objeto WMI a utilizar: https://forum.sysinternals.com/topic3755.html
- Formatear la fecha/hora: https://blogs.msdn.microsoft.com/powershell/2009/08/12/get-systemuptime-and-working-with-the-wmi-date-format/
En WMI haz:"Seleccione * de Win32_Session" Allí tendrá el valor "Inicio de la hora".
Espero que ayude.
Al utilizar WMI, Win32Session es un gran comienzo.Además, cabe señalar que si estás en una red puedes usar Win32_NetworkLoginProfile para obtener todo tipo de información.
Set logins = objWMIService.ExecQuery _
("select * from Win32_NetworkLoginProfile")
For Each objSession in logins
Wscript.Echo objSession.LastLogon
Next
Otros datos que puede recopilar incluyen el nombre de usuario, el último cierre de sesión y varios elementos relacionados con el perfil.