Hi,
vielen Dank erstmal für die ganzen Vorschläge. Aber die Ermittlung über NetWkstaUserEnum und COMObjects des Active Directory ist für mich nicht das richtige. Zumindest liefern diese Funktionen nicht die richtigen Ergebnisse (siehe Anhang erstes Bild). Da sind zwei Benutzerkonten (Besitzer und Test1, Test1 hatte sich heute zweimal angemeldet und richtig abgemeldet) angemeldet und eine Anwendung wurde mit "Ausführen als ..." über ein drittes Benutzerkonto (Test2) gestartet. Beide Möglichkeiten zeigen mir alle drei (oder vier) Sessions an. Ich möchte aber nur die zwei angemeldeten Sessions ermitteln (wie im Taskmanager).
Vielleicht nochmal zum Verständnis was für mich "angemeldet" bedeutet und welche Logon Zeit ich gern hätte. Angemeldet bedeutet für mich das sich ein Benutzer (auch per Remote) anmeldet und aber auch die Benutzerkonten die gerade nicht aktiv sind (Verbindung getrennt, Remotedesktop schließen oder Benutzerwechsel). Und als Logon Zeit hätte ich gern die erste Anmeldezeit, nicht die Zeit der "reaktivierung der Session". Nicht so wie es mir über das COMObjects des Active Directory ermittelt wird (auch hier dauert der Aufruf einfach zu lang). Ein "reaktivieren" der Session ist für mich also kein "anmelden".
Dies scheint mir LsaEnumerateLogonSessions auch alles liefern zu können, nur fehlen mir ein paar Anhaltspunkte was ich dort alles ausgeben/ermitteln kann. Hier mal einAuszug aus dem Ergebnis:
Code:
Session #1: 11300521 0 // Low und Hi der LUID (LUID = Int64)
LogonId: 11300521 // wie der Name sagt die LogonID
UserName: Test1 // Name
LogonDomain: CLIENTLE01
LogonType: Interactive (2)
Session: 2 // SessionID
SID: Test1 S-1-5-21-854245398-73586283-1177238915-1010
LogonTime: DateTime: 09.01.2012 13:40:02 Unix: 1326116402
TickCount: ms: 19905815 // TickCount64
LogonServer: CLIENTLE01
DnsDomainName:
Upn:
SIDInfo.Name: Test1 // SID Informationen lese ich nahand der SID nach
SIDInfo.ReferenceDomainName: CLIENTLE01
SIDInfo.SIDType: SidTypeUser (1)
WtsConnectState: WTSDisconnected (4) // WTS Status lese ich Anhand der SessionID nach
Session #5: 9694340 0
LogonId: 9694340
UserName: Test1
LogonDomain: CLIENTLE01
LogonType: Interactive (2)
Session: 1
SID: Test1 S-1-5-21-854245398-73586283-1177238915-1010
LogonTime: DateTime: 09.01.2012 13:10:38 Unix: 1326114638
TickCount: ms: 19905859
LogonServer: CLIENTLE01
DnsDomainName:
Upn:
SIDInfo.Name: Test1
SIDInfo.ReferenceDomainName: CLIENTLE01
SIDInfo.SIDType: SidTypeUser (1)
WtsConnectState: WTSDown (8)
Wie man sieht werden hier auch Sessions angezeigt, bei denen sich der User richtig abgemeldet hat. Keine Ahnung warum die da nicht gelöscht werden. Ich dachte ich kann Anhand der LogonID ermitteln, welches das letzte, für mich richtige, Login ist.
Ich denke ich werde jetzt alle doppelten Sessions von LsaEnumerateLogonSessions filtern und hierbei nur die mit dem größten LogonTime als gültig betrachten. Ich habe gehofft das mir jemand genauer sagen kann was LsaEnumerateLogonSessions liefert (aus der
MSDN werd ich nicht wirklich schlau) und warum auch "alte" Sessions noch als Duplikat angezeigt werden.
Ich werde veruchen die Ergebnisse von LsaEnumerateLogonSessions mit der Zeit und anhand der ermittelten Sessions von WTSEnumerateSessions zu filtern. Das Ergebnis werde ich dann posten.
Wäre nur schön, wenn jemand meine Annahmen bestätigen oder wiederlegen kann.
Gruß, Marco.