Kompletten Benutzername auslesen

Antworten
Pseudo
Beiträge: 21
Registriert: Fr 28. Sep 2012, 17:31

Kompletten Benutzername auslesen

Beitrag von Pseudo »

Hallo Lazarusforum,
ich brauche für ein Projekt eine Funktion die den kompletten Username ausliest (also mit Domain an der er angemeldet ist)! Einfach Computername und Username zusammensetzten Funktioniert logischerweise nicht, weil dann zum Beispiel NT AUTHORITY\SYSTEM natürlich falsch ausgelesen wird... Da muss es doch irgendeine API Funktion geben, oder?
Danke :D


Benutzeravatar
theo
Beiträge: 10497
Registriert: Mo 11. Sep 2006, 19:01

Re: Kompletten Benutzername auslesen

Beitrag von theo »

Weil heute Heiligabend ist und mein Google noch funktioniert. :wink:

Code: Alles auswählen

uses .... JwaSecExt; 
...
function GetDomainAndUser:String;
var Buffer:WideString;
  Ret:Cardinal;
begin
  Ret:=255;
  SetLength(Buffer,Ret);
  if GetUserNameExW(2,@Buffer[1],Ret) then
    Result:=UTF8Encode(Copy(Buffer,1,Ret)) else
    Result:='';
end;     

Pseudo
Beiträge: 21
Registriert: Fr 28. Sep 2012, 17:31

Re: Kompletten Benutzername auslesen

Beitrag von Pseudo »

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 :D

Antrepolit
Beiträge: 340
Registriert: Di 12. Sep 2006, 08:57
OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.2.z)
CPU-Target: xxBit
Kontaktdaten:

Re: Kompletten Benutzername auslesen

Beitrag von Antrepolit »

Pseudo hat geschrieben:Auch die letzte gepostete Funktion bringt leider das falsche Ergebnis (...)


Die bringt auch das richtige Ergebnis, wenn man die korrekten Konstanten als erstes Argument verwendet. Diese sind alle auf MSDN dokumentiert. Aber ja, Google und MSDN sind so unglaublich schwerzu benutzen. Da bestelt man besser mit hohem Zeitaufwand irgendwelche Frickel-Funktionen ohne Exception-Handling. :roll:
Grüße, Antrepolit

care only if your os is really burning

Pseudo
Beiträge: 21
Registriert: Fr 28. Sep 2012, 17:31

Re: Kompletten Benutzername auslesen

Beitrag von Pseudo »

Tut mir leid dir widersprechen zu müssen, aber ich habe bereits alle Konstanten versucht... Jedoch schlägt die Funktion bei jeder Konstate außer NameSamCompatible (=2) fehl. Und bei dieser kommt es nunmal z.B. bei einem Aufruf von einem SYSTEM Prozess zu einem DEFINITV falschen Ergebnis! Ich habe bereits die IAT von whoami.exe untersucht und ein windowseigenes programm nutz auch die API-Funktionen, die ich in meiner Funktion nutze --> (bis auf die fehlende Fehlerbehandlung, die übrigens bei mir schon drin ist...) wird es wohl leider nicht effizienter gehen...
Danke nochmal für die Hilfe :D

Antrepolit
Beiträge: 340
Registriert: Di 12. Sep 2006, 08:57
OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.2.z)
CPU-Target: xxBit
Kontaktdaten:

Re: Kompletten Benutzername auslesen

Beitrag von Antrepolit »

Ok, dann nehme ich alles zurück. Ungewöhnlich, dass das nicht funktioniert wie beschrieben, MSDN ist normal sehr zuverlässig.
Grüße, Antrepolit

care only if your os is really burning

Antworten