Bestimmen, wie lange der Benutzer bei Windows angemeldet ist
-
08-06-2019 - |
Frage
In unserem Produkt entstand die Notwendigkeit, festzustellen, wie lange der aktuelle Benutzer bereits bei Windows (insbesondere Vista) angemeldet ist.Es scheint, dass es hierfür keine direkte API-Funktion gibt, und ich konnte mit WMI nichts Relevantes finden (obwohl ich kein WMI-Experte bin und daher möglicherweise etwas übersehen habe).
Irgendwelche Ideen?
Lösung
Für Leute, die mit WMI nicht vertraut sind (wie ich), hier einige Links:
- MSDN-Seite zur Verwendung von WMI aus verschiedenen Sprachen: http://msdn.microsoft.com/en-us/library/aa393964(VS.85).aspx
- Referenz zu Win32_Session: http://msdn.microsoft.com/en-us/library/aa394422(VS.85).aspx, aber die Objekte in Win32_session sind vom Typ Win32_LogonSession (http://msdn.microsoft.com/en-us/library/aa394189(VS.85).aspx), das interessantere Eigenschaften hat.
- WMI-Explorer – ein Tool, mit dem Sie ganz einfach Abfragen wie die von Michal gepostete ausführen können.
Und hier ist ein Beispiel für die Abfrage von Win32_Session von 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
Es werden 6 Sitzungen für meinen PC angezeigt. Vielleicht können Sie nach LogonType filtern, um nur die echten („interaktiven“) Benutzer aufzulisten.Ich konnte nicht sehen, wie man die Sitzung des „aktuellen Benutzers“ auswählen kann.
[Bearbeiten] und hier ist ein Ergebnis von Google zu Ihrem Problem: http://forum.sysinternals.com/forum_posts.asp?TID=3755
Andere Tipps
In Powershell und WMI gibt der folgende einzeilige Befehl eine Liste von Objekten zurück, die den Benutzer und die Uhrzeit seiner Anmeldung anzeigt.
Get-WmiObject win32_networkloginprofile | ? {$_.lastlogon -ne $null} | % {[PSCustomObject]@{User=$_.caption; LastLogon=[Management.ManagementDateTimeConverter]::ToDateTime($_.lastlogon)}}
Erläuterung:
- Rufen Sie die Liste der angemeldeten Benutzer von WMI ab
- Filtern Sie alle nicht interaktiven Benutzer heraus (entfernt effektiv).
NT AUTHORITY\SYSTEM
) - Formatiert die Benutzer- und Anmeldezeit zur besseren Lesbarkeit neu
Verweise:
- Das zu verwendende WMI-Objekt: https://forum.sysinternals.com/topic3755.html
- Datum/Uhrzeit formatieren: https://blogs.msdn.microsoft.com/powershell/2009/08/12/get-systemuptime-and-working-with-the-wmi-date-format/
Führen Sie in WMI Folgendes aus:"SELECT * von Win32_Session" dort haben Sie "StartTime" -Werte.
Hoffentlich hilft das.
Mit WMI ist die Win32Session ein guter Anfang.Außerdem sollte darauf hingewiesen werden, dass Sie Win32_NetworkLoginProfile verwenden können, um alle möglichen Informationen abzurufen, wenn Sie sich in einem Netzwerk befinden.
Set logins = objWMIService.ExecQuery _
("select * from Win32_NetworkLoginProfile")
For Each objSession in logins
Wscript.Echo objSession.LastLogon
Next
Zu den weiteren Informationen, die Sie sammeln können, gehören der Benutzername, die letzte Abmeldung sowie verschiedene profilbezogene Dinge.