Gustav Brock
gustav at cactus.dk
Wed Jun 23 04:10:26 CDT 2004
Hi Gonzalez
> Gustav, I cant seem to find that Archive
OK, here goes - but remember, this is not for Access security (mdw
files) only simple database protection of Access 97 files.
>From A2000 (Jet 4.0) it is not that easy to handle.
(The old list mentioned is the one hosted by MT Group).
---
Recently we had to deal with some password protected Access 97 files and
found a message on this from the old list.
I've brushed it up slightly much because it contained a bug and because I
found out that a file password can be 20 characters long when set from code
but only 14 when set manually!
Anyway, here's the simple code to read the password from an Access 97 file -
also to warn you not to rely too much on this kind of protection (beware of
line breaks):
Public Sub smsAcc97PwdRead(ByVal vstrMdbPath As String)
' Purpose: Read MS Access 97 database level password
' Written by: Shamil Salakhetdinov
' e-mail: shamil at marta.darts.spb.ru
'
' Parameters:
' vstrMdbPath - full path for MS Access 97 database
'
'
' Credits:
' www.rootshell.com/archive-j457nxiqi3gq59dv/199902/all-access.c.html
'
' Modified: 2001-06-20. Cactus Data ApS.
' Reason: Password length was limited to 13 characters
' Now reads a password with the maximum length of 20 characters.
'
' String manipulation simplified.
' Rudimentary check of file type as Jet file added.
On Error GoTo smsAccPwdRead_Err
Const cintAcc97JetOffset As Integer = &H5
Const cintAcc97PwdOffset As Integer = &H43
Const cintAcc97PwdLength As Integer = 20
' Only up to cintAcc97PwdLenMan characters
' can be entered manually when changing password.
Const cintAcc97PwdLenMan As Integer = 14
Const cstrJetFileTypeID As String * 15 = "Standard Jet DB"
Dim strJetBuf As String * 15
Dim strPwdClear As String
Dim strPwdBuf As String * cintAcc97PwdLength
Dim strPwd As String
Dim strMsgTxt As String
Dim strMsgTit As String
Dim intMsgMod As Integer
Dim bytChr As Byte
Dim intLen As Integer
Dim intFn As Integer
Dim intI As Integer
strPwdClear = Chr(&H86) & Chr(&HFB) & Chr(&HEC) & Chr(&H37) & _
Chr(&H5D) & Chr(&H44) & Chr(&H9C) & Chr(&HFA) & _
Chr(&HC6) & Chr(&H5E) & Chr(&H28) & Chr(&HE6) & _
Chr(&H13) & Chr(&HB6) & Chr(&H8A) & Chr(&H60) & _
Chr(&H54) & Chr(&H94) & Chr(&H7B) & Chr(&H36)
strMsgTit = "Access 97 Jet File Password detection"
strMsgTxt = "File '" & vstrMdbPath & "'" & vbCrLf
intFn = FreeFile
Open vstrMdbPath For Binary Access Read As #intFn
Get #intFn, cintAcc97JetOffset, strJetBuf
Get #intFn, cintAcc97PwdOffset, strPwdBuf
Close intFn
If Not StrComp(cstrJetFileTypeID, strJetBuf, vbBinaryCompare) = 0 Then
' Not a Jet file.
strMsgTxt = strMsgTxt & "can not be identified as a Jet file."
intMsgMod = vbExclamation + vbOKOnly
Else
For intI = 1 To cintAcc97PwdLength
bytChr = Asc(Mid(strPwdBuf, intI, 1)) Xor Asc(Mid(strPwdClear,
intI, 1))
Mid(strPwdBuf, intI, 1) = Chr(bytChr)
If bytChr = 0 Then
strPwd = Left(strPwdBuf, intI - 1)
' Stop loop.
intI = cintAcc97PwdLength
ElseIf intI = cintAcc97PwdLength Then
strPwd = strPwdBuf
End If
Debug.Print Asc(strPwdBuf), strPwdBuf
Next intI
intLen = Len(strPwd)
If intLen = 0 Then
' Password is empty.
strMsgTxt = strMsgTxt & "is not password protected."
Else
strMsgTxt = strMsgTxt & "is protected by password:" & vbCrLf & _
"'" & strPwd & "'." & vbCrLf & vbCrLf & _
"Length of password is " & intLen & " character" &
Left("s", Abs(intLen > 1)) & "."
If intLen > cintAcc97PwdLenMan Then
strMsgTxt = strMsgTxt & vbCrLf & "This password can not be altered
manually!"
End If
End If
intMsgMod = vbInformation + vbOKOnly
End If
MsgBox strMsgTxt, intMsgMod, strMsgTit
smsAccPwdRead_Exit:
Exit Sub
smsAccPwdRead_Err:
MsgBox "smsAccPwdRead: Err = " & Err & " - " & Err.Description
Resume smsAccPwdRead_Exit
End Sub
---
Beware of line breaks.
/gustav