![]() |
GetUsernameEx
Hallo,
seit Stunden versuche ich herauszufinden was an meinem Programm nicht funktioniert. Ich möchte den Benutzernamen des am Desktop angemeldeten Benutzer aus einem NT-Service ermitteln. Dabei verwende ich folgenden Code:
Delphi-Quellcode:
Als Ergebnis erhalte ich jedoch nicht den Benutzernamen sondern die Workgroup und den PC-Namen im Format WORKGROUP\PC-Name
const
NameUnknown = 0; // Unknown name type. NameFullyQualifiedDN = 1; // Fully qualified distinguished name NameSamCompatible = 2; // Windows NT® 4.0 account name NameDisplay = 3; // A "friendly" display name NameUniqueId = 6; // GUID string that the IIDFromString function returns NameCanonical = 7; // Complete canonical name NameUserPrincipal = 8; // User principal name NameCanonicalEx = 9; NameServicePrincipal = 10; // Generalized service principal name DNSDomainName = 11; // DNS domain name, plus the user name function GetUserNameExString(ANameFormat: DWORD): string; var Buf: array[0..256] of Char; BufSize: DWORD; GetUserNameEx: function (NameFormat: DWORD; lpNameBuffer: LPSTR; var nSize: ULONG): BOOL; stdcall; begin Result := ''; BufSize := SizeOf(Buf) div SizeOf(Buf[0]); GetUserNameEx := GetProcAddress(GetModuleHandle('secur32.dll'), 'GetUserNameExW'); if Assigned(GetUserNameEx) then if GetUserNameEx(ANameFormat, @Buf[0], BufSize) then Result := Buf; end; Aufruf:
Delphi-Quellcode:
showmessage(GetUserNameExString(NameSamCompatible));
Delphi XE2/64Bit. Was könnte da falsch laufen ?? KUBA |
AW: GetUsernameEx
Ich hätte jetzt vermutet, daß die Funktion maximal den Namen zurückgeben kann, von dem Account, in welchem der Service läuft.
Und das wird vermutlich nicht der Account des Bentzters sein. :stupid: Die Funktion heißt ja praktisch "gib die Infos von meinem Account" (mein = von dem Programm) Vermutlich wird man irgendwie rausfinden müssen welcher "Desktop" aktuell auf dem Monitor angezeigt wird und liest dann von Diesem den Account aus. |
AW: GetUsernameEx
Hallo,
vielleicht hilft dir das ![]() Dort suchen nach alee SHGetFolderPath(0, CSIDL_APPDATA, 0, 0, PChar(appPath)); Heiko |
AW: GetUsernameEx
So funktioniert es bei uns:
Delphi-Quellcode:
Das ist jetzt aus nem größeren Teil Code zusammenkopiert. Kann also sein dass es jetzt nicht Copy&Paste funktioniert ;-)
procedure GetUserNameEx(NameFormat: DWORD;lpNameBuffer: LPSTR; nSize: PULONG);
stdcall; external 'secur32.dll' Name 'GetUserNameExW'; procedure UsernameAuslesen(); var UserName_array: array[0..250] of char; szUserName : array[0..99] of Char; Size: DWORD; begin FillChar(szUserName, SizeOf(szUserName), 0); Size := SizeOf(szUserName); GetUserName(szUserName, Size); // das holt erstmal die GID des aktuellen Nutzers UserNameLogin:= Uppercase(szUserName); Size := 250; GetUserNameEx(3, @UserName_array, @Size); // das ließt dann vorname nachname usw aus end; |
AW: GetUsernameEx
Zitat:
Es passiert zuviel innerhalb einer Funktion bzw. Methode. Solange man aus einem größeren Codeblock nützliche Funktionen isolieren kann ist der Sourcecode noch nicht richtig sauber. |
AW: GetUsernameEx
OT: Ich weiß... Aber wie du warscheinlich ebenfals aus der Praxis weißt kann man nicht einfach ein ganzes Programm was man übernommen hat direkt komplett umbauen sondern kann das allenfalls nach und nach machen, wer soll das den sonst bezahlen ;-)
|
AW: GetUsernameEx
Zitat:
|
AW: GetUsernameEx
Zitat:
Vielen Dank für die Anregungen. KUBA |
AW: GetUsernameEx
Ich habe das Problem, den Usernamen zu finden, so gelöst:
Delphi-Quellcode:
Leider erhalte ich bei dem ersten Aufruf von "getusername" nur einen leeren String.
procedure TMainForm.FormCreate(Sender: TObject);
var lpbuff : pchar; nSize : dword; begin lpbuff:=PChar(AllocMem(30)); getusername(lpbuff, nsize); //showmessage(lpbuff); getusername(lpbuff, nsize); //showmessage(lpbuff); end; Doch mit dem gleich darauf folgenden Aufruf erhalte ich den Usernamen, der sich aktuell angemeldet hat. Warum der 1. Aufruf noch nicht zum Ziel führt, habe ich nie untersucht, Hauptsache ich komme so an den Usernamen. Kurt |
AW: GetUsernameEx
Zitat:
Der zweite Parameter ist ein In/Out-parameter. Rein gibtst du die Buffergröße, raus bekommst du die nötige Buffergröße. Also beim ersten Aufruf geht du mit größe 0 rein, raus kommt die nötige größe und beim zweiten aufruf hast du diese als in-Wert. |
AW: GetUsernameEx
Zitat:
|
AW: GetUsernameEx
Delphi-Quellcode:
function GetUser: String;
const MAX_USERNAME_LENGTH = 256; var Buffer: Array[0..MAX_USERNAME_LENGTH] of WIDEChar; Size: DWord; begin Size := Pred(SizeOf(Buffer)); Winapi.Windows.GetUserName(Buffer, Size); Result := StrPas(Buffer); end; |
AW: GetUsernameEx
Zitat:
|
AW: GetUsernameEx
Zitat:
![]() |
AW: GetUsernameEx
Ich mach da einfach 2 Aufrufe wie von Bernhard schon angedeutet, siehe hier:
![]() |
AW: GetUsernameEx
@Uwe Raabe:
Du hast recht. Ich habe mich bei den Constanten vergriffen... Was mein DELPHI nicht kennt, muss ich dann eben selbst definieren: const MAX_USERNAME_LENGTH = 256; |
AW: GetUsernameEx
@hator: SizeOf .... Length ... Du mußt aufpassen, ob die API die Größe in Byte oder Chars haben will und ob die Größenangabe inklusive oder exclusive der abschließenden #0 ist.
|
AW: GetUsernameEx
Bei
const MAX_USERNAME_LENGTH = 256; var Buffer: Array[0..MAX_USERNAME_LENGTH] of WIDEChar; ist alles ALL INCLUSIVE. Aber sooo lange UserNames hat wohl keiner... da würde auch Buffer: Array[0..10] of WIDEChar; reichen..:-D |
AW: GetUsernameEx
OFFTOPIC:
Was ist das eigentlich für ein seltsamer Absturz? Gerade ist mein WIN 8.1 abgestürzt. Nach dem Booten war FIREFOX wieder vollständig da, incl. dem Edit-Fenster von der DP.:!::!::!: |
AW: GetUsernameEx
Zitat:
Dann erwartet die API die Größe exkl. der #0, womit sie mochmal weitere 2 Byte überschreiben könnte. Die API würde zwar nicht außerhalb des Puffers schreiben, aber wenn man ihr eine falsche Größe nennt, dann kann sie natürlich nichts dafür. 0..10 ... bei 11 bis 22 Chars würde es also Spaß machen. :roll: |
AW: GetUsernameEx
Zitat:
Als USERNAME habe ich bisher erlebt, dass der Nachname 12 Stellen hatte. Da mehrere Personen der Familie einen Account hatten, kam noch der Vorname dazu. 10 Stellen sind da nicht gut ausreichend. |
AW: GetUsernameEx
Äh? Der Anmeldebenutzername unterscheidet nicht zwischen Vor- und Nachname. Das ist der Kontoname. Im Benutzerprofil kann man zwischen Vor- und Nachnamen unterscheiden.
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 03:46 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz