Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   GetUserNameEx (https://www.delphipraxis.net/66400-getusernameex.html)

Luckie 29. Mär 2006 09:01


GetUserNameEx
 
Warum bekomme ich hier...
Delphi-Quellcode:
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 GetUserNameEx(NameFormat: DWORD;
  lpNameBuffer: LPSTR; var nSize: DWORD):Boolean; stdcall;
  external 'secur32.dll' Name 'GetUserNameExA';

function GetLoggedOnUserNameEx(fFormat: DWORD; var Username: String): DWORD;
var
  Size             : DWORD;
  Buffer: array [0..1024] of Char;
begin
  Size := MAX_COMPUTERNAME_LENGTH + 1;
  if GetUserNameEx(fFormat, Buffer, Size) then
    SetString(Username, Buffer, Size);
  Result := GetLastError;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  Username: String;
  err: DWORD;
begin
  err := GetLoggedOnUserNameEx(3, Username);
  if err = 0 then
    ShowMessage(Username)
  else
    ShowMessage(SysErrorMessage(err));
end;
...immer die Fehlermeldung:
Zitat:

Die angegebene Domäne ist nicht vorhanden oder es konnte keine Verbindung hergestellt werden
obwohl ich mich in einer Domain befinde und auch mit ihr verbunden bin? Es dauert auch ewig bis die Funktion zurückkehrt. Funktioniert es eventuell bei euch?

ste_ett 29. Mär 2006 09:13

Re: GetUserNameEx
 
Zwei "Fehler" sind drin.

#1
Delphi-Quellcode:
Size := MAX_COMPUTERNAME_LENGTH + 1;
MAX_COMPUTERNAME_LENGTH ist definiert mit 15.
Benutzernamen können länger sein.
Size muss die Länge deines Char-Arrays ohne #0 sein.
Bei deinem Beispiel 1024.

#2
Delphi-Quellcode:
Result := GetLastError;
Den Rückgabewert solltest du von dem true/false von GetUserNameExA abhänig machen, da es mir auch schon passiert ist, dass die Funktion erfolgreich war, GetLasError aber trotzdem <> 0 war.

-edit-

Das Phänomen mit der langen Antwortzeit habe ich bei mir auch, ich denke mal, dass das Problem hierbei bei Domänen-controller liegt.

Luckie 29. Mär 2006 09:21

Re: GetUserNameEx
 
Danke für die Tipps. Sieht jetzt so aus:
Delphi-Quellcode:
function GetLoggedOnUserNameEx(fFormat: DWORD; var Username: String): DWORD;
var
  Size: DWORD;
  Buffer: array [0..1024] of Char;
begin
  Result := 0;
  Size := sizeof(Buffer);
  if GetUserNameEx(fFormat, Buffer, Size) then
    SetString(Username, Buffer, Size)
  else
    Result := GetLastError;
end;
Fehlermeldung bleibt allerdings. Geht es denn bei dir?

ste_ett 29. Mär 2006 09:26

Re: GetUserNameEx
 
Ja, bei mir geht's. :)

sakura 29. Mär 2006 09:38

Re: GetUserNameEx
 
Danke für die Routine :mrgreen: Die Ergebnisse für die Werte 0 bis 11:
Code:
0 - 
1 - CN=Daniel Wischnewski,OU=User,OU=Office Ottobrunn,DC=gatenetwork,DC=office
2 - GATENETWORK\Daniel
3 - Daniel Wischnewski
4 - [email]daniel@gatenetwork.offi[/email]ce
5 - [email]daniel@gatenetwork.offi[/email]ce
6 - {aaaaaaaa-dddd-5555-yyyy-xxxxxxxxxxxx}
7 - gatenetwork.office/Office Ottobrunn/User/Daniel Wischnewski
8 - [email]daniel@gatenetwork.offi[/email]ce
9 - gatenetwork.office/Office Ottobrunn/User Daniel Wischnewski
10 - gatenetwork.office/Office Ottobrunn/User Daniel Wischnewski
11 - gatenetwork.office/Office Ottobrunn/User Daniel Wischnewski
...:cat:...

Luckie 29. Mär 2006 09:44

Re: GetUserNameEx
 
Grml. Und warum bei mir mal wieder nicht? :roll:

OK, da es funktioniert, habe ich es gleich mal für die Code-Lib vorgeschlagen.

Matze 29. Mär 2006 09:47

Re: GetUserNameEx
 
Zitat:

Zitat von Luckie
OK, da es funktioniert, habe ich es gleich mal für die Code-Lib vorgeschlagen.

Ich habe mir auch schon überlegt, es hineinzustellen, nur warte ich die Ursache ab, wieso es nicht geht. Evtl muss ja irgendetwas dabei beachtet werden.

sakura 29. Mär 2006 09:50

Re: GetUserNameEx
 
Zitat:

Zitat von Luckie
Grml. Und warum bei mir mal wieder nicht? :roll:

Bist Du Dir sicher, dass Dein Rechner auch korrekt am Netzwerk angemeldet ist - logst Du Dich an der Domaine ein?

...:cat:...

Luckie 29. Mär 2006 10:07

Re: GetUserNameEx
 
Unter "Anmelden an" steht DATAWERK. Mein Benutzerprofil scheint aber lokal auf dem Rechner zu liegen.

Christian Seehase 29. Mär 2006 18:39

Re: GetUserNameEx
 
Moin Luckie,

mit 2 klappt das bei mir sogar ohne Domänenzugehörigkeit, bei den übrigen erhalte ich 1332 (Zuordnungen von Kontennamen und Sicherheitskennungen wurden nicht durchgeführt)
Der Ort an dem das Profil liegt, spielt IMHO keine Rolle.
Das Problem könnte sein, dass Du Dich meist auch dann an einem Rechner anmelden kannst, wenn Du kein Netzwerk zur Verfügung hast, da dann mit dem gecachten Profil angemeldet wird.
Hast Du denn wirklich Netzwerkzugriff?

ChrisE 29. Mär 2006 19:07

Re: GetUserNameEx
 
Hallo Luckie,

wir haben Netzwerk mit WinXP-Rechner ohne Domänencontroler und damit ausschlieslich Lokale Benutzerprofile. Die Ausgabe von 0 .. 11:
Code:
0: Zuordnungen von Kontennamen und Sicherheitskennungen wurden nicht durchgeführt
1: Zuordnungen von Kontennamen und Sicherheitskennungen wurden nicht durchgeführt
2: CHRIS-ACER\chris
3: Zuordnungen von Kontennamen und Sicherheitskennungen wurden nicht durchgeführt
4: Zuordnungen von Kontennamen und Sicherheitskennungen wurden nicht durchgeführt
5: Zuordnungen von Kontennamen und Sicherheitskennungen wurden nicht durchgeführt
6: Zuordnungen von Kontennamen und Sicherheitskennungen wurden nicht durchgeführt
7: Zuordnungen von Kontennamen und Sicherheitskennungen wurden nicht durchgeführt
8: Zuordnungen von Kontennamen und Sicherheitskennungen wurden nicht durchgeführt
9: Zuordnungen von Kontennamen und Sicherheitskennungen wurden nicht durchgeführt
10: Zuordnungen von Kontennamen und Sicherheitskennungen wurden nicht durchgeführt
11: Zuordnungen von Kontennamen und Sicherheitskennungen wurden nicht durchgeführt
Gruß, Chris

Luckie 29. Mär 2006 21:42

Re: GetUserNameEx
 
Zitat:

Zitat von Christian Seehase
Hast Du denn wirklich Netzwerkzugriff?

Ja habe ich definitiv. Ich kann auf die freigegebenen Ordner anderer Rechner zugreifen.

NACHTRAG.
Bei mir zu Hause klappt auch 2 und drei - ohne Domain. ;) OK und ab dafür auf meine Homepage.

Christian Seehase 29. Mär 2006 23:44

Re: GetUserNameEx
 
Moin Luckie,

wie, 3 geht bei Dir auch :shock: :gruebel:
Auf welchem Betriebssystem hast Du das getestet?
(zum Vergleich: Bei mir ist es ein vollgepatchtes XP Pro SP 2 mit Netzwerk, aber ohne Domain)

Luckie 29. Mär 2006 23:47

Re: GetUserNameEx
 
Dito: Windows XP Professional SP2, Netzwerk (zur Zeit aber nur der Router und mein Rechner), keine Domain.

2: HAL9000\Michael
3: Michael Puff

"Michael" ist mein Login und "Michael Puff" der vollständige Name.

Matze 3. Apr 2006 07:17

Re: GetUserNameEx
 
Hi. Ich pushe an dieser Stelle mal. :stupid:
Grund: In der Code-Lib möchte ich angeben, welche Dienste bzw. Voraussetzungen notwendig sind, damit diese Funktionen laufen.

Luckie 3. Apr 2006 07:23

Re: GetUserNameEx
 
Liste der Anhänge anzeigen (Anzahl: 1)
Im Anhang mal meine Dienste.

sakura 11. Apr 2006 12:41

Re: GetUserNameEx
 
Hast Du inzwischen eigentlich eine Lösung gefunden? Was steht bei Dir eigentlich in den Umgebungsvariablen USERDOMAIN und USERNAME drinne?

...:cat:...

Luckie 11. Apr 2006 12:45

Re: GetUserNameEx
 
Hier an der Arbeit:
Code:
USERDNSDOMAIN=DATAWERK.DE
USERDOMAIN=DATAWERK
USERNAME=michael.puff
Zu Hause müsste ich erst gucken.

sakura 11. Apr 2006 12:46

Re: GetUserNameEx
 
Zitat:

Zitat von Luckie
Hier an der Arbeit:

Das war aber der Rechner mit den Problemen, oder?

...:cat:...

Luckie 11. Apr 2006 12:57

Re: GetUserNameEx
 
Jupp.

Matze 21. Apr 2006 09:09

Re: GetUserNameEx
 
Hi,

sorry ich muss nochmals pushen, da der Code für die Code-Library wirklich gut geeignet wäre. Doch wenn er bei einigen Personen einwandfrei funktioniert und bei anderen nicht, dann ist das nicht so schön, daher würden mich die Ursachen, wieso es bei Michael nicht richtig geht, sehr interessieren. :stupid:

Luckie 21. Apr 2006 11:27

Re: GetUserNameEx
 
So, zu Hause steht bei mir drinne:
Code:
USERDOMAIN=HAL9000
USERNAME=Michael
und das war der Rechner, wo es ging. Hier ist aber kein USERDNSDOMAIN gesetzt.

sakura 21. Apr 2006 18:51

Re: GetUserNameEx
 
Ich würde ihn erst einmal in die CodeLib setzen. Ich sehe das Problem hier eher in der Domain/auf dem speziellen PC als im Code. Wenn doch, kann man später immer noch korrigieren.

...:cat:...

himitsu 21. Apr 2006 18:58

Re: GetUserNameEx
 
Man kann ja dazuschreiben, daß es eventuell Probleme gibt, wenn kein USERDNSDOMAIN gesetzt ist.

(oder lief es auch auf anderen Rechnern ohne USERDNSDOMAIN?)

Luckie 21. Apr 2006 18:59

Re: GetUserNameEx
 
Es lief auf ohne.

Matze 8. Mai 2006 14:06

Re: GetUserNameEx
 
Hi,

und noch einmal interessehalber: Ist nun geklärt, wann der Code Probleme verursachen könnte? An der USERDNSDOMAIN liegt es dann ja nicht.

Matze 10. Jul 2006 05:53

Re: GetUserNameEx
 
So, zum allerletzen Mal: *schieb*

Sonst kommt das eben nicht in die Code-Library. ;)

Luckie 10. Jul 2006 08:25

Re: GetUserNameEx
 
Übernimm es doch einfach und verweis auf diesen Thread.

Matze 10. Jul 2006 17:02

Re: GetUserNameEx
 
Zitat:

Zitat von Luckie
Übernimm es doch einfach und verweis auf diesen Thread.

Das ist aber wie wenn ich in einem Lexikon auf Wikipedia verweisen würde.

Ich finde, in der Code-Library sollten Dingen stehen, die ohne Probleme funktionieren und falls Probleme auftreten, sollte wenigstens die Ursache dafür bekannt sein. Sonst hilft der Code einigen vielleicht nicht und davon haben wir auch nichts. Hier im Thread gibt's ja auch keine Lösung, also ist es unsinnig, darauf zu verlinken, oder nicht?

sakura 10. Jul 2006 18:03

Re: GetUserNameEx
 
Zitat:

Zitat von Matze
Hier im Thread gibt's ja auch keine Lösung, also ist es unsinnig, darauf zu verlinken, oder nicht?

Ich habediese Lösung inzwischen auf über100 Rechnern ohne Probleme im Einsatz. Ganz ehrlich, ich denke es ist ein spezielles Problem bei Luckie. Übernehmt diesen Beitrag endlich in die CodeLibrary. Kaum ein Eintrag dort hat nicht auch eine Grenze und weist nicht darauf hin, bzw. es ist überhaupt jemanden bewusst.

...:cat:...

Matze 10. Jul 2006 19:29

Re: GetUserNameEx
 
Zitat:

Zitat von sakura
Übernehmt diesen Beitrag endlich in die CodeLibrary.

Da bemüht man sich, nur funktionierendes in die CL aufzunehmen und wird so angemotzt, naja, Copy&Paste ...

Union 10. Jul 2006 19:51

Re: GetUserNameEx
 
Hallo,

bei mir ergibt es folgendes:
Zitat:

Zitat von Project1
0: Der angegebene Benutzer ist nicht vorhanden
1: CN=Oliver Funcke,OU=SBSUsers,OU=Users,OU=MyBusiness,DC=Softw areUnion,DC=local
2: SOFTWAREUNION\Oliver Funcke
3: Oliver Funcke
6: {fa58c2e6-f3b6-470c-93b1-672ac82cd0e5}
7: SoftwareUnion.local/MyBusiness/Users/SBSUsers/Oliver Funcke
8: Oliver Funcke@SoftwareUnion.local
9: SoftwareUnion.local/MyBusiness/Users/SBSUsers
Oliver Funcke
10: Zuordnungen von Kontennamen und Sicherheitskennungen wurden nicht durchgeführt
11: Der angegebene Benutzer ist nicht vorhanden

Interessant dabei:
Ich musste die Zeile mit SetString so umformulieren, da sonst das Nullbyte mit drin ist (ungünstig z.B. für ShowMessage):
Delphi-Quellcode:
SetString(Username, Buffer, Size-1)
Und bei (9:) steht tatsächlich ein $A for dem eigentlichen Namen

ichbins 17. Feb 2007 11:22

Re: GetUserNameEx
 
Mal eine ganz dumme Frage: In welcher Unit steht denn getusernameex? getusername findet er, aber getusernameex?

Ich hab alle D-2005 Standardunits eingebunden...

sakura 17. Feb 2007 11:26

Re: GetUserNameEx
 
Zitat:

Zitat von ichbins
Mal eine ganz dumme Frage: In welcher Unit steht denn getusernameex? getusername findet er, aber getusernameex?

Nirgends, siehe erster Post hier im Thread, da steht der Import aus der DLL.
Delphi-Quellcode:
function GetUserNameEx(NameFormat: DWORD;
  lpNameBuffer: LPSTR; var nSize: DWORD):Boolean; stdcall;
  external 'secur32.dll' Name 'GetUserNameExA';
...:cat:...

ichbins 17. Feb 2007 11:32

Re: GetUserNameEx
 
Sorry das hab ich irgendwie übersehen :oops:

himitsu 27. Aug 2009 08:53

Re: GetUserNameEx
 
Moin,

ich versuche die GUID des aktuellen Benutzers auszulesen und bekomme nur diese Meldung:
GetLastError: 1332
Zuordnungen von Kontennamen und Sicherheitskennungen wurden nicht durchgeführt


Was läuft denn da nur schief?


benutzte GetUserNameExW
Delphi-Quellcode:
Type EXTENDED_NAME_FORMAT = LongWord;

Const NameUniqueId = EXTENDED_NAME_FORMAT(6);

Function GetUserNameEx(NameFormat: EXTENDED_NAME_FORMAT; NameBuffer: PChar; Var Size: LongWord): Boolean; StdCall;
  External 'Secur32.dll' Name {$IF SizeOf(Char) = 1} 'GetUserNameExA' {$ELSE} 'GetUserNameExW' {$IFEND};
[add]
der Puffer ist mit 38 Zeichen (39 inkl. #0) groß genug und ich hab auch schon andere Werte versucht
- kleiner, dann kommt der "zu kleiner Puffer"-Fehler
- größer ändert nix
also am Puffer liegt es nicht

ich probier jetzt aber auch mal andere Formate (EXTENDED_NAME_FORMAT) aus

[add2]
alleine NameSamCompatible liefert ein Ergebnis, sonst kommt immer nur die 1332 :?

[add3]
arg :wall: , vergeßt es, ich seh grad, daß es der selbe Fehler ist, wie ihn Luckie schon auf Seite 1 hatte
und hier hatte eh keiner 'ne Lösung :cry:

napstar 9. Feb 2010 12:54

Re: GetUserNameEx
 
weiß einer warum das nicht compilierbar ist?..

Delphi-Quellcode:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TForm1 = class(TForm)
    Button1: TButton;
    Button2: TButton;
    procedure Button2Click(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

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 GetUserNameEx(NameFormat: DWORD;
  lpNameBuffer: LPSTR; var nSize: DWORD):Boolean; stdcall;
  external 'secur32.dll' Name 'GetUserNameExA';

function GetLoggedOnUserNameEx(fFormat: DWORD; var Username: String): DWORD;
var
  Size: DWORD;
  Buffer: array [0..1024] of Char;
begin
  Result := 0;
  Size := sizeof(Buffer);
  if GetUserNameEx(fFormat, Buffer, Size) then
    SetString(Username, Buffer, Size-1)
  else
    Result := GetLastError;
end;

procedure TForm1.Button2Click(Sender: TObject);
const
   NameFormats : Array[0..9] of DWORD = (
      NameUnknown,
      NameFullyQualifiedDN,
      NameSamCompatible,
      NameDisplay,
      NameUniqueId,
      NameCanonical,
      NameUserPrincipal,
      NameCanonicalEx,
      NameServicePrincipal,
      DNSDomainName);

var
  Username: String;
  err: DWORD;
  i : shortint;
  sMessage : string;
begin
   for i := 0 to high(NameFormats) do
   begin
      err := GetLoggedOnUserNameEx(NameFormats[i], Username);
      if err = 0 then
         sMessage := sMessage+format('%d: %s', [NameFormats[i], Username])+#13
      else
         sMessage := sMessage+format('%d: %s', [NameFormats[i], SysErrorMessage(err)])+#13;
   end;
   ShowMessage(sMessage)
end;

end.
bekomme diese meldung.
[DCC Fehler] Unit1.pas(50): E2010 Inkompatible Typen: 'Array' und 'PAnsiChar'

DeddyH 9. Feb 2010 13:02

Re: GetUserNameEx
 
Geht es so?
Delphi-Quellcode:
if GetUserNameEx(fFormat, @Buffer[0], Size) then

p80286 9. Feb 2010 13:03

Re: GetUserNameEx
 
mal eben durchgeschoben und kein Mecker bekommen!

Hast Du evtl. noch irgendwelche Reste aktiv?

Gruß
K-H

Mithrandir 9. Feb 2010 13:07

Re: GetUserNameEx
 
Über welche Delphiversion reden wir denn hier?


Alle Zeitangaben in WEZ +1. Es ist jetzt 06:05 Uhr.
Seite 1 von 2  1 2      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz