Auch die letzte gepostete Funktion bringt leider das falsche Ergebnis, aber ich habe mir selber nochmal die API-Funtkionen angeschaut und hier eine Version entwickelt (sie bringt das richtige Ergebnis, ist aber weder effiziernt, noch gibt es eine Fehlerbehandlung):
Code: Alles auswählen
function GetUserAtDomain(): String;
var
ProcessHandle, hToken: THandle;
UserSize, DomainSize: LongWord;
ptiUser: PTOKEN_USER;
snu: SID_NAME_USE;
cbBuf: Cardinal;
bSuccess: Boolean;
User, Domain: String;
begin
ProcessHandle := OpenProcess(PROCESS_QUERY_INFORMATION, False, GetCurrentProcessId());
if ProcessHandle <> 0 Then begin
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);
LookupAccountSidW(nil, ptiUser^.User.Sid, nil, UserSize, nil, DomainSize, snu);
If (UserSize <> 0) and (DomainSize <> 0) then
begin
SetLength(User, UserSize);
SetLength(Domain, DomainSize -1);
if LookupAccountSid(nil, ptiUser^.User.Sid, PChar(User), UserSize, PChar(Domain), DomainSize, snu) then begin
Result := Domain + '\' + User;
end;
end;
if bSuccess then
begin
FreeMem(ptiUser);
end;
end;
CloseHandle(ProcessHandle);
end;
end;
Danke für die Hilfe
