Determinar por quanto tempo o usuário está conectado ao Windows
-
08-06-2019 - |
Pergunta
Surgiu a necessidade, em nosso produto, de determinar há quanto tempo o usuário atual está conectado ao Windows (especificamente, Vista).Parece que não existe uma função de API direta para isso e não consegui encontrar nada relevante com o WMI (embora não seja especialista em WMI, então posso ter perdido alguma coisa).
Alguma ideia?
Solução
Para pessoas que não estão familiarizadas com o WMI (como eu), aqui estão alguns links:
- Página do MSDN sobre o uso do WMI em vários idiomas: http://msdn.microsoft.com/en-us/library/aa393964(VS.85).aspx
- referência sobre Win32_Session: http://msdn.microsoft.com/en-us/library/aa394422(VS.85).aspx, mas os objetos em Win32_session são do tipo Win32_LogonSession (http://msdn.microsoft.com/en-us/library/aa394189(VS.85).aspx), que possui propriedades mais interessantes.
- Explorador WMI - uma ferramenta que você pode usar para executar facilmente consultas como a que Michal postou.
E aqui está um exemplo de consulta Win32_Session do 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
Ele alerta 6 sessões para meu computador pessoal, talvez você possa filtrar por LogonType para listar apenas os usuários reais ("interativos").Não consegui ver como você pode selecionar a sessão do "usuário atual".
[editar] e aqui está um resultado do Google para o seu problema: http://forum.sysinternals.com/forum_posts.asp?TID=3755
Outras dicas
No Powershell e no WMI, o comando de uma linha a seguir retornará uma lista de objetos mostrando o usuário e a hora em que ele fez logon.
Get-WmiObject win32_networkloginprofile | ? {$_.lastlogon -ne $null} | % {[PSCustomObject]@{User=$_.caption; LastLogon=[Management.ManagementDateTimeConverter]::ToDateTime($_.lastlogon)}}
Explicação:
- Recuperar a lista de usuários logados do WMI
- Filtre todos os usuários não interativos (remove efetivamente
NT AUTHORITY\SYSTEM
) - Reformata o usuário e o tempo de logon para facilitar a leitura
Referências:
- O objeto WMI a ser usado: https://forum.sysinternals.com/topic3755.html
- Formatando a data/hora: https://blogs.msdn.microsoft.com/powershell/2009/08/12/get-systemuptime-and-working-with-the-wmi-date-format/
No WMI faça:"Selecione * no valor Win32_Session", você terá o valor "StartTime".
Espero que ajude.
Usando o WMI, o Win32Session é um ótimo começo.Além disso, deve-se ressaltar que se você estiver em uma rede, poderá usar Win32_NetworkLoginProfile para obter todo tipo de informação.
Set logins = objWMIService.ExecQuery _
("select * from Win32_NetworkLoginProfile")
For Each objSession in logins
Wscript.Echo objSession.LastLogon
Next
Outras informações que você pode coletar incluem o nome de usuário, último logoff, bem como vários itens relacionados ao perfil.