Visual Basic - Technik, FAQ, Tricks, Beispiele

Home / System / Windows / Password

Anmelde-Kennwort prüfen

Historie
11.03.2002Korrektur der IsNT-Funktion; Hinweis auf benötigte Privilegien (von Dieter Bosli)
13.09.2001Erste Version

Einleitung

In diesem Artikel wird erklärt, wie man ein Password überprüft - entweder gegen das einfache Win9x-Login, oder gegen eine bestimmte NT-Domäne. Daher muss auch geklärt werden, welches Windows (9x oder NT/2000) vorliegt...

Beispiele

Um diese Beispiele erfolgreich ausführen zu können, muss der angemeldete Benutzer die Rechte "Als Teil des Betriebssystems handeln" und "Anheben einer Quote" besitzen (s.a. "Authentifizieren eines Benutzers in einer Domain", Microsoft Knowledge Base).

'Passwort "abc" des angemeldeten Users checken:
If CheckPassword("abc") Then ...

'Passwort von Meier gegen alle Domänen checken:
If CheckPassword("abc", "meier") Then ...

'Passwort in der lokalen Domäne checken:
If CheckPassword("abc", "meier", ".") Then ...

'Passwort in bestimmter Domäne checken:
If CheckPassword("abc", "meier", "zentral") Then ...

'Windows-Plattform checken:
If IsNT Then
  MsgBox "Ein Profi?"
Else
  MsgBox "Ein Spieler?   ;-)"
End If

Code / Quelltext

Deklarationen

Die folgenden API-Funktionen sollten im Deklarationsteil eines Moduls bekannt gemacht werden:

Private Declare Function CloseHandle Lib "kernel32" ( _
    ByVal hObject As Long) As Long
Private Declare Function GetVersion Lib "kernel32" () As Long
Private Declare Function LogonUserA Lib "Advapi32" ( _
    ByVal lpszUserName As String, ByVal lpszDomain As String, _
    ByVal lpszPassword As String, ByVal dwLogonType As Long, _
    ByVal dwLogonProvider As Long, phToken As Long _
  ) As Long
Private Declare Function WNetVerifyPasswordA Lib "mpr.dll" ( _
    ByVal lpszPassword As String, ByRef pfMatch As Long _
  ) As Long
CheckPassword

Die CheckPassword-Funktion bestimmt ggf. die Kennung des angemeldeten Benutzers (s.a. "Angemeldeter User und Computer"). Je nach Betriebssystem wird die passende API-Funktion aufgerufen:

Public Function CheckPassword( _
    ByVal Password As String, _
    Optional ByVal UserName As String, _
    Optional ByVal Domain As String _
  ) As Boolean
  
  'Deklarationen:
  Const LOGON32_PROVIDER_DEFAULT = 0&
  Const LOGON32_LOGON_NETWORK = 3&
  Dim hToken As Long
  Dim fMatch As Long
  
  If IsNT Then 'Win NT/2000:
  
    'Angemeldeter User ist Default:
    If UserName = "" Then UserName = WhoAmI

    'API aufrufen:
    CheckPassword = LogonUserA(UserName, Domain, Password, _
        LOGON32_LOGON_NETWORK, LOGON32_PROVIDER_DEFAULT, hToken)
    CloseHandle hToken
  
  Else 'Win 9x:

    'Domäne liegt in Win9x nicht vor:
    If CBool(Len(Domain)) Then Exit Function

    'Ggf. Kennung checken:
    If CBool(Len(UserName)) _
    Then If UserName <> WhoAmI Then Exit Function

    'API aufrufen:
    If WNetVerifyPasswordA(Password, fMatch) = 0 _
    Then CheckPassword = CBool(fMatch)
  
  End If
End Function
IsNT

Die folgende Hilfs-Funktion gibt True zurück, falls ein "richtiges" Betriebssystem (also Windows NT / 2000) vorliegt:

Public Function IsNT() As Boolean
  'Höchstwertigste Bit darf nicht gesetzt sein:
  IsNT = (GetVersion And &H80000000) = 0
End Function

© Jost Schwider, 13.09.2001-11.03.2002 - http://vb-tec.de/chkpwd.htm