Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Vollen Benutzernamen ermitteln (https://www.delphipraxis.net/159800-vollen-benutzernamen-ermitteln.html)

Schwedenbitter 13. Apr 2011 13:30

Vollen Benutzernamen ermitteln
 
Hallo,

ich benötige für mein Programm den vollen Namen des angemeldeten Benutzers - nicht dessen Benutzernamen. Bei mir ist das z.B. "Alexander Winzer", während ich mich am Computer mit einem Kürzel, also eben dem Benutzernamen, anmelde. Das Problem mit der Suche ist, dass mir keine besseren Suchworte als "Benutzername" oder "Username" einfallen und ich dann immer zu Codes für die Ermittlung des Benutzernamens geführt werde.

Ich würde mich über Links oder kurzen Code freuen.

Danke, Alex

himitsu 13. Apr 2011 13:34

AW: Vollen Benutzernamen ermitteln
 
MSDN-Library durchsuchenGetUserNameEx bietet einige Möglichkeiten ... k.A. ob dein Wunsch auch befriedigt wird.

Luckie 13. Apr 2011 13:43

AW: Vollen Benutzernamen ermitteln
 
http://www.michael-puff.de/Programmi...erNameEx.shtml

Schwedenbitter 13. Apr 2011 21:01

AW: Vollen Benutzernamen ermitteln
 
Riesen Dank Euch beiden!
Ihr habt wie immer richtig gelegen. Nur der Vollständigkeit halber:
Delphi-Quellcode:
Function GetUserNameEx(NameFormat: DWORD; lpNameBuffer: PChar; Var nSize: DWORD): Boolean; Stdcall;
   External 'secur32.dll' Name 'GetUserNameExA';

Function NameDisplay: String;
Const
   nfNameDisplay   = 3;   // A "friendly" display name
Var
   Buffer            : Array [0..1024] Of Char;
   Size            : DWORD;
Begin
   Size:=SizeOf(Buffer);
   If GetUserNameEx(nfNameDisplay, @Buffer, Size) Then
         Result:=Buffer
   Else   Result:='';
End;
Gruß, Alex

himitsu 14. Apr 2011 06:06

AW: Vollen Benutzernamen ermitteln
 
Zitat:

Zitat von MSDN
specifies the size of the lpBuffer buffer, in TCHARs

Also Length und nicht SizeOf, sonst könnte es bei Unicode einen Pufferüberlauf geben.
(na gut, es ist wohl recht selten, daß jemand einen Namen mit mehr als 511 Zeichen nutzt :angle: )

Sir Rufo 14. Apr 2011 06:36

AW: Vollen Benutzernamen ermitteln
 
Abba er nutzt ja die ANSI-Variante der Funktion, somit gibt es kein Unicode zurück.

Allerdings ist der Code so nicht auf einem System >= Delphi 2009 zu empfehlen :)

Schwedenbitter 14. Apr 2011 09:09

AW: Vollen Benutzernamen ermitteln
 
Zitat:

Zitat von Sir Rufo (Beitrag 1094993)
Allerdings ist der Code so nicht auf einem System >= Delphi 2009 zu empfehlen :)

Bitte mal noch erklären, warum das so ist. Erstens will ich lernen, zweitens der Vollständigkeit halber für Leute, die evtl. auch mal vor demselben Problem stehen, das Thema über die Suche finden und drittens vielleicht leiste ich mir ja eines Tages mal ein (neueres) Delphi...

Danke, Alex

DeddyH 14. Apr 2011 09:16

AW: Vollen Benutzernamen ermitteln
 
Ganz einfach: SizeOf gibt die Größe in Bytes zurück, Length die Länge in Char. Da Ansi -> Char = 1 Byte und Unicode -> Char = 2 Byte kann das zu Problemen führen, da eine doppelt so große Zahl übergeben würde, als tatsächlich zur Verfügung steht.

Luckie 14. Apr 2011 09:31

AW: Vollen Benutzernamen ermitteln
 
Zitat:

Zitat von Sir Rufo (Beitrag 1094993)
Allerdings ist der Code so nicht auf einem System >= Delphi 2009 zu empfehlen :)

Mein Code stammt auch noch aus Zeiten, da wusste Borland noch nicht mal wie Unicode geschrieben wird. ;)

himitsu 14. Apr 2011 10:22

AW: Vollen Benutzernamen ermitteln
 
Jupp, für ihn aktuell irrelevant, aber nicht daß noch ein D2009+-Besitzer diesen Code bei sich einbaut. :angle2:

Also mit Length funktioniert der Code überall. (Ansi oder Unicode)

[add]
Uhhh, ich seh's grad ... da ist nochein Fehler drin.
PChar und die AnsiVersion der Funktion importiert.

Delphi-Quellcode:
Function GetUserNameEx(NameFormat: DWORD; lpNameBuffer: PChar; Var nSize: DWORD): Boolean; StdCall;
  External 'secur32.dll' Name {$IF SizeOf(Char) = 1} 'GetUserNameExA' {$ELSE} 'GetUserNameExW' {$IFEND};

Function GetUserNameExA(NameFormat: DWORD; lpNameBuffer: PAnsiChar; Var nSize: DWORD): Boolean; StdCall;
  External 'secur32.dll' Name 'GetUserNameExA';

Function GetUserNameExW(NameFormat: DWORD; lpNameBuffer: PWideChar; Var nSize: DWORD): Boolean; StdCall;
  External 'secur32.dll' Name 'GetUserNameExW';
entweder
PAnsiChar + die Ansi-Version (A wie Ansi)
,
PWideChar + die Unicode-Version (W wie Wide)
oder
PChar + die Version, welche zum Compiler paßt


Alle Zeitangaben in WEZ +1. Es ist jetzt 08:27 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