VB-Tec.de Visual Basic - Technik, FAQ, Tricks, BeispieleHome / Allgemein / Sicherheit / Pers.ausw. Personalausweis auf Gültigkeit prüfen |
| Eigene Umfragen? Voting-Tool von Jost Schwider! |
Weitere Hinweise können Sie dem Personalausweis- und Passgesetz entnehmen.
Mit der unten gezeigten Funktion PersonalausweisOK kann die auf einem deutschen Personalausweis notierte Nummer auf innere Korrektheit geprüft werden. Natürlich ist es damit nicht möglich zu prüfen, ob der Ausweis wirklich existiert...
Optional können das Geburtsdatum, das Ablaufdatum und/oder die Behördenkennzahl angegeben werden, so dass diese auf Konsistenz geprüft werden. Dies ist möglich, weil die Personalausweis-Nummer (im Prinzip) gerade aus den genannten Komponenten besteht (zuzüglich Prüfziffern). Hier der schematische Aufbau:
1220000016D<<4509303<0110052<<<<<<7
Legende:
Behördenkennziffer, fortlaufende Nummer, Ddeutsch, Geburtsdatum, Ablaufdatum, die Prüfziffern
Die Prüfziffern werden berechnet, indem die erste Ziffer mit 7, die zweite mit 3, die dritte mit 1, die vierte wieder mit 7 usw. multipliziert und dann summiert wird, wobei nur die Einerstelle relevant ist.
Nummer = "1220000016D<<4509303<0110052<<<<<<7" If PersonalausweisOK(Nummer) Then MsgBox "Alles klar" Else MsgBox "Schäm dich!" End If
Der Code geht Schritt für Schritt die zu überprüfenden Bereiche durch: Nachdem vorab die grundlegenen Prüfungen bestanden worden sind und alle nicht-numerischen Inhalte ausgefiltert worden sind, werden die o.g. einzelnen Blöcke sowohl auf Konsistenz (z.B. stimmt das Datum überein?) als auch auf die jeweilige Block-Prüfziffer gecheckt. Zum Abschluß wird noch die Prüfziffer der gesamten Nummer überprüft.
Public Function PersonalausweisOK( _
ByVal Nummer As String, _
Optional ByVal Geburtsdatum As Date = -1, _
Optional ByVal Ablaufdatum As Date = -1, _
Optional ByVal Behördenkennzahl As Long = -1 _
) As Boolean
'Deklarationen:
Dim i As Long
Dim Char As String
Dim NummerPos As Long
'0. Vorab-Checks:
If Len(Nummer) < 25 _
Then Exit Function 'Nummer zu kurz
If Mid$(Nummer, 11, 1) <> "D" _
Then Exit Function 'kein deutscher Personalausweis
'1. Nummer normieren/extrahieren:
For i = 1 To Len(Nummer)
Char = Mid$(Nummer, i, 1)
Select Case Char
Case "<", " ", "D"
'überspringen
Case "0" To "9"
'Nummer merken:
NummerPos = NummerPos + 1
If NummerPos > 25 Then Exit Function
Mid$(Nummer, NummerPos, 1) = Char
Case Else
'ungültiges Zeichen:
Exit Function
End Select
Next i
'2. Behördenkennzahl/Seriennummer prüfen:
If Behördenkennzahl <> -1 _
Then If Left$(Nummer, 4) <> Format$(Behördenkennzahl, "0000") _
Then Exit Function
If Prüffziffer(Left$(Nummer, 9)) <> Mid$(Nummer, 10, 1) _
Then Exit Function
'3. Geburtsdatum prüfen:
If Geburtsdatum <> -1 _
Then If Mid$(Nummer, 11, 6) <> Format$(Geburtsdatum, "yymmdd") _
Then Exit Function
If Prüffziffer(Mid$(Nummer, 11, 6)) <> Mid$(Nummer, 17, 1) _
Then Exit Function
'4. Ablaufdatum prüfen:
If Ablaufdatum <> -1 _
Then If Mid$(Nummer, 18, 6) <> Format$(Ablaufdatum, "yymmdd") _
Then Exit Function
If Prüffziffer(Mid$(Nummer, 18, 6)) <> Mid$(Nummer, 24, 1) _
Then Exit Function
'5. Abschlußprüfung:
If Prüffziffer(Left$(Nummer, 24)) = Right$(Nummer, 1) _
Then PersonalausweisOK = True
End Function
Oben wurde ja bereits erklärt, wie die Prüfziffern gebildet werden. Der folgende Code setzt genau dies um, allerdings wurde der Algorithmus deutlich optimiert (die Multiplikationen werden nur einmal zum Schluß gemacht):
Public Function Prüffziffer(ByRef Ziffernfolge As String) As String
Dim i As Long
Dim n7 As Long
Dim n3 As Long
Dim n1 As Long
'Quersumme' bilden:
For i = 1 To Len(Ziffernfolge) Step 3
n7 = n7 + Val(Mid$(Ziffernfolge, i, 1))
n3 = n3 + Val(Mid$(Ziffernfolge, i + 1, 1))
n1 = n1 + Val(Mid$(Ziffernfolge, i + 2, 1))
Next i
'Nur Einerstelle beachten:
Prüffziffer = CStr((n7 * 7 + n3 * 3 + n1) Mod 10)
End Function
© Jost Schwider, 27.09.2001-21.03.2002 - http://vb-tec.de/persausw.htm