Entwickler-Ecke

Windows API - LogonUser und seine Fehlercodes


Harry M. - So 31.07.05 15:47
Titel: LogonUser und seine Fehlercodes
Hi

ich möchte meine Client-Server-Anwendung für die ein Authentifizierung notwening ist etwas ändern Bissher habe ich den Server das Password etc "verwalten" lassen. Ich möchte aber jetzt auf die Benutzerkonten umstellen. Das heißt mein Programm soll in den lokalen Konten prüfen ob User / Pass richtig sind und entsprechend verfahren.

Ich habe aber etwas Probs mit LogonUser. Ich bekomme dort Fehlermeldung mit den ich nicht wirklich was anfangen kann. Hier mal der Code


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
var
  ErrCode: Cardinal;
begin
  LogonUser('User''Domain''Pass', LOGON32_LOGON_INTERACTIVE, LOGON32_PROVIDER_DEFAULT, ErrCode);
  ShowMessage('ErrCode: '+IntToStr(ErrCode)+' = '+SysErrorMessage(ErrCode)+#10#13
    +'GetLastError: '+IntToStr(GetLastError)+' = '+SysErrorMessage(GetLastError));
end;

Ich komme aber immer bei "ErrCode" auf 0 und bei "GetLastError" auf 1314.

ErrCode: 0 = Der Vorgang wurde erfolgreich beendet
GetLastError: 1314 = Der Client besitzt ein erforderliches Recht nicht

Was is hier nicht richrig?!


AXMD - So 31.07.05 15:51

http://msdn.microsoft.com/library/default.asp?url=/library/en-us/secauthn/security/logonuser.asp hat folgendes geschrieben:
If the function fails, it returns zero. To get extended error information, call GetLastError.


Also alles in Ordnung ;)

AXMD


Harry M. - So 31.07.05 16:17

Ne leider nicht alles klar, weil ich mit falscher Kennung zum Selben Ergebnis komme.


AXMD - So 31.07.05 16:28

Ja eben. Ich zitiere nochmal:

http://msdn.microsoft.com/library/default.asp?url=/library/en-us/secauthn/security/logonuser.asp hat folgendes geschrieben:
If the function fails, it returns zero.

Heißt: wenn ein Fehler auftritt, ist ErrCode (deine Variable) 0; wenn kein Fehler auftritt, ist ErrCode nicht 0
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/secauthn/security/logonuser.asp hat folgendes geschrieben:
To get extended error information, call GetLastError.

Und eben, wenn ErrCode = 0, dann fragst du LastErrorCode ab, ansonsten nicht. Klar soweit?

AXMD


Harry M. - So 31.07.05 16:40

Dann komme ich ja ebenauf -> GetLastError: 1314 = Der Client besitzt ein erforderliches Recht nicht
Welches Recht besitze ích denn nicht. Ich bin als Admin an meinem Rechner angemeldet. Muss ich noch Privilegien setzten oder sowas?


AXMD - So 31.07.05 17:05

user profile iconHarry M. hat folgendes geschrieben:
Dann komme ich ja ebenauf -> GetLastError: 1314 = Der Client besitzt ein erforderliches Recht nicht
Welches Recht besitze ích denn nicht. Ich bin als Admin an meinem Rechner angemeldet. Muss ich noch Privilegien setzten oder sowas?


Dabei kann ich dir leider nicht weiterhelfen. Versuch mal, über MSDN was rauszufinden.

AXMD


Motzi - So 31.07.05 17:08

Ich zitiere aus dem SDK:
PSDK hat folgendes geschrieben:
The process calling LogonUser requires the SE_TCB_NAME privilege. If the calling process does not have this privilege, LogonUser fails and GetLastError returns ERROR_PRIVILEGE_NOT_HELD.

Und das TCB-Privilege besitzen nur Services. Es gibt aber sowieso bessere Möglichkeiten das Passwort zu überprüfen als den Benutzer einzuloggen: Suche in: Delphi-Forum, Delphi-Library SSPI


Harry M. - So 31.07.05 17:12

Ich glaube da liege ich gan nicht so falsch. Wenn ich GetLasError auswerte komme ich immer auf "ERROR_PRIVILEGE_NOT_HELD" in den MSDN steht "A required privilege is not held by the client."
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/debug/base/system_error_codes__1300-1699_.asp
Welche Privilegien müsste ich den setzten ?


Motzi - So 31.07.05 17:20

Steht doch da - du benötigst das SE_TCB_NAME Privileg. TCB steht dabei für Trusted Computing Base. Diese Privileg kann man aber nicht einfach so setzen, wie zB das Debug-Privileg (das Debug-Privileg kann eigentlich auch nicht wirklich "setzen", entweder man hat es oder man hat es nicht, es ist nur einfach standardmäßig deaktiviert. Wenn man es aber nicht hat, dann kann man es auch nicht aktivieren). Das TCB-Privilege besitzen, wie der Name bereits sagt, nur "vertrauenswürdige" Prozesse - die Services. Diese sind insofern als vertrauenswürdig einzustufen, da sie nur von einem Admin installiert werden können und man davon ausgeht, dass dieser weiß was er tut. Andere Prozesse besitzen dieses Privileg nicht (außer sie wurden von einem Service aus gestartet).

Einzige Möglichkeit LogonUser zu verwenden ist also einen Service zu programmieren. Eine andere Möglichkeit ohne Service und ohne LogonUser (und die würde ich vorziehen) bietet das "Security Support Provider Interface" (SSPI) - siehe Suchlink in meinem letzten Posting.

Gruß, Motzi


Harry M. - So 31.07.05 19:29

@Motzi: Danke. Ich habe Dein 1. Posting erst gelesen als ich meine schon abgesckickt hatte :( Und dann ach musst ich dringend weg. Ich probiere mal den Weg den Du vorgeschlagen hast. Das Programm will ich sowie so noch als Service umbauen (aus mehren Grunden). Ein Grund mehr endlich damit anzufangen :lol: