function GetOSUserName: string; type TOKEN_USER = record User : TSidAndAttributes; end; PTOKEN_USER = ^TOKEN_USER; var szUser, szDomain : array [0..255] of Char; cbSize, cbUser, cbDomain : DWORD; hToken : THandle; pUser : PTOKEN_USER; sid_use : SID_NAME_USE; begin Result := ''; cbUser := 256; cbDomain := 256; ZeroMemory(@szUser, cbUser); ZeroMemory(@szDomain, cbDomain); if not OpenThreadToken(GetCurrentThread, TOKEN_QUERY, true, hToken) then begin if GetLastError <> ERROR_NO_TOKEN then Exit; if not OpenProcessToken(GetCurrentProcess, TOKEN_QUERY, hToken) then exit; end; if not GetTokenInformation(hToken, TokenUser, nil, 0, cbSize) then if GetLastError <> ERROR_INSUFFICIENT_BUFFER then begin CloseHandle(hToken); Exit; end; GetMem(pUser, cbSize); try if not GetTokenInformation(hToken, TokenUser, pUser, cbSize, cbSize) then Raise Exception.Create(''); LookupAccountSid(nil, pUser.User.Sid, @szUser, cbUser, @szDomain, cbDomain, sid_use); Result := Format('%s\%s', [StrPas(szDomain), StrPas(szUser)]); Result := LowerCase(Result); finally FreeMem(pUser); CloseHandle(hToken); end; end; |