Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Benutzerkennwort zurücksetzen (https://www.delphipraxis.net/117114-benutzerkennwort-zuruecksetzen.html)

kuba 11. Jul 2008 19:40


Benutzerkennwort zurücksetzen
 
Hallo,

weiss jemand wie man ein Benutzerkennwort mit Delphi zurücksetzen kann ?

mir fällt nur ein : net user Benutzer *

aber dann müsste man 2 mal ENTER an das DOS-Fenster senden ...

KUBA

Larsi 11. Jul 2008 20:54

Re: Benutzerkennwort zurücksetzen
 
Es ist vielleicht nicht das Einfachsteste aber über control userpasswords2 gibts den Button "Kennwort zurücksetzen" vielleicht kannste den irgendwie "virtuell" drücken :) .

Dezipaitor 11. Jul 2008 21:11

Re: Benutzerkennwort zurücksetzen
 
Guck mal hier.

Luckie 11. Jul 2008 21:56

Re: Benutzerkennwort zurücksetzen
 
Und einen Delphi Wrapper für die von Dezipaitor genannte Funktion, gibt es bei mir in meiner Unit MpuNTUser.pas: http://www.michael-puff.de/Developer/Delphi/Units/

kuba 12. Jul 2008 08:44

Re: Benutzerkennwort zurücksetzen
 
Zitat:

Zitat von Dezipaitor

Hab mir genau diese Seite angesehen, da muss ich aber das alte Kennwort wissen, oder kann ich dort auch mit "*" arbeiten ?

KUBA

kuba 12. Jul 2008 08:45

Re: Benutzerkennwort zurücksetzen
 
Zitat:

Zitat von Luckie
Und einen Delphi Wrapper für die von Dezipaitor genannte Funktion, gibt es bei mir in meiner Unit MpuNTUser.pas: http://www.michael-puff.de/Developer/Delphi/Units/

Hab ich mir auch schon angesehen, blicke nicht ganz durch ...

KUBA

Basilikum 12. Jul 2008 09:35

Re: Benutzerkennwort zurücksetzen
 
Zitat:

Zitat von kuba
Hab mir genau diese Seite angesehen, da muss ich aber das alte Kennwort wissen, oder kann ich dort auch mit "*" arbeiten ?

bei Verwendung von MSDN-Library durchsuchenNetUserSetInfo mit Level 1003 kann das Kennwort auch ohne das alte gesetzt werden (natürlich vorausgesetzt, die erforderlichen Permissions sind vorhanden).

kuba 12. Jul 2008 15:59

Re: Benutzerkennwort zurücksetzen
 
Zitat:

Zitat von Basilikum
Zitat:

Zitat von kuba
Hab mir genau diese Seite angesehen, da muss ich aber das alte Kennwort wissen, oder kann ich dort auch mit "*" arbeiten ?

bei Verwendung von MSDN-Library durchsuchenNetUserSetInfo mit Level 1003 kann das Kennwort auch ohne das alte gesetzt werden (natürlich vorausgesetzt, die erforderlichen Permissions sind vorhanden).

Was Bedeutet Level 1003 ? Habe hier folgende Funktion :

Delphi-Quellcode:
//********************************************
//SET A USER INFO
function SetUserInfo(fusername,fserver,ffulname,fcomment:string;FFlags,fuserID:dword):LongInt;
var TheUser:Array[0..255] Of WideChar;
    TheServer:Array[0..255] Of WideChar;
    TheFullName:Array[0..255] Of WideChar;
    TheComment:Array[0..255] Of WideChar;
    MyInfo:USER_INFO_20;
begin
     StringToWideChar(FUserName,@TheUser,255);
     StringToWideChar(FServer,@TheServer,255);
     StringToWideChar(FFullName,@TheFullName,255);
     StringToWideChar(FComment,@TheComment,255);
     MyInfo.usri20_name:=@TheUser;
     MyInfo.usri20_full_name:=@TheFullName;
     MyInfo.usri20_comment:=@TheComment;
     MyInfo.usri20_flags:=FFlags;
     MyInfo.usri20_user_id:=FUserID;
     Result:=NetUserSetInfo(@TheServer,@TheUser,20,@MyInfo,nil);
end;
//******************************************************************
Wie verwende ich diese Funktion (mit Level 1003) um das Benutzerkennwort zu löschen bzw. zu setzen ?

Ich beschäftige mich zur Zeit mit einer Software die einen PC in den KIOSK - Modus versetzen soll. Dabei möchte ich aus einem Systemdienst heraus Informationen in die Registry meines "KIOSK-User" schreiben, ausserdem möchte ich dass der Systemdienst abcheckt ob der KIOSK-User eingeloggt ist. Falls dies der Fall ist soll der Systemdienst die KIOSK-Anwendung mit Benutzerrechten starten. Bisher verwende ich ein Hilfsprogramm dass bei der Benutzeranmeldung über Run-Key in der Registry gestartet wird, Registry Informationen kann ich jedoch nur importieren wenn mein KIOSK-Benutzer Administratorrechte hat. Daher kam mir die Idee, die Registryinformationen durch meinen Systemdienst in das Benutzerkonto zu schreiben, dann sind die Informationen schon vor dem einloggen im Profil und können sogar während der Laufzeit geändert werden. Wäre eine tolle Verbesserung für meine Software !!

KUBA

Basilikum 12. Jul 2008 16:31

Re: Benutzerkennwort zurücksetzen
 
hier ein Beispiel für die Verwendung von NetUserSetInfo mit Level 1003 (Kennwort setzen):
Delphi-Quellcode:
Function                         LM_NetUserSetServerPassword(Const Server,UserName,NewPassword : String) : Boolean;
Type
  TUserInfo_1003                  = Packed Record
    Password                     : PWideChar;
  end;
Const
  LM20_PWLEN                     = 20;
Var
  BufServer                      : Array[0..63] Of WideChar;
  BufUsername                    : Array[0..63] Of WideChar;
  BufPassword                    : Array[0..LM20_PWLEN - 1] Of WideChar;

  UI1003                          : TUserInfo_1003;
  Param_Err                      : DWORD;
  Res                            : NetAPIStatus;
Begin
  StringToWideChar(Server,BufServer,Length(BufServer));
  StringToWideChar(Username,BufUsername,Length(BufUsername));
  StringToWideChar(NewPassword,BufPassword,Length(BufPassword));

  UI1003.Password:=@BufPassword;
  Res:=NetUserSetInfo(BufServer,BufUsername,1003,@UI1003,Param_Err);
  Result:=(Res = NERR_Success);
end;
(Server kann ein leerer String sein, sofern es sich um einen lokalen User handelt, für Domain-Users muss der Name eines DCs angegeben werden)

kuba 12. Jul 2008 16:44

Re: Benutzerkennwort zurücksetzen
 
@Basilikum

thanx, probier ich aus ...
langsam verstehe ich, geil :zwinker:

Evtl. kann ich mein Problem lösen indem ich das Kennwort meines KIOSK-User immer komplett zurücksetzte (keins). Um Informationen in die Registry zu speichern könnte ich dem User ein Kennwort erteilen, ihn zur Gruppe "Administratoren" hinzufügen und dann mit "RunAs" die Informationen importieren. Anschliessend entferne ich den KIOSK-User wieder aus der Gruppe "Administratoren". So könnte ich meinem KIOSK-User nur "Benutzerrechte" erteilen und mit meinem "RunAs" die Informationen importieren (z.B. neue Startseite im Internet Explorer setzten). Cool, ich probier das mal aus, muss aber erstmal nach meinem Schatz schauen :cat:

KUBA

kuba 13. Jul 2008 18:09

Re: Benutzerkennwort zurücksetzen
 
@Basilikum

Hy, leider kann ich den Code nicht fehlerfrei übersetzen, ich erhalte Fehlermeldungen:

[Fehler] projekt.dpr(1414): E2003 Undefinierter Bezeichner: 'NetAPIStatus'
[Fehler] projekt.dpr(1421): E2003 Undefinierter Bezeichner: 'NetUserSetInfo'
[Fehler] projekt.dpr(1422): E2003 Undefinierter Bezeichner: 'NERR_Success'

Wie muss ich die Bezeichner deklarieren ?

KUBA

Basilikum 13. Jul 2008 18:35

Re: Benutzerkennwort zurücksetzen
 
die drei Bezeichner sind wie folgte definiert:
Delphi-Quellcode:
Const
  NERR_Success                      = 0;

Type
  NetAPIStatus                      = Integer;

Function NetUserSetInfo(ServerName,UserName : PWideChar;Level : Integer;Const Buf : Pointer;Var Parm_Err : DWORD) : NetAPIStatus; StdCall;

kuba 13. Jul 2008 19:45

Re: Benutzerkennwort zurücksetzen
 
jetzt erhalte ich Fehlermeldung : [Fehler] watch.dpr(1565): E2029 ';' erwartet, aber '.' gefunden

ist das "end" richtig ?

Delphi-Quellcode:
Type
  TUserInfo_1003                  = Packed Record
    Password                     : PWideChar;
  end;
kuba

mkinzler 13. Jul 2008 19:49

Re: Benutzerkennwort zurücksetzen
 
Dann liegt der Fehler vorher im Quellcode

kuba 13. Jul 2008 19:53

Re: Benutzerkennwort zurücksetzen
 
Zitat:

Zitat von mkinzler
Dann liegt der Fehler vorher im Quellcode


Wenn ich den Code wieder aus dem Projekt entferne funktionierts aber (wieder) ...

Hier nochmal komplett:
Delphi-Quellcode:
Const
  NERR_Success                = 0;
Type
  NetAPIStatus                = Integer;

Function NetUserSetInfo(ServerName,UserName : PWideChar;Level : Integer;
Const Buf : Pointer; Var Parm_Err : DWORD) : NetAPIStatus; StdCall;

Function LM_NetUserSetServerPassword(Const Server,UserName,NewPassword : String) : Boolean;
Type
  TUserInfo_1003                  = Packed Record
    Password                     : PWideChar;
  end;
Const
  LM20_PWLEN                     = 20;
Var
  BufServer                      : Array[0..63] Of WideChar;
  BufUsername                    : Array[0..63] Of WideChar;
  BufPassword                    : Array[0..LM20_PWLEN - 1] Of WideChar;

  UI1003                          : TUserInfo_1003;
  Param_Err                      : DWORD;
  Res                            : NetAPIStatus;
Begin
  StringToWideChar(Server,BufServer,Length(BufServer));
  StringToWideChar(Username,BufUsername,Length(BufUsername));
  StringToWideChar(NewPassword,BufPassword,Length(BufPassword));

  UI1003.Password:=@BufPassword;
  Res:=NetUserSetInfo(BufServer,BufUsername,1003,@UI1003,Param_Err);
  Result:=(Res = NERR_Success);
end;
KUBA

mkinzler 13. Jul 2008 19:56

Re: Benutzerkennwort zurücksetzen
 
Du solltest die Unit auch mal ordnen:

Delphi-Quellcode:
Const
   ...
Type
   ...
Var
   ...

kuba 13. Jul 2008 20:01

Re: Benutzerkennwort zurücksetzen
 
:coder2:

so ?

Delphi-Quellcode:
Const
  NERR_Success                = 0;
Type
  NetAPIStatus                = Integer;

Function NetUserSetInfo(ServerName,UserName : PWideChar;Level : Integer;
Const Buf : Pointer; Var Parm_Err : DWORD) : NetAPIStatus; StdCall;

Function LM_NetUserSetServerPassword(Const Server,UserName,NewPassword : String) : Boolean;
Const
  LM20_PWLEN                     = 20;
Type
  TUserInfo_1003                  = Packed Record
    Password                     : PWideChar;
  end;                                                    <<<<<---- dieses end !!
Var
  BufServer                      : Array[0..63] Of WideChar;
  BufUsername                    : Array[0..63] Of WideChar;
  BufPassword                    : Array[0..LM20_PWLEN - 1] Of WideChar;

  UI1003                          : TUserInfo_1003;
  Param_Err                      : DWORD;
  Res                            : NetAPIStatus;
Begin
.....
geht auch nicht, was macht das "end" ??

dominikkv 13. Jul 2008 20:03

Re: Benutzerkennwort zurücksetzen
 
gehört zum record

mkinzler 13. Jul 2008 20:04

Re: Benutzerkennwort zurücksetzen
 
Alle Konstanten unter Const
Alle Typen unter Type
Alle Variablen unter Var

kuba 13. Jul 2008 20:08

Re: Benutzerkennwort zurücksetzen
 
:gruebel:

will aber nich ...

Delphi-Quellcode:
Type
  NetAPIStatus                = Integer;

Function NetUserSetInfo(ServerName,UserName : PWideChar;Level : Integer;
Const Buf : Pointer; Var Parm_Err : DWORD) : NetAPIStatus; StdCall;

Function LM_NetUserSetServerPassword(Const Server,UserName,NewPassword : String) : Boolean;
Const
  NERR_Success                = 0;
  LM20_PWLEN                  = 20;
Type
  TUserInfo_1003                  = Packed Record
    Password                     : PWideChar;
  end;
Var
  BufServer                      : Array[0..63] Of WideChar;
  BufUsername                    : Array[0..63] Of WideChar;
  BufPassword                    : Array[0..LM20_PWLEN - 1] Of WideChar;

  UI1003                          : TUserInfo_1003;
  Param_Err                      : DWORD;
  Res                            : NetAPIStatus;
Begin
.....

mkinzler 13. Jul 2008 20:12

Re: Benutzerkennwort zurücksetzen
 
Red ich gegen eine Wand :wall:

kuba 13. Jul 2008 20:16

Re: Benutzerkennwort zurücksetzen
 
Zitat:

Zitat von mkinzler
Red ich gegen eine Wand :wall:

Habe den Code gerage nochmal in ein anderes Projekt eingefügt (zum testen), gleiche Fehlermeldung:

[Fehler] projekt.dpr(1565): E2029 ';' erwartet, aber '.' gefunden


aber dies muss doch "oben" stehen ...

Delphi-Quellcode:
Type
  NetAPIStatus                = Integer;
KUBA

kuba 13. Jul 2008 20:18

Re: Benutzerkennwort zurücksetzen
 
so, nochmal :
Delphi-Quellcode:
Const
  NERR_Success                = 0;
  LM20_PWLEN                  = 20;
Type
  NetAPIStatus                = Integer;
  TUserInfo_1003               = Packed Record
    Password                  : PWideChar;
  end;
Var
  BufServer                   : Array[0..63] Of WideChar;
  BufUsername                 : Array[0..63] Of WideChar;
  BufPassword                 : Array[0..LM20_PWLEN - 1] Of WideChar;

  UI1003                       : TUserInfo_1003;
  Param_Err                   : DWORD;
  Res                         : NetAPIStatus;
Function NetUserSetInfo(ServerName,UserName : PWideChar;Level : Integer;
Const Buf : Pointer; Var Parm_Err : DWORD) : NetAPIStatus; StdCall;

Function LM_NetUserSetServerPassword(Const Server,UserName,NewPassword : String) : Boolean;
Begin
  StringToWideChar(Server,BufServer,Length(BufServer));
  StringToWideChar(Username,BufUsername,Length(BufUsername));
  StringToWideChar(NewPassword,BufPassword,Length(BufPassword));

  UI1003.Password:=@BufPassword;
  Res:=NetUserSetInfo(BufServer,BufUsername,1003,@UI1003,Param_Err);
  Result:=(Res = NERR_Success);
end;
geht aber auch nicht :roteyes:

KUBA

mkinzler 13. Jul 2008 20:19

Re: Benutzerkennwort zurücksetzen
 
Du solltest Function NetUserSetInfo auch implementieren oder zumindest einen begin..end-Block einfügen

Basilikum 13. Jul 2008 20:51

Re: Benutzerkennwort zurücksetzen
 
die Funktion NetUserSetInfo ist eine API und liegt in einer DLL:
Delphi-Quellcode:
Function NetUserSetInfo(ServerName,UserName : PWideChar;Level : Integer; Const Buf : Pointer; Var Parm_Err : DWORD) : NetAPIStatus; StdCall; External 'NETAPI32.DLL';
(das "External..." habe ich vorhin vergessen mitzukopieren)

mkinzler 13. Jul 2008 20:55

Re: Benutzerkennwort zurücksetzen
 
Dann sollte diese aber in das Interface

kuba 13. Jul 2008 21:55

Re: Benutzerkennwort zurücksetzen
 
so gehts :dancer:

Delphi-Quellcode:
Type
  NetAPIStatus                = Integer;

Function NetUserSetInfo(ServerName,UserName : PWideChar;Level : Integer;
Const Buf : Pointer; Var Parm_Err : DWORD) : NetAPIStatus; StdCall; External 'NETAPI32.DLL';

Function LM_NetUserSetServerPassword(Const Server,UserName,NewPassword : String) : Boolean;
Const
  NERR_Success                = 0;
  LM20_PWLEN                  = 20;
Type
  TUserInfo_1003                  = Packed Record
    Password                     : PWideChar;
  end;
Var
  BufServer                      : Array[0..63] Of WideChar;
  BufUsername                    : Array[0..63] Of WideChar;
  BufPassword                    : Array[0..LM20_PWLEN - 1] Of WideChar;

  UI1003                          : TUserInfo_1003;
  Param_Err                      : DWORD;
  Res                            : NetAPIStatus;
Begin
  StringToWideChar(Server,BufServer,Length(BufServer));
  StringToWideChar(Username,BufUsername,Length(BufUsername));
  StringToWideChar(NewPassword,BufPassword,Length(BufPassword));

  UI1003.Password:=@BufPassword;
  Res:=NetUserSetInfo(BufServer,BufUsername,1003,@UI1003,Param_Err);
  Result:=(Res = NERR_Success);
end;

kuba 13. Jul 2008 22:31

Re: Benutzerkennwort zurücksetzen
 
Zitat:

Zitat von Basilikum
bei Verwendung von MSDN-Library durchsuchenNetUserSetInfo mit Level 1003 kann das Kennwort auch ohne das alte gesetzt werden (natürlich vorausgesetzt, die erforderlichen Permissions sind vorhanden).

Kann mich noch jemand aufklären was Level 1003 bedeutet und welche Level es sonst noch gibt oder wo ich mich da mal schlau machen kann ???

KUBA

Christian Seehase 13. Jul 2008 23:34

Re: Benutzerkennwort zurücksetzen
 
Moin Kuba,

Du hast nicht zufällig mal auf den Link geklickt, den Basilikum da gepostet hat... ;-)

kuba 14. Jul 2008 08:15

Re: Benutzerkennwort zurücksetzen
 
Hy,

wenn ich das richtig sehe gibt es unterschiedlche "Strukturen" für NetUserSetInfo, z.B.: The USER_INFO_1011 structure contains the full name of a network user.

Level 1011 enthält den "full name" of a network user - sehe ich das richtig ?

Kann man "RunAs" auch mit Level 1003 (ohne Kennwort) ausführen ?

KUBA

Luckie 14. Jul 2008 09:14

Re: Benutzerkennwort zurücksetzen
 
Was hat jetzt da seine mit dem anderen zu tun? Willst du Programme unter einem anderem Benutzerkonto ausführen mit dem Konsolenprogramm RunAs zum beispiel, muss zum einen der Dienst "Sekundäre Anmeldung" laufen und das betreffende Konto muss mit einem Passwort versehen sein.

kuba 14. Jul 2008 11:35

Re: Benutzerkennwort zurücksetzen
 
Hy,

mit diesem Code hatte ich es schon mal am laufen:

Delphi-Quellcode:
function CreateProcessAsLogon(const User, PW, Application, CmdLine: WideString):
  Boolean;
var
  si          : TStartupInfoW;
  pif         : TProcessInformation;
begin
  ZeroMemory(@si, sizeof(TStartupInfo));
  si.cb := SizeOf(TStartupInfoW);
  si.dwFlags := STARTF_USESHOWWINDOW;
  si.wShowWindow := 1;
  Result := CreateProcessWithLogonW(PWideChar(User), nil, PWideChar(PW),
    LOGON_WITH_PROFILE, nil, PWideChar(Application +' '+CmdLine),
    CREATE_DEFAULT_ERROR_MODE, nil, nil, si, pif);
end;
Jetzt habe ich den Code wieder in mein Projekt eingefügt und erhalte : [Fehler] projekt.dpr(1635): E2010 Inkompatible Typen: 'PStartupInfoW' und '_STARTUPINFOW'

KUBA

kuba 14. Jul 2008 11:44

Re: Benutzerkennwort zurücksetzen
 
jetzt funktionierts, irgendetwas war mit den Units nicht OK...

der Code funzt leider doch nicht richtig, aber ich hab jetzt endlich eine Möglichkeit gefunden ..

Delphi-Quellcode:
 if LogonUser(PAnsiChar(USERNAME),       // UserName
             PAnsiChar(''),         // Domäne oder lokaler Rechner
             PAnsiChar('Passwort'),       // Password
             LOGON32_LOGON_BATCH or LOGON32_LOGON_NETWORK or LOGON32_LOGON_INTERACTIVE,
             LOGON32_PROVIDER_DEFAULT,
             AdminToken)
     then begin
       if ImpersonateLoggedOnUser(AdminToken)
       then begin
              // hier kommt Dein Prog.-Code hin
              winexec('notepad.exe',SW_SHOW);
              RevertToSelf;             // zurückschalten zum angemeldeten Benutzer
            end;
     end;
:roll:

KUBA

kuba 14. Jul 2008 18:10

Re: Benutzerkennwort zurücksetzen
 
Zitat:

Zitat von kuba
Ich beschäftige mich zur Zeit mit einer Software die einen PC in den KIOSK - Modus versetzen soll. Dabei möchte ich aus einem Systemdienst heraus Informationen in die Registry meines "KIOSK-User" schreiben, ausserdem möchte ich dass der Systemdienst abcheckt ob der KIOSK-User eingeloggt ist. Falls dies der Fall ist soll der Systemdienst die KIOSK-Anwendung mit Benutzerrechten starten. Bisher verwende ich ein Hilfsprogramm dass bei der Benutzeranmeldung über Run-Key in der Registry gestartet wird, Registry Informationen kann ich jedoch nur importieren wenn mein KIOSK-Benutzer Administratorrechte hat. Daher kam mir die Idee, die Registryinformationen durch meinen Systemdienst in das Benutzerkonto zu schreiben, dann sind die Informationen schon vor dem einloggen im Profil und können sogar während der Laufzeit geändert werden. Wäre eine tolle Verbesserung für meine Software !!

KUBA

Hallo,

danke nochmal für die Tip´s !! :angel:

Ich habs mit einem Zusammenspiel der o.g. Codes hinbekomen. Über den Service erteile ich bei Bedarf meinem User Admin-Rechte und starte dann mit RunAs aus meinem Hilfsprogramm den Informationsimport. Klappt prima und ist schön kompatibel, so habe ich meine Software wirklich stark verbessert !!!

Jetzt muss ich unbedingt mal durchforsten und aufräumen :mrgreen:

KUBA

PS: Wer Lust hat kann meine Software mal testen, aber auf eigene Gefahr :mrgreen:
Nee, funktioniert schon, nur wenn ein Bug drin ist kanns schonmal heikel werden ...
KIOSK-Professional Softwarepaket


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