Einzelnen Beitrag anzeigen

ASM

Registriert seit: 15. Aug 2004
165 Beiträge
 
Delphi 7 Enterprise
 
#9

AW: LsaEnumerateLogonSessions gibt nicht eingeloggte User in Liste aus

  Alt 8. Jan 2012, 00:01
Wenn ich alle angemeldeten Sessions (aktiv oder gerade nicht aktiv) ermittelt habe brauche ich unbedingt noch die Logon Zeit.
Das letzte Login (Datum und Uhrzeit) eines im System angemeldeten Benutzers kann unter Umgehung der Adminrechte mit Hilfe eines COMObjects des Active Directory ausgelesen werde. Also muss man nur einfach die Benutzernamen aus der Liste der aktiv eingeloggten Benutzer (wie oben von mir schon beschrieben) nacheinander an das COMObject des ActiveDs übergeben, und schon hat man den diesem Benutzer zugehörigen Loginzeitpunkt.

Es handelt sich dabei um den tatsächlichen letzten Loginzeitpunkt. Hatte sich der Benutzer aktiv am System angemeldet, sich jedoch zwischenzeitlich entfernt ohne sich auszuloggen, so dass der Account im Hintergrund geöffnet blieb, und musste sich dann wieder anmelden, um in den an sich immer noch geöffneten Account zu gelangen, dann ist der letzte Loginzeitpunkt genau diese neue Anmeldung.

Hier der Code zur der Abfrage der Loginzeiten, wie er (bei mir) unter WinXP Professional reibungslos werkelt:
Code:
Use Variants, ActiveDs_TLB, COMObj, Ole2, adshlp;

Var
    ActiveUsers: TStringlist;
    ComputerName: Olevariant;
    UserName: Olevariant;
    UserDomain: Olevariant;

function UserLoggedIn(Username: string): string;
var
  target: string;
  UserObj: Olevariant;
  LoggedIn: Olevariant;
begin
  target := format('WinNT://%s/%s', [ComputerName, UserName]);
  UserObj := ADsHlp.GetObject(target);
  try
    LoggedIn := UserObj.LastLogin;
    result := string(LoggedIn);
  finally
    UserObj := Unassigned;
  end;
end;

function GetActiveUsers: TStringlist;
var
  HostInfo: TWKSTA_USER_INFO_0;
  WshNetWork: Olevariant;
  i: integer;
  LogIn: string;
begin
  result := TStringlist.create;
  WshNetWork := CreateOleObject('WScript.Network');
  try
    ComputerName := WshNetWork.Computername;
    UserName := WshNetWork.UserName;
    UserDomain := WshNetWork.UserDomain;
  finally
    WshNetWork := UnAssigned;
  end;
  ActiveUsers := TStringlist.Create;
  try
    HostInfo := EnumNetUsers(ActiveUsers);
    for i := 1 to ActiveUsers.count - 1 do
    begin
      logIn := UserLoggedIn(ActiveUsers[i]);
      result.add(format('Name: %s, last Login: %s', [ActiveUsers[i],logIn]));
    end;
  finally
    ActiveUsers.Free;
  end;
end;
Und angehängt der komplette Code der MainUnit im Source sowie - mit geringen Änderungen des Programmlayouts - kompiliert unter D7:
Angehängte Dateien
Dateityp: pas Main.pas (3,7 KB, 9x aufgerufen)
Dateityp: zip ActiveUsers.zip (171,7 KB, 13x aufgerufen)
  Mit Zitat antworten Zitat