Connectionstring к mdb , если в пароле непечатаемые символы...

Clarion, Clarion 7

Модератор: Дед Пахом

Правила форума
При написании вопроса или обсуждении проблемы, не забывайте указывать версию Clarion который Вы используете.
А так же пользуйтесь спец. тегами при вставке исходников!!!
Аватара пользователя
Alex
Старожил
Сообщения: 210
Зарегистрирован: 29 Август 2005, 14:54
Откуда: Белоруссия

Connectionstring к mdb , если в пароле непечатаемые символы...

Сообщение Alex »

Прошу помощи.
Есть несколько Access овских mdb файлов. Все с паролями на открытие. К части из них успешно доступаюсь через ODBC :
DriverName=clip(FIGOPEN)& 'Microsoft Access Driver (*.mdb)' &clip(FigClose)
ConnectionString0 ='Driver='& clip(DriverName) & |
';Dbq=' &CLIP(GPAR:DataPATH) & '\data.mdb;Uid=Admin;Pwd=OS08MX32AT6N1;'
Однако есть файлы,у которых в пароль входят непечатаемые символы и двухбайтовые символы:
22
†ÿ Ł£Δąś‡ę

Никак не могу подключиться к таким файлам.
Кроме того, есть текст программы на VB (?), которая точно убирает такой пароль.

Код: Выделить всё

Module Module1

    Public Function SetDatabasePassword(DBPath As String, _
        oldPassword As String, newPassword As String) As Boolean

        SetDatabasePassword = False
        If Dir(DBPath) = "" Then
            Console.WriteLine("Не нахожу " + DBPath)
            Exit Function
        End If

        Dim db As DAO.Database
        Dim dbe As DAO.DBEngine

        On Error Resume Next
        dbe = New DAO.DBEngine
        Console.WriteLine("Открываю " + DBPath)
        db = dbe.OpenDatabase(DBPath, True, False, "MS Access;PWD=" + oldPassword)
        If Err.Number <> 0 Then
            Console.WriteLine("Не смог открыть, неверный пароль?")
            Exit Function
        End If
        If newPassword = "" Then
            Console.WriteLine("Открыл, снимаю пароль...")
        Else
            Console.WriteLine("Открыл, меняю пароль...")
        End If
        db.NewPassword(oldPassword, newPassword)
        If Err.Number = 0 Then
            If newPassword = "" Then
                Console.WriteLine("Снял пароль.")
            Else
                Console.WriteLine("Сменил пароль.")
            End If
        Else
            Console.WriteLine("Не смог установить новый пароль - скорее всего парольная защита снята.")
        End If
        SetDatabasePassword = Err.Number = 0
        db.Close()

    End Function

    Sub Main(ByVal sArgs() As String)
        Dim sr As IO.StreamReader
        sr = New IO.StreamReader("10.mem", Text.Encoding.UTF8)
        Dim f, p, fp, np As String
        p = sr.ReadToEnd
        fp = "" + Chr(13) + Chr(21) + "22 " + Chr(11) + Chr(12) + Chr(13) + Chr(14) + p + Chr(13) + ""
        If sArgs.Length > 0 Then
            f = sArgs(0)
        Else
            f = "db1.mdb"
        End If
        If sArgs.Length > 1 Then
            np = sArgs(1)
        Else
            np = ""
        End If
        If sArgs.Length > 2 Then fp = sArgs(2)
        SetDatabasePassword(f, fp, np)
    End Sub

End Module
P.S. Значение переменной p читается из файла 10.mem
и это 21 байт : †ÿ Ł£Δąś‡ę
Переменная fp получает значение пароля

А мои попытки безуспешны

Код: Выделить всё

   DOSFILE_OUT{Prop:Name}='10.mem'  !   драйвер DOS , одно поле String(2048)
   Open(DOSFILE_OUT,40h)
   Get(DOSFILE_OUT,1)
   SubPass_IN=OUT:RecString
    close(DOSFILE_OUT)                                      
 
    SubPass_OUT  = ThisStringTheory1.Utf8ToAnsi(SubPass_IN, SubPass_OUT_LEN)  ! ф-ция из CAPESOFT
    
   FullPass= Chr(13) & Chr(21) & '22 ' & Chr(11) & Chr(12) & Chr(13) & Chr(14) &   | 
    clip(SubPass_OUT)  & Chr(13) 
 
   ConnectionString4NEW ='Driver='& clip(DriverName) & ';Dbq=' &CLIP(GPAR:DataPATH) & '\data4.mdb;Uid=admin;Pwd='|
   & clip(FullPass) & ';' 
Попытка открыть файл заканчивается сообщением "Ошибочный пароль"
Ал
✯ Ветеран ✯
Сообщения: 1014
Зарегистрирован: 08 Июль 2005, 6:48
Откуда: Россия
Поблагодарили: 1 раз

Connectionstring к mdb , если в пароле непечатаемые символы...

Сообщение Ал »

не нервничать и еще раз просмотреть по шагам - скорее всего где-то в итоге преобразований портит байт или пару... и получаете "отлуп"
kreator
✯ Ветеран ✯
Сообщения: 5031
Зарегистрирован: 28 Май 2009, 15:54
Откуда: Москва
Благодарил (а): 7 раз
Поблагодарили: 23 раза

Connectionstring к mdb , если в пароле непечатаемые символы...

Сообщение kreator »

А в самих настройках ODBC такой пароль не прокатывает?
We are hard at work… for you. :)
Аватара пользователя
Alex
Старожил
Сообщения: 210
Зарегистрирован: 29 Август 2005, 14:54
Откуда: Белоруссия

Connectionstring к mdb , если в пароле непечатаемые символы...

Сообщение Alex »

его же нельзя ввести с клавиатуры
kreator
✯ Ветеран ✯
Сообщения: 5031
Зарегистрирован: 28 Май 2009, 15:54
Откуда: Москва
Благодарил (а): 7 раз
Поблагодарили: 23 раза

Connectionstring к mdb , если в пароле непечатаемые символы...

Сообщение kreator »

В файле 10.mem предположительно лежит строка в формате Unicode. Смущает, что 21 байт. По идее должно быть чётное число. И потом, если тупо скопировать строку в клипбоард и вставить в поле пароль ODBC настройки? Винда ведь понимает Unicode.
We are hard at work… for you. :)
Аватара пользователя
Alex
Старожил
Сообщения: 210
Зарегистрирован: 29 Август 2005, 14:54
Откуда: Белоруссия

Connectionstring к mdb , если в пароле непечатаемые символы...

Сообщение Alex »

Там есть символы перевода строки и табуляции ..... как в поле то вставлять, а 21 символ..хм. может там трехбайтовый символ имеется
Ал
✯ Ветеран ✯
Сообщения: 1014
Зарегистрирован: 08 Июль 2005, 6:48
Откуда: Россия
Поблагодарили: 1 раз

Connectionstring к mdb , если в пароле непечатаемые символы...

Сообщение Ал »

попробую ещё раз, - если кодировка содержимого в файле отличается, то в итоговой строке пароля могут быть "битые символы"...
unicode - utf8 - ... cp1251?
Yufil
Ветеран движения
Сообщения: 1277
Зарегистрирован: 16 Май 2006, 14:34
Контактная информация:

Connectionstring к mdb , если в пароле непечатаемые символы...

Сообщение Yufil »

Кодировка Utf-8 использует разное количество байтов на разные символы, от 1 до 5.
Можно считать файл с паролем как бинарный, тогда в строке будет правильный юникод.
В моём классе CSTR примерно так

S Cstr
....
S.LoadFromFile('10.mem')
Drivername = S.S

Проблема в другом - поймёт ли ODBC-адаптер, что ему передали UTF-8 или Unicode строку, а не ASCII?
Аватара пользователя
Alex
Старожил
Сообщения: 210
Зарегистрирован: 29 Август 2005, 14:54
Откуда: Белоруссия

Connectionstring к mdb , если в пароле непечатаемые символы...

Сообщение Alex »

Обращаю Ваше внимание, что вот этот код на VB

Код: Выделить всё

    Sub Main(ByVal sArgs() As String)
        Dim sr As IO.StreamReader
        sr = New IO.StreamReader("10.mem", Text.Encoding.UTF8)
        Dim f, p, fp, np As String
        p = sr.ReadToEnd
        fp = "" + Chr(13) + Chr(21) + "22 " + Chr(11) + Chr(12) + Chr(13) + Chr(14) + p + Chr(13) + ""
        If sArgs.Length > 0 Then
            f = sArgs(0)
        Else
            f = "db1.mdb"
        End If
        If sArgs.Length > 1 Then
            np = sArgs(1)
        Else
            np = ""
        End If
        If sArgs.Length > 2 Then fp = sArgs(2)
        SetDatabasePassword(f, fp, np)
    End Sub
формирует верный пароль для открытия файла . Но через
db = dbe.OpenDatabase(DBPath, True, False, "MS Access;PWD=" + oldPassword),
где oldPassword формируется вышеуказанной процедурой. Поскольку в этом тексте на VB я увидел в качестве чтения 10.mem вот такое : sr = New IO.StreamReader("10.mem", Text.Encoding.UTF8), то решил использовать для этого действия функцию из Капесофт StringTheory : SubPass_OUT = ThisStringTheory1.Utf8ToAnsi(SubPass_IN, SubPass_OUT_LEN), возвращающую *SubPass_OUT и присваивающую *SubPass_OUT_LEN.
Ув. Ал : полагаю, что не unicode - utf8 - ... cp1251. А UTF8-ANSI? Или я чего то не понял.
Ув. Yufil: "Проблема в другом - поймёт ли ODBC-адаптер, что ему передали UTF-8 или Unicode строку, а не ASCII?" - таки да. может тут и есть мина. Тогда задача через ODBC нерешаема.
Почитал теорию запароливания Access 2000. Про заголовок mdb файла , где хранится пароль преобразованный по XOR по маске. Т.к. есть и запароленный ф-л и открытый- сравнил заголовки с пресловутого 67 го байта длиной 40 байт. Максим длина пароля=20 знаков, но т.к. могут быть использованы двухбайтовые символы, то отводится 40 байт. Все видно . Так вот, если пароль обычные ASCII символы, то байты пароля в заголовке типа : D 0 15 0 32 0 итд. Т.е . старший байт двухбайтового символа = 0. Но в строке подключения мы же не делаем chr(Dh) & chr(0) &chr(15h)& chr(0) & chr(32h)& chr(0). Делаем chr(Dh) & chr(15h) & chr(32h)
Тогда, если в заголовке mdb ф-ла будут байты hex : 20 20 41 1 , то ведь неправильно делать в строке подключения chr(20h) & chr(20h) &chr(41h) & chr(1h).
В общем , что я только не пробовал в строке connectionstring....
P.S. В тексте на VB из ф-ла 10.mem читается только часть пароля.
fp = "" + Chr(13) + Chr(21) + "22 " + Chr(11) + Chr(12) + Chr(13) + Chr(14) + p + Chr(13) + ""
где p - это прочитано из ф-ла. fp объявлена как string
Shur
Ветеран
Сообщения: 384
Зарегистрирован: 02 Июль 2011, 18:49

Connectionstring к mdb , если в пароле непечатаемые символы...

Сообщение Shur »

Может проблема глобальнее, чем кажется? Вот на сайте https://www.connectionstrings.com/access/ пишут:
Some reports of problems with password longer than 14 characters. Also that some characters might cause trouble. If you are having problems, try change password to a short one with normal characters.

Note! Reports say that a database encrypted using Access 2010 - 2013 default encryption scheme does not work with this connection string. In Access; try options and choose 2007 encryption method instead. That should make it work. We do not know of any other solution. Please get in touch if other solutions is available!
Т.е. при попытке открытия файла через connection string встречается проблема с длиной пароля, с отдельными символами и с методом шифрования. И вразумительного решения это не имеет.
Последний раз редактировалось Shur 07 Май 2016, 23:47, всего редактировалось 1 раз.
Аватара пользователя
Дед Пахом
Старичок
Сообщения: 3143
Зарегистрирован: 07 Июль 2005, 16:51
Откуда: Москва, Россия
Благодарил (а): 11 раз
Поблагодарили: 32 раза
Контактная информация:

Connectionstring к mdb , если в пароле непечатаемые символы...

Сообщение Дед Пахом »

Судя по коду, это VB.NET. Можно сделать dll и вызывать из Clarion.
С уважением, ДП
Yufil
Ветеран движения
Сообщения: 1277
Зарегистрирован: 16 Май 2006, 14:34
Контактная информация:

Connectionstring к mdb , если в пароле непечатаемые символы...

Сообщение Yufil »

Значит, пароль в VB передаётся в стандартном 2-байтовом Unicode (UTF-16), а не UTF-8, каждый символ занимает ровно 2 байта.
Тогда надо строку конвертить не в ANSI, а именно в двухбайтовый код.

Вызов будет примерно таким
! Декларации
Module('Windows API')
MultiByteToWideChar(Unsigned Codepage,Ulong dwFlags,ULong LpMultuByteStr, |
Long cbMultiByte, ULong LpWideCharStr,Long cchWideChar),RAW,Ulong,PASCAL
WideCharToMultiByte(Unsigned Codepage,Ulong dwFlags,ULong LpWideCharStr,Long cchWideChar, |
ULong lpMultuByteStr, Long cbMultiByte, Ulong LpDefalutChar,Ulong lpUsedDefalutChar), |
Raw,Ulong,Pascal
End
....
! Собственно преобразование из UTF-8 в 16-битный Юникод, предполагается что Unicode Text в конце имеет нулевой байт

MultiByteToWideChar(65001,0,Address(UTF8Text),-1,Address(UnicodeText),UnicodeTextSize)

Вопрос, что с ним дальше делать?
Ал
✯ Ветеран ✯
Сообщения: 1014
Зарегистрирован: 08 Июль 2005, 6:48
Откуда: Россия
Поблагодарили: 1 раз

Connectionstring к mdb , если в пароле непечатаемые символы...

Сообщение Ал »

кажется в некоторых видах utf допускается смена порядка следование младших и старших байтов
"New IO.StreamReader("10.mem", Text.Encoding.UTF8)" - видимо из unicode в utf-эквивалент преобразуется?, а ".Utf8ToAnsi" - ?
интересно, довесок "Chr(13) + Chr(21) + "22 " + Chr(11) + Chr(12) + Chr(13) + Chr(14)..." к паролю сделали специально отдельно - жизнь усложнить "последователям" или "так получилось"? в конце chr(13) - видимо дописка для строки соединения, т.к. должен быть этот байт в конце, а при преобразовании строки из файла функция этот байт отсутствует?

p.s. в системе Администрирование - источники данных - по ODBC удается к этой базе подключится? ("Во многих программах MS Windows, чтобы получить символ Unicode, нужно при нажатой клавише Alt набрать десятичное значение кода символа на цифровой клавиатуре. Например, полезными при наборе кириллических текстов будут комбинации Alt+0171 («), Alt+0187 (») и Alt+0769 (знак ударения). Интересны также комбинации Alt+0133 (…) и Alt+0151 (—).")
gopstop2007
✯ Ветеран ✯
Сообщения: 1707
Зарегистрирован: 25 Март 2009, 21:55
Благодарил (а): 9 раз
Поблагодарили: 4 раза

Connectionstring к mdb , если в пароле непечатаемые символы...

Сообщение gopstop2007 »

Alex писал(а):Прошу помощи.Есть несколько Access овских mdb файлов. Все с паролями на открытие.
Глупый вопрос, это базы Вашей фирмы? А какой Access?
“Есть всего 2 типа языков: те, на которые все жалуются и те, которыми никто не пользуется.” — Бьерн Страуструп
Ал
✯ Ветеран ✯
Сообщения: 1014
Зарегистрирован: 08 Июль 2005, 6:48
Откуда: Россия
Поблагодарили: 1 раз

Connectionstring к mdb , если в пароле непечатаемые символы...

Сообщение Ал »

gopstop2007 писал(а):...Глупый вопрос...
:D
в корень зришь..., если б были "свои" - не было б вопросов... :mrgreen:
Ответить