Tipp 0488 Passwort-Abfrage
Autor/Einsender:
Datum:
  Angie
15.03.2006
Entwicklungsumgebung:   Excel 2000
Es gibt manchmal Situationen, in denen man bestimmte Aktionen in einem Programm für den "Otto-Normalverbraucher" einschränken möchte, diese also für bestimmte Anwender nur über eine Passwort-Eingabe zugänglich sein sollen.
An dieser Stelle möchte ich darauf hinweisen, dass sowohl VBA-Projekte also auch Office-Dateien, die Passwort-geschützt sind, sehr leicht zu "knacken" sind. Programme dafür sind massig im Inet zu finden, keine Programmierung oder Datei ist also sicher vor "Angreifern". In diesem speziellen Beispiel wird der Einfachheithalber einer Variablen das Passwort zugewiesen. Öffnet man die im Download enthaltene Arbeitsmappe in Notepad, erscheint das Passwort gut lesbar im entsprechenden Codebereich. Das heißt also, das Passwort sollte aus einer nicht so leicht ersichtlichen Quelle stammen, ggf. sogar verschlüsselt werden.
Code im Codebereich der UserForm
In diesem Beispiel werden für das Zuweisen des Titels, der Meldung und des Passworts und für die Rückgabe, ob der User den Dialog abgebrochen hat oder nicht, anstelle von Public-Variablen Property-Prozeduren verwendet. Weitere Infos dazu können unter Schreiben einer Property-Prozedur in der VB(A)-Hilfe nachgelesen werden.
Das vom Anwender eingegebene Passwort wird bei Klick auf den OK-Button mit dem übergebenen Passwort verglichen. Stimmt die Eingabe nicht überein, wird eine entsprechende MsgBox angezeigt und der Inhalt des Eingabefelds gelöscht, damit der Anwender einen erneuten Eingabeversuch machen kann. Die UserForm bleibt so lange sichtbar, bis der Anwender entweder das richtige Passwort eingibt oder aber den Dialog abbricht.
Damit ggf. geänderte Eigenschaften von Steuerelementen nachvollzogen werden können, werden diese soweit möglich zur Laufzeit gesetzt, hier im UserForm_Initialize-Ereignis.
 
Option Explicit

Private m_blnInit    As Boolean
Private m_strPW      As String
Private m_blnCancel  As Boolean

Public Property Let gInit(ByVal blnNewValue As Boolean)
  m_blnInit = blnNewValue
End Property

Public Property Let gTitle(ByVal strNewValue As String)
  If Len(strNewValue) <> 0 Then
    Me.Caption = strNewValue
  Else
    Me.Caption = Application.Name
  End If
End Property

Public Property Let gPrompt(ByVal strNewValue As String)
  Me.lblPrompt.Caption = strNewValue
End Property

Public Property Let gPassword(ByVal strNewValue As String)
  m_strPW = strNewValue
End Property

Public Property Get gCancel() As Boolean
  gCancel = m_blnCancel
End Property

Private Sub UserForm_Initialize()
  With Me
    .cmdCancel.Cancel = True
    .cmdOK.Default = True
    .txtInput.PasswordChar = "*"
  End With
End Sub

Private Sub UserForm_Activate()
  If Not m_blnInit Then Unload Me
End Sub

Private Sub cmdOK_Click()
  If Me.txtInput.Text = m_strPW Then
    m_blnCancel = False
    Me.Hide
  Else
    MsgBox "Ungültiges Passwort!", vbExclamation, Me.Caption
    With Me.txtInput
      .Text = ""
      .SetFocus
    End With
  End If
End Sub

Private Sub cmdCancel_Click()
  m_blnCancel = True
  Me.Hide
End Sub

Private Sub UserForm_QueryClose(Cancel As Integer, _
      CloseMode As Integer)
  If CloseMode = vbFormControlMenu Then
    Cancel = True
    cmdCancel_Click
  End If
End Sub
 
Code im Codebereich eines Moduls
In der folgenden Funktion, in der der Aufruf der UserForm "gekapselt" ist, wird der Dialog angezeigt und die Rückgabe ausgewertet. Als Argumente werden Titel der UserForm, Meldung und das Passwort übergeben. Die Funktion gibt True zurück, wenn das richtige Passwort eingegeben wird, False, wenn der Anwender den Dialog abbricht.
 
Option Explicit

Public Function GetPassword(ByVal strPrompt As String, _
            ByVal strPassword As String, _
            Optional strTitle As String) As Boolean

  Dim frmPWInput  As FrmPassword

  Set frmPWInput = New FrmPassword
  With frmPWInput
    .gInit = True
    .gTitle = strTitle
    .gPrompt = strPrompt
    .gPassword = strPassword

    .Show
    DoEvents

    GetPassword = (Not .gCancel)
  End With

  Unload frmPWInput
  Set frmPWInput = Nothing
End Function
 
Beispiel-Aufruf
Die obige Funktion GetPassword() kann an beliebigen Stellen im VBA-Projekt mit verschiedenen Titeln, Meldungen und Passwörtern aufgerufen werden, ähnlich der in VB/VBA-integrierten InputBox-Funktion.
 
Public Sub Demo_GetPassword()
  Const cMsgTitle As String = "VB-fun-Demo - Passwortabfrage"

  Dim strPW     As String
  Dim blnRetVal As Boolean

  strPW = "Passwort"
  blnRetVal = GetPassword("Bitte Passwort eingeben:", strPW)
  If blnRetVal = True Then
    MsgBox "Juhuuuu, die Passwort-Eingabe war richtig!", _
           vbInformation, cMsgTitle
  End If
End Sub
 
Weitere Links zum Thema
InputBox im eigenen Design
InputBox-Rückgaben auswerten
UserForm-Objekt/benutzerdefinierte Dialoge
Hinweis
Die im Download befindlichen *.frm- und *.bas-Dateien können in den unten angegebenen Anwendungen im VB-Editor importiert werden.

Windows-Version
95
98
ME
NT
2000
XP
Vista
Win 7
Anwendung/VBA-Version
Access 97
Access 2000
Access XP
Access 2003
Access 2007
Access 2010
Excel 97
Excel 2000
Excel XP
Excel 2003
Excel 2007
Excel 2010
Word 97
Word 2000
Word XP
Word 2003
Word 2007
Word 2010
PPT 97
PPT 2000
PPT XP
PPT 2003
PPT 2007
PPT 2010
Outlook 97
Outlook 2000
Outlook XP
Outlook 2003
Outlook 2007
Outlook 2010


Download  (26,6 kB) Downloads bisher: [ 1788 ]

Vorheriger Tipp Zum Seitenanfang Nächster Tipp

Startseite | Projekte | Tutorials | API-Referenz | VB-/VBA-Tipps | Komponenten | Bücherecke | VB/VBA-Forum | VB.Net-Forum | DirectX-Forum | Foren-Archiv | DirectX | VB.Net-Tipps | Chat | Spielplatz | Links | Suchen | Stichwortverzeichnis | Feedback | Impressum

Seite empfehlen Bug-Report
Letzte Aktualisierung: Mittwoch, 31. August 2011