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 SSPLogonUser und Umlaute (https://www.delphipraxis.net/107598-ssplogonuser-und-umlaute.html)

gargano 30. Jan 2008 14:31


SSPLogonUser und Umlaute
 
Hallo Leute,
ich verwende die Funktion SSPLogonUser in der Unit SSPIValidatePassword.

Nun habe ich ein Problem mit Umlauten, falls Umlaute im Usernamen sind
gibt SSPLogonUser false zurück, ohne Umlaute funktioniert das ganze.

Was kann ich da tun ?

Viele Grüße
Gargano

generic 30. Jan 2008 15:39

Re: SSPLogonUser und Umlaute
 
unicode, widestrings zu verwenden hast du sicherlich schon probiert?

bzw. die "W" varianten von den Api-Funktionen zu verwenden?

gargano 30. Jan 2008 17:13

Re: SSPLogonUser und Umlaute
 
Hallo generic,

danke für den Tip, ich habe die Funktion so genommen wie sie war: d.h. mit normalen PChar
Umstellen auf PWideChar und zusätzlich AuthIdentity.Flags := SEC_WINNT_AUTH_IDENTITY_UNICODE
setzen hat geholfen. Jedenfalls auf der lokalen Maschine, im Netz muß ich noch probieren.

Gruß
gargano

gargano 30. Jan 2008 20:06

Re: SSPLogonUser und Umlaute
 
Ok, ich habe es jetzt auch mit der Domäne probiert und es geht. Für alle die Schröder, Krüger oder Gräber heißen hier der Code (teilweise aus SSPIInvalidatePassword) :
Die Änderungen sind mit // Widechar gekennzeichnet.

Gruß
gargano
Delphi-Quellcode:
(*----------------------------------------------------------------------*
 | SSPLogonUser                                                        |
 |                                                                      |
 | Validate password for user/domain. Returns true if the password is |
 | valid.                                                              |
 *----------------------------------------------------------------------*)

function SSPLogonUser(const DomainName, UserName, Password: string): boolean;
var
  done                  : boolean;
  cbOut, cbIn           : DWORD;
  AuthIdentity          : TSecWINNTAuthIdentity;
  session0OK, session1OK : boolean;
  packageHandle         : THandle;
  pClientBuf            : PByte;
  pServerBuf            : PByte;
  cbMaxMessage          : DWORD;
  funcs                 : PSecurityFunctionTable;
// Widechar
  TheDomain             : Array[0..255] Of WideChar;
  TheUser               : Array[0..255] Of WideChar;
  ThePassWD             : Array[0..255] Of WideChar;
begin
  result := False;
  try
    done := False;
    session1OK := False;
    packageHandle := 0;
    pClientBuf := nil;
    pServerBuf := nil;
    cbMaxMessage := 0;
    session0OK := InitSession(0);
    try
      session1OK := InitSession(1);
      packageHandle := InitPackage(cbMaxMessage, funcs);
      if session0OK and session1OK and (packageHandle <> 0) then
      begin
        GetMem(pClientBuf, cbMaxMessage);
        GetMem(pServerBuf, cbMaxMessage);
        FillChar(AuthIdentity, sizeof(AuthIdentity), 0);
        if DomainName <> '' then
        begin
// Widechar
          StringToWideChar(DomainName,@TheDomain,255);
          AuthIdentity.Domain :=@TheDomain;
          AuthIdentity.DomainLength := Length(DomainName)
        end;
        if UserName <> '' then
        begin
// Widechar
          StringToWideChar(UserName,@TheUser,255);
          AuthIdentity.User := @TheUser ;
          AuthIdentity.UserLength := Length(UserName);
        end;
        if Password <> '' then
        begin
// Widechar
          StringToWideChar(Password,@ThePassWD,255);
          AuthIdentity.Password := @ThePassWD;
          AuthIdentity.PasswordLength := Length(Password)
        end;
// Widechar
        AuthIdentity.Flags := SEC_WINNT_AUTH_IDENTITY_UNICODE;
        //
        // Prepare client message (negotiate).
        //
        cbOut := cbMaxMessage;
        if not GenClientContext(funcs,
          0,
          @AuthIdentity,
          pServerBuf,
          0,
          pClientBuf,
          cbOut,
          done) then
          //raise Exception.Create('GenClientContext Failed');
          exit;
        cbIn := cbOut;
        cbOut := cbMaxMessage;
        if not GenServerContext(funcs,
          1,
          pClientBuf,
          cbIn,
          pServerBuf,
          cbOut,
          done) then
          //raise Exception.Create('GenServerContext Failed');
          exit;
        cbIn := cbOut;
        //
        // Prepare client message (authenticate).
        //
        cbOut := cbMaxMessage;
        if not GenClientContext(funcs,
          0,
          @AuthIdentity,
          pServerBuf,
          cbIn,
          pClientBuf,
          cbOut,
          done) then
          //raise Exception.Create('GenClientContext failed');
          exit;
        cbIn := cbOut;
        //
        // Prepare server message (authentication).
        //
        cbOut := cbMaxMessage;
        if not GenServerContext(funcs,
          1,
          pClientBuf,
          cbIn,
          pServerBuf,
          cbOut,
          done) then
          //raise Exception.Create('GenServerContext failed');
          exit;
        result := True
      end
    finally
      if Session0OK then
        TermSession(funcs, 0);
      if Session1OK then
        TermSession(funcs, 1);
      if packageHandle <> 0 then
        FreeLibrary(PackageHandle);
      ReallocMem(pClientBuf, 0);
      ReallocMem(pServerBuf, 0);
    end
  except
  end
end;

Remko 30. Jan 2008 20:34

Re: SSPLogonUser und Umlaute
 
I remembered there were issues with sspi and guest account. I searched and found this kb

This is what you need to consider:
On a Windows XP computer that is a member of a workgroup: • If ForceGuest is enabled (set to 1), SSPI will always try to log on using the Guest account.
• If the Guest account is enabled, an SSPI logon will succeed as Guest for any user credentials.
• If the Guest account is disabled, an SSPI logon will fail even for valid credentials.
• If ForceGuest is disabled (set to 0), SSPI will log on as the specified user.

Additionally, if the Guest account is enabled, SSPI logon may succeed as Guest for user credentials that are not valid. The C sample code in this article demonstrates how you can check the access token of the established security context. The IsGuest helper function in the sample code shows how you can verify that the logon occurred as the specified user or as Guest.

Dezipaitor 30. Jan 2008 23:09

Re: SSPLogonUser und Umlaute
 
@gargano kannst du oder ein Moderator bitte Code-Tags verwenden?

THX

Piro 7. Jan 2012 21:54

AW: SSPLogonUser und Umlaute
 
Schönen guten Abend,

auf der Suche nach dem Verifizieren von Benutzerdaten habe, ich den hier aufgeführten Code gefunden, der für mich in Frage kommt.

UNICODE müsste es sein. Da ich mit der Variante ANSI ab und zu Probleme habe mit Passwörtern bei uns im Unternehmen.

Leider klappt der Code nicht so wirklich beim mir.

Folgende Dinge bräuchte ich noch:
Delphi-Quellcode:
SEC_WINNT_AUTH_IDENTITY_ANSI   = $01;
SEC_WINNT_AUTH_IDENTITY_UNICODE = ??;
Die Konvertierung gibt immer nur einen Buchstaben zurück.
Delphi-Quellcode:
TheDomain : Array[0..255] Of WideChar;
TheUser : Array[0..255] Of WideChar;
ThePassWD : Array[0..255] Of WideChar;
...
StringToWideChar(UserName,@TheUser,255);
AuthIdentity.User := @TheUser ; // z.B.: UserName = 'Sven' dann ist @TheUser leider nur 'S', warum nur?
Danke im Voraus.
Sven

daywalker9 7. Jan 2012 22:02

AW: SSPLogonUser und Umlaute
 
Was macht den StringToWideChar genau?

Piro 8. Jan 2012 12:37

AW: SSPLogonUser und Umlaute
 
Verstehe deine Frage nicht ganz.

Das ist eine interne Funktion. Laut anderen Beispielen, die genauso arbeiten soll es funktionieren. Aber keine Ahnung warum bei mir nicht bzw. warum ich nur einen Buchstaben zurück bekomme.

Es muss ja irgendwie funktionieren, denn der Quellcode wurde ja als erfolgreiche Lösung gepostet.

Dezipaitor 8. Jan 2012 16:46

AW: SSPLogonUser und Umlaute
 
die Struktur der Variable AuthIdentity enthält nur PChar (PAnsiChar) und daher ist nur ein Zeichen drin, weil das zweite Zeichen in Unicode eine #0 ist.


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