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/)
-   -   Delphi Benutzer Kennwort erforderlich - UF_PASSWD_NOTREQD (https://www.delphipraxis.net/117508-benutzer-kennwort-erforderlich-uf_passwd_notreqd.html)

F.W. 19. Jul 2008 12:42


Benutzer Kennwort erforderlich - UF_PASSWD_NOTREQD
 
Ich schreibe gerade an einem kleinen Programm, welches den normalen Herunterfahren- und Abmeldendialog ersetzen soll. (also nicht im System ersetzen, man startet einfach das Programm an Stelle von Computer Ausschalten im Startmenü)

Für alles weitere: ich benutze WinXP Home
Da soll auch Bildschirm sperren mit rein. Nun soll der Button dafür aber nur dann angezeigt werden, wenn der Benutzer auch ein Passwort hat, ansonsten ist es ja sinnlos.
Also habe ich mit der NetUserGetInfo funktion angefangen, bin nun aber am Ende meines Einfallsreichtums
Mein Hauptproblem ist jetzt: Ich weiß einfach nicht, woher ich den Wert von UF_PASSWD_NOTREQD bekomme!

Mal so noch zum drüber sehen meine Funktion:
Delphi-Quellcode:
  USER_INFO_1 = packed record
    usri1_name: LPWSTR;
    usri1_password: LPWSTR;
    usri1_password_age: DWORD;
    usri1_priv: DWORD;
    usri1_homde_dir: LPWSTR;
    usri1_comment: LPWSTR;
    usri1_flags: DWORD;
    usri1_script_path: LPWSTR;
  end;

  function NetUserGetInfo(servername: LPCWSTR; username: LPCWSTR; level: DWORD; var bufptr: Pointer): DWORD;
           stdcall; external 'netapi32.dll' name 'NetUserGetInfo';

  function NetApiBufferFree(Buffer: Pointer): DWORD; stdcall;
           external 'netapi32.dll' name 'NetApiBufferFree';

 { ... }

function TMainForm.IsPasswordRequired: Boolean;
const
 UF_PASSWD_NOTREQD = 32;
var
 Info: USER_INFO_1;
 P: Pointer;
 UserName: PWideChar;
 nSize: Cardinal;
begin
 nSize := 0;
 GetUserNameW(NIL, nSize);
 GetMem(UserName, nSize*2+1);
 GetUserNameW(UserName, nSize);

 NetUserGetInfo(NIL, UserName, 1, P);
 Info := USER_INFO_1(P^);
 Result := not ((Info.usri1_flags and UF_PASSWD_NOTREQD) = UF_PASSWD_NOTREQD);

 NetApiBufferFree(P);
 FreeMem(UserName);
end;

marabu 19. Jul 2008 13:07

Re: Benutzer Kennwort erforderlich - UF_PASSWD_NOTREQD
 
Hallo,

solche Konstanten findest du im Windows SDK - einfach per GREP über das Verzeichnis INCLUDE drüber und da hast du dann in der Datei LMaccess.h:

Code:
//
//  Bit masks for field usriX_flags of USER_INFO_X (X = 0/1).
//

#define UF_SCRIPT                         0x0001
#define UF_ACCOUNTDISABLE                 0x0002
#define UF_HOMEDIR_REQUIRED               0x0008
#define UF_LOCKOUT                        0x0010
#define UF_PASSWD_NOTREQD                 0x0020
#define UF_PASSWD_CANT_CHANGE             0x0040
#define UF_ENCRYPTED_TEXT_PASSWORD_ALLOWED 0x0080
Oder du verwendest die JEDI Units JwaLM bzw. JwaLMaccess.

Freundliche Grüße

F.W. 19. Jul 2008 19:23

Re: Benutzer Kennwort erforderlich - UF_PASSWD_NOTREQD
 
Zitat:

solche Konstanten findest du im Windows SDK
In der Windows SDK Hilfe oder in einer Datei?
Wenn in der Hilfe - wo?
Wenn als Datei - wie heißt sie/wo ist sie?

Irgendwas klappt da bei mir noch nicht, aber allein um auszuwerten, was die Funktion zurückgibt fehlen mir schonwieder die nächsten Konstanten, daher würde ich gern genau wissen, ob ich diese Deklarationen schon auf meinem Computer habe und nur nicht finde.
Ich hab Delphi 7 Personal

marabu 19. Jul 2008 20:57

Re: Benutzer Kennwort erforderlich - UF_PASSWD_NOTREQD
 
Hallo,

zum Windows SDK gehören u.a. alle C++ Header Files für die dokumentierten APIs. Den aktuellen SDK kannst du dir bei Microsoft ziehen. Falls du nicht breit genug angebunden bist, dann gibt es eventuell die Möglichkeit sich den SDK gegen eine Aufwandspauschale auf DVD schicken zu lassen. Ob das so ist musst du selbst prüfen. Alleine das INCLUDE-Verzeichnis belegt als ZIP-Archiv etwa 10MB. Die relevante Header-Datei hatte ich angegeben. Eventuell ist es für dich günstiger, wenn du dir die JEDI Windows API besorgst. Auch die relevanten Units dort hatte ich angegeben.

Freundliche Grüße

F.W. 19. Jul 2008 21:11

Re: Benutzer Kennwort erforderlich - UF_PASSWD_NOTREQD
 
Gut, bei MS ist das zeug 1,3 GB groß, dann glaub ich nicht, dass das bei meiner Delphi-Installation mit auf meine Platte gekommen ist.

Was ist denn da noch drin, dass das so groß ist :shock:
Ich hab zwar ne DSL Flat, aber dafür ist mir die Verbindung doch wieder zu langsam, dass ich ne ganze DVD ziehe und nachher brauch ich nur n paar Zeilen.
Gibts das auch stückchenweise? Also eben wie du sagtest alle Header-Dateien in einem kleinen Archiv?

Danke!

Bernhard Geyer 19. Jul 2008 21:14

Re: Benutzer Kennwort erforderlich - UF_PASSWD_NOTREQD
 
Guckst du bei MSDN-Library ob du was findest.

marabu 19. Jul 2008 21:34

Re: Benutzer Kennwort erforderlich - UF_PASSWD_NOTREQD
 
Du könntest auch einfach dem Link "Web-Setup" im Abschnitt "Instructions" auf der von mir verlinkten MS-Seite folgen. Mit diesem Setup holst du dir den 500KB großen Setup-Manager und wählst nur die Sachen aus, die du wirklich (Header Files) brauchst. Wenn du Glück hast, hält sich das in Grenzen.

Luckie 19. Jul 2008 21:40

Re: Benutzer Kennwort erforderlich - UF_PASSWD_NOTREQD
 
Jupp, tut es. Ich habe mir so nur das reine Windows SDK und die Header installiert, ging ruckzuck mit DSL3000.

F.W. 23. Jul 2008 12:42

Re: Benutzer Kennwort erforderlich - UF_PASSWD_NOTREQD
 
Sooo, ich habs jetzt endlich geschafft!

Ich hatte das WebSetup zwar benutzt, aber bei meiner ersten Installation wurde nichts installiert (obwohl ich die mir wichtigen Dinge ausgewählt hatte), weil ich da das Visual C++ Express noch nicht drauf hatte (oder ein ähnliches Produkt).

Jetzt hats jedenfalls funktioniert! Danke nochmal an alle! :-D

F.W. 24. Jul 2008 15:05

Re: Benutzer Kennwort erforderlich - UF_PASSWD_NOTREQD
 
Es klappt einfach nicht!

Der folgende Code enthält nie das UF_PASSWD_NOTREQD-Flag, egal ob ich ein Kennwort besitze oder nicht?!

Delphi-Quellcode:
   USER_INFO_1 = record
    usri1_name: LPWSTR;
    usri1_password: LPWSTR;
    usri1_password_age: DWORD;
    usri1_priv: DWORD;
    usri1_homde_dir: LPWSTR;
    usri1_comment: LPWSTR;
    usri1_flags: DWORD;
    usri1_script_path: LPWSTR;
  end;


  function NetUserGetInfo(servername: LPCWSTR; username: LPCWSTR; level: DWORD; var bufptr: Pointer): DWORD;
           stdcall; external 'netapi32.dll' name 'NetUserGetInfo';

  function NetApiBufferFree(Buffer: Pointer): DWORD; stdcall;
           external 'netapi32.dll' name 'NetApiBufferFree';

 { ... }

function TMainForm.PasswordNotRequired: Boolean;
const
 UF_PASSWD_NOTREQD = 32;
var
 Info: USER_INFO_1;
 P: Pointer;
 UserName: PWideChar;
 nSize: Cardinal;
 R: DWORD;
begin
 Result := True;
 nSize := 0;
 GetUserNameW(NIL, nSize);
 GetMem(UserName, nSize*2+1);
 GetUserNameW(UserName, nSize);

 if NetUserGetInfo(NIL, UserName, 1, P) = 0 then begin
    Info := USER_INFO_1(P^);
    Result := ((Info.usri1_flags and UF_PASSWD_NOTREQD) = UF_PASSWD_NOTREQD);
 end;

 NetApiBufferFree(P);
 FreeMem(UserName);
end;
Liegts an meinem Code?

Ich bin auch gern bereit eine andere Methode zu benutzen, um rauszubekommen, ob der user ein Passwort hat oder nicht! (Nur die JEDIs wollte ich nicht erst wieder drauf machen, die sind soo viel ^^ )


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