Einzelnen Beitrag anzeigen

Scorpion3000

Registriert seit: 18. Apr 2004
47 Beiträge
 
Delphi 7 Enterprise
 
#5

Re: Den aktiven Benutzer bzw Status des Benutzers bekommen

  Alt 7. Dez 2005, 00:00
Hallo Olli!

Zitat:
Kleiner Tip: es heißt nicht "Multi-User Betriebssysteme", denn das sind NT 3.51 und 4.0 und Windows 2000 auch - was du meinst sind installierte und laufende Terminal Services (TS).
Das ist richtig. Es müssen Betriebssysteme mit installierten Terminal-Services sein. Dh NT 4.0 aufwärts mit installierten Terminal Services. Ab Windows Xp imho sind diese von Haus aus dabei.


Zitat:
2.) kann auf einem Server-OS (NT 4.0 - 2003 Server) mehr als ein Benutzer auf einmal an jeweils einem Terminal aktiv sein
Zuerst muss ich mal dazu sagen, dass ich unter "aktiv" den Benutzer meine, der gerade "lokal", also an der Konsole angemeldet ist.
Habe einen sehr wichtige Abfrage vergessen! Hier ist die neue Funktion mit der Abfrage:

Delphi-Quellcode:
function WTSGetActiveConsoleSessionId: DWORD; external 'Kernel32.dll';

function GetActiveUserName: string;
var
   Count: cardinal;
   List: PLUID;
   sessionData: PSECURITY_LOGON_SESSION_DATA;
   i1: integer;
   SizeNeeded, SizeNeeded2: DWORD;
   OwnerName, DomainName: PChar;
   OwnerType: SID_NAME_USE;
   pBuffer: Pointer;
   pBytesreturned: DWord;
begin
   result:= nil;
   //Auflisten der LogOnSessions
   i1:= lsaNtStatusToWinError(LsaEnumerateLogonSessions(@Count, @List));
   if i1 = 0 then begin
      i1:= -1;
      if Count > 0 then begin
         repeat
             inc(i1);
             LsaGetLogonSessionData(List, sessionData);
             //Wenn es sich um einen interaktive LogOnSession handelt
             if sessionData.LogonType = Interactive then begin
                //Prufen ob es sich um einen Benutzer handelt
                SizeNeeded := MAX_PATH;
                SizeNeeded2:= MAX_PATH;
                GetMem(OwnerName, MAX_PATH);
                GetMem(DomainName, MAX_PATH);
                if LookupAccountSID(nil, sessionData.SID, OwnerName,
                   SizeNeeded, DomainName, SizeNeeded2, OwnerType) then begin
                   if OwnerType = 1 then begin
                      //Wenn Benutzer an lokaler console angemeldet
                      //unter Windows NT 4.0 und Windows 2000 ist die SessionID der Konsole immer "0" dh.:
                      //if sessionData.Session = 0 then
                      if sessionData.Session = WTSGetActiveConsoleSessionId then //<- Hab ich vergessen
                      begin
                         //Wenn Benutzer aktiv
                         if WTSQuerySessionInformationA(WTS_CURRENT_SERVER_HANDLE,
                            sessionData.Session, WTSConnectState, pBuffer,
                            pBytesreturned) then begin
                            if WTS_CONNECTSTATE_CLASS(pBuffer^) =
                               WTSActive then
                               result:= sessionData.UserName.Buffer;
                         end;
                      end;
                   end;
                end;
                FreeMem(OwnerName);
                FreeMem(DomainName);
             end;
             inc(List);
         until (i1 = Count-1) or (result <> nil);
      end;
   end;
end;
Danke für dein Feedback. Hätte das fast übersehen. So sollte es passen.

Mfg Scorpion3000
  Mit Zitat antworten Zitat