Einzelnen Beitrag anzeigen

virus82

Registriert seit: 29. Jun 2007
Ort: Leipzig
34 Beiträge
 
Delphi 2009 Professional
 
#10

AW: LsaEnumerateLogonSessions gibt nicht eingeloggte User in Liste aus

  Alt 9. Jan 2012, 13:19
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.
Miniaturansicht angehängter Grafiken
test1.jpg  
Marco
  Mit Zitat antworten Zitat