Zalogowanych użytkowników, wystarczy pobrać na podstawie uruchomionych procesów:
function GetLogonUsers(Lista: TStrings): Boolean;
type
PTOKEN_USER = ^TOKEN_USER;
_TOKEN_USER = record
User: TSidAndAttributes;
end;
TOKEN_USER = _TOKEN_USER;
var
cbBuf: Cardinal;
snu: SID_NAME_USE;
ptiUser: PTOKEN_USER;
hToken, hProcSnap, ProcessHandle: THandle;
pe32: TProcessEntry32;
bSuccess: Boolean;
UserSize, DomainSize: DWORD;
Domain, User: string;
begin
hProcSnap := CreateToolHelp32SnapShot(TH32CS_SNAPALL, 0);
pe32.dwSize := SizeOf(ProcessEntry32);
if Process32First(hProcSnap, pe32) = True then
while Process32Next(hProcSnap, pe32) = True do
begin
ProcessHandle := OpenProcess(PROCESS_QUERY_INFORMATION, False, pe32.th32ProcessID);
if ProcessHandle <> 0 then
begin
// EnableProcessPrivilege(ProcessHandle, 'SeSecurityPrivilege', True);
if OpenProcessToken(ProcessHandle, TOKEN_QUERY, hToken) then
begin
bSuccess := GetTokenInformation(hToken, TokenUser, nil, 0, cbBuf);
ptiUser := nil;
while (not bSuccess) and (GetLastError = ERROR_INSUFFICIENT_BUFFER) do
begin
ReallocMem(ptiUser, cbBuf);
bSuccess := GetTokenInformation(hToken, TokenUser, ptiUser, cbBuf, cbBuf);
end;
CloseHandle(hToken);
UserSize := 0;
DomainSize := 0;
LookupAccountSid(nil, ptiUser.User.Sid, nil, UserSize, nil, DomainSize, snu);
if (UserSize <> 0) and (DomainSize <> 0) then
begin
SetLength(User, UserSize);
SetLength(Domain, DomainSize);
if LookupAccountSid(nil, ptiUser.User.Sid, PChar(User), UserSize, PChar(Domain), DomainSize, snu) then
begin
if (UpperCase(StrPas(PChar(User))) <> 'SYSTEM') and (not Lista.IndexOf(StrPas(PChar(User))) > -1) then Lista.Add(StrPas(PChar(User)));
// if not Lista.IndexOf(StrPas(PChar(Domain))) > -1 then Lista.Add(StrPas(PChar(Domain)));
end;
end;
if bSuccess then FreeMem(ptiUser);
end;
CloseHandle(ProcessHandle);
end;
end;
CloseHandle(hProcSnap);
if Lista.Count > 0 then Result := True
else Result := False;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
GetLogonUsers(ListBox1.Items);
end;