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