Déterminer la durée pendant laquelle l'utilisateur est connecté à Windows
-
08-06-2019 - |
Question
Le besoin s'est fait sentir, dans notre produit, de déterminer depuis combien de temps l'utilisateur actuel est connecté à Windows (en particulier Vista).Il semble qu'il n'y ait pas de fonction API simple pour cela et je n'ai rien trouvé de pertinent avec WMI (même si je ne suis pas un expert en WMI, j'ai donc peut-être raté quelque chose).
Des idées?
La solution
Pour les personnes qui ne connaissent pas WMI (comme moi), voici quelques liens :
- Page MSDN sur l'utilisation de WMI à partir de différentes langues : http://msdn.microsoft.com/en-us/library/aa393964(VS.85).aspx
- référence sur Win32_Session : http://msdn.microsoft.com/en-us/library/aa394422(VS.85).aspx, mais les objets dans Win32_session sont de type Win32_LogonSession (http://msdn.microsoft.com/en-us/library/aa394189(VS.85).aspx), qui possède des propriétés plus intéressantes.
- Explorateur WMI - un outil que vous pouvez utiliser pour exécuter facilement des requêtes comme celle publiée par Michal.
Et voici un exemple d'interrogation de Win32_Session à partir de 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
Il alerte 6 sessions pour mon ordinateur personnel, vous pouvez peut-être filtrer par LogonType pour répertorier uniquement les utilisateurs réels ("interactifs").Je ne voyais pas comment sélectionner la session de "l'utilisateur actuel".
[modifier] et voici un résultat de Google concernant votre problème : http://forum.sysinternals.com/forum_posts.asp?TID=3755
Autres conseils
Dans Powershell et WMI, la commande d'une ligne suivante renverra une liste d'objets indiquant l'utilisateur et l'heure à laquelle il s'est connecté.
Get-WmiObject win32_networkloginprofile | ? {$_.lastlogon -ne $null} | % {[PSCustomObject]@{User=$_.caption; LastLogon=[Management.ManagementDateTimeConverter]::ToDateTime($_.lastlogon)}}
Explication:
- Récupérer la liste des utilisateurs connectés depuis WMI
- Filtrer tous les utilisateurs non interactifs (supprime efficacement
NT AUTHORITY\SYSTEM
) - Reformate l'utilisateur et l'heure de connexion pour plus de lisibilité
Les références:
- L'objet WMI à utiliser : https://forum.sysinternals.com/topic3755.html
- Formatage de la date/heure : https://blogs.msdn.microsoft.com/powershell/2009/08/12/get-systemuptime-and-working-with-the-wmi-date-format/
Dans WMI, faites :"Sélectionner * dans Win32_Session" Là, vous aurez la valeur "Startime".
J'espère que cela pourra aider.
En utilisant WMI, la Win32Session est un bon début.De plus, il convient de souligner que si vous êtes sur un réseau, vous pouvez utiliser Win32_NetworkLoginProfile pour obtenir toutes sortes d'informations.
Set logins = objWMIService.ExecQuery _
("select * from Win32_NetworkLoginProfile")
For Each objSession in logins
Wscript.Echo objSession.LastLogon
Next
Les autres informations que vous pouvez collecter incluent le nom d'utilisateur, la dernière déconnexion, ainsi que divers éléments liés au profil.