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
Kompletten Benutzername auslesen
-
- Beiträge: 623
- Registriert: Do 27. Sep 2012, 00:07
- OS, Lazarus, FPC: Win10Pro-64Bit, Immer letzte Lazarus Release mit SVN-Fixes
- CPU-Target: x86_64-win64
- Wohnort: Hamburg
Re: Kompletten Benutzername auslesen
Google-Einträge für Thema
http://www.google.de/#hl=de&tbo=d&output=search&sclient=psy-ab&q=delphi+window+username&oq=delphi+window+username&gs_l=hp.3...1400.6401.0.6689.24.19.1.4.4.0.230.2480.0j18j1.19.0...0.0...1c.1.lDoaGrzwhzU&pbx=1&bav=on.2,or.r_gc.r_pw.r_qf.&bvm=bv.1355534169,d.Yms&fp=30a3908a783e9fb0&bpcl=40096503&biw=1108&bih=695
Vielleicht für dich etwas:
http://delphi.about.com/cs/adptips2002/a/bltip0102_3.htm
http://www.google.de/#hl=de&tbo=d&output=search&sclient=psy-ab&q=delphi+window+username&oq=delphi+window+username&gs_l=hp.3...1400.6401.0.6689.24.19.1.4.4.0.230.2480.0j18j1.19.0...0.0...1c.1.lDoaGrzwhzU&pbx=1&bav=on.2,or.r_gc.r_pw.r_qf.&bvm=bv.1355534169,d.Yms&fp=30a3908a783e9fb0&bpcl=40096503&biw=1108&bih=695
Vielleicht für dich etwas:
http://delphi.about.com/cs/adptips2002/a/bltip0102_3.htm
Re: Kompletten Benutzername auslesen
Weil heute Heiligabend ist und mein Google noch funktioniert.
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;
Re: Kompletten Benutzername auslesen
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):
Danke für die Hilfe
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
-
- 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
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.
Grüße, Antrepolit
care only if your os is really burning
care only if your os is really burning
Re: Kompletten Benutzername auslesen
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
Danke nochmal für die Hilfe
-
- 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
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
care only if your os is really burning