Kontakt
DSVGO
Historie | |
11.03.2002 | Korrektur der IsNT-Funktion; Hinweis auf benötigte Privilegien (von Dieter Bosli) |
13.09.2001 | Erste Version |
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...
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
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
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
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