Announcement

Collapse
No announcement yet.

Delphi, Passwortabfrage über Windows-Benutzerverwaltung

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Delphi, Passwortabfrage über Windows-Benutzerverwaltung

    Hallo,
    ich möchte für meine Applik. Passworte für verschiedene Benutzer nicht <br> selbst verwalten, sondern die Windows-Benutzerverwaltung nutzen.<br>
    Unter NT (NTFS) könnte man so auch den Zugriff auf bestimmte Dateien davon<br> abhängig machen. Aber wie kann ich Username/Passwort an das <br>System senden, um dann eine Antwort (Ok, nicht ok) zu erhalten ?
    Danke, Uwe.
    Uwe Spitzenberger

  • #2
    Dazu gibt es zwei Möglichkeiten:

    1, Du benutzt die Win32-API um beim Betriebssystem nachzufragen, ober der Benutzer mit Benutzerkennung und Passwort im System bekannt ist und ob das Passwort gültig ist. Ist aber m.E. zu Aufwendig sich in die entsprechende API einzulesen (außer jemand aus dem Forum hat ein fertiges Beispiel), oder

    2, Du verwendest die Komponentensammlung NTSet von http://www.belcaf.com/. Da gibt es auch ein entsprechendes Beispiel, welches einen Dialog hat, um einen Benutzer zu verifizieren

    Comment


    • #3

      <i>Die Antwort wird sicherlich nicht mehr benötigt, doch für die, die es interessiert...</i><p>
      Es gibt einen kleinen Trick an der Sache.<br>
      Man kann <b>NetUserChangePassword</b> benutzen, um das Passwort eines Accounts zu überprüfen, obwohl der User <b>nicht</b> das Recht haben muß, das betreffende Passwort zu ändern!!! Diese Funktion ist so freundlich, wenn man als altes <b>und</b> neues das richtige Paßwort angibt, einen Erfolg zu melden!<p>
      Hier mal etwas Delphi5-Quelltext dazu...<p>
      <pre><p><i>{***}</i>
      <p>
      <b>const</b>
      netapi32 = 'netapi32.dll';
      <p>
      <b>const</b>
      NERR_Success = 0;
      NERR_BASE = 2100;
      MAX_NERR = NERR_BASE + 899;
      <p>
      <b>type</b>
      NET_API_STATUS = DWORD;
      <p>
      <b>function</b> NetUserChangePassword(
      domainname : LPCWSTR; <i>{ IN OPTIONAL }</i>
      username : LPCWSTR; <i>{ IN OPTIONAL }</i>
      oldpassword: LPCWSTR; <i>{ IN }</i>
      newpassword: LPCWSTR <i>{ IN }</i>
      ): NET_API_STATUS; <b>stdcall</b>;
      <b>external</b> netapi32 name 'NetUserChangePassword';
      <p>
      <i>{***}</i>
      <p>
      <b>function</b> ValidateUserPassword(<b>const</b> Domain, User, Password: <b>string</b>): NET_API_STATUS;
      <b>var</b>
      DomainBuff: <b>array</b> [0..1023] <b>of</b> WideChar;
      DomainName: PWideChar;
      UserBuff: <b>array</b> [0..1023] <b>of</b> WideChar;
      UserName: PWideChar;
      NewPassword: <b>array</b> [0..1023] <b>of</b> WideChar;
      OldPassword: <b>array</b> [0..1023] <b>of</b> WideChar;
      <b>begin</b>
      StringToWideChar(Password, PWideChar(@NewPassword[0]), SizeOf(NewPassword));
      StringToWideChar(Password, PWideChar(@OldPassword[0]), SizeOf(OldPassword));
      <b>if</b> Length(Domain) > 0 <b>then</b>
      <b>begin</b>
      StringToWideChar(Domain, PWideChar(@DomainBuff[0]), SizeOf(DomainBuff));
      DomainName := PWideChar(@DomainBuff[0]);
      <b>end</b>
      <b>else</b>
      DomainName := <b>nil</b>;
      <b>if</b> Length(User) > 0 <b>then</b>
      <b>begin</b>
      StringToWideChar(User, PWideChar(@UserBuff[0]), SizeOf(UserBuff));
      UserName := PWideChar(@UserBuff[0]);
      <b>end</b>
      <b>else</b>
      UserName := <b>nil</b>;
      Result := NetUserChangePassword(DomainName, UserName,
      PWideChar(@OldPassword[0]), PWideChar(@NewPassword[0]));
      <b>end</b>;
      <p>
      <i>{***}</i>
      <p>
      <i>{ Utility (Net-API Fehler von 2100-2999) }</i>
      <b>function</b> NetErrorMessage(ErrorCode: Integer): <b>string</b>;
      <b>const</b>
      MESSAGE_FILENAME = 'netmsg.dll';
      <b>var</b>
      MsgLib: HMODULE;
      Len: Integer;
      Buffer: <b>array</b> [0..255] <b>of</b> Char;
      <b>begin</b>
      MsgLib := GetModuleHandle(MESSAGE_FILENAME);
      <b>if</b> MsgLib = 0 <b>then</b>
      MsgLib := LoadLibrary(MESSAGE_FILENAME);
      Len := FormatMessage(FORMAT_MESSAGE_FROM_HMODULE <b>or</b>
      FORMAT_MESSAGE_ARGUMENT_ARRAY, Pointer(MsgLib),
      ErrorCode, 0, Buffer, SizeOf(Buffer), <b>nil</b>);
      <b>while</b> (Len > 0) <b>and</b> (Buffer[Len - 1] <b>in</b> [#0..#32, '.']) <b>do</b> Dec(Len);
      SetString(Result, Buffer, Len);
      <b>end</b>;
      <p>
      <i>{ Beispiel }</i>
      <b>procedure</b> TForm1.Button1Click(Sender: TObject);
      <b>var</b>
      ErrorCode: NET_API_STATUS;
      ErrorText: <b>string</b>;
      <b>begin</b>
      ErrorCode := ValidateUserPassword(Edit1.Text, Edit2.Text, Edit3.Text);
      <b>if</b> ErrorCode = NERR_Success <b>then</b>
      ShowMessage('Password ist gültig.')
      <b>else</b>
      <b>begin</b>
      ErrorText := 'Password ist ungültig / nicht überprüfbar!'#13#10 +
      '$' + IntToHex(ErrorCode, 8) + ' (' + IntToStr(ErrorCode) + '): "';
      <b>if</b> (ErrorCode >= NERR_BASE) <b>and</b> (ErrorCode <= MAX_NERR) <b>then</b>
      ErrorText := ErrorText + NetErrorMessage(ErrorCode)
      <b>else</b>
      ErrorText := ErrorText + SysErrorMessage(ErrorCode);
      ErrorText := ErrorText + '"';
      ShowMessage(ErrorText);
      <b>end</b>;
      <b>end</b>;
      <p>
      <i>{***}</i><p></pre>
      <p>
      Gruß Nico
      &#10

      Comment

      Working...
      X