Рассылка статей | Программирование и готовые решения
Leadersoft.ru

Рассылка статей

Программирование и готовые решения

В этом разделе сайта дается информация от https://leadersoft.ru о статьях по программированию, ответах на вопросы и др. Статьи рассылаются подписчикам и публикуются на разных сервисах. Возможно некоторая информация устарела и ссылки не работают, но эти сведения могут быть полезны, если Вы серьезно занимаетесь разработкой баз данных

Выпуск 71. Защита данных в файлах MDB - часть 4

Данная статья ориентирована на начинающих разработчиков Access, желающих более углубленно изучить возможности программирования в Access и сделать свои приложения более профессиональными.

Автор. Дмитрий Сонных

Защита данных в файлах MDB СУРДБ Access. Часть 4.

Шифрование содержимого полей в таблицах.

    Здесь необходимо уточнить. Можно шифровать всю базу данных, а можно шифровать содержимое отдельных полей в таблицах. Рассмотрим для начала вторую возможность.

    Этот способ защиты не плох. Во всяком случае, появляется реальная надежда, что-то спасти. Однако есть ряд ограничений. Шифровать следует только символьные поля или поля типа MEMO. Немного подумав, Вы сами поймете, почему так. Ну, хотя бы, при шифровании числовых полей, Вы можете получить в результате нечисловое значение. Впрочем, и это легко обходится. Я встречал варианты, когда счетчик записи использовался для шифрования числовых данных. Например, складывался с нужным числом. Или из счетчика бралась последняя цифра и добавлялась к числу. Но шифровать числовые данные допустимо только в особых случаях, когда их значение может быть однозначно привязано к определенному объекту или действию. В остальных случаях достаточно шифровать символьную информацию. Да и то выборочно. Например, названия клиентов, их адреса, контактные телефоны, реквизиты банковских счетов, фамилии и должности представителей заказчика (клиента). В общем, в зависимости от требований, шифроваться должно то, что однозначно позволяет идентифицировать запись.

    Чем и как можно шифровать? Всем, чем угодно и как угодно. Здесь всё зависит от Вашего умения и опыта. Можно написать собственную функцию. Можно использовать специальные библиотеки. Пример можно посмотреть на сайте Сергея Подосенова (aka SRG), вот здесь  http://mdbprogs.narod.ru/arCL.htm . Можно сочетать приятное с полезным, не шифровать, а сжимать содержимое поля, используя библиотеки архивирования данных. Например, zlib.dll (zlibwapi.dll). Адрес сайта http://www.zlib.net/ . А если Вы горите желанием, то и сами можете разработать подпрограмму сжатия. Но не стоит без нужды усложнять алгоритм шифрования, ведь перед отображением и обработкой данных их необходимо дешифровать. А на это необходимо время. И чем больше полей у Вас зашифровано, чем навороченнее алгоритм шифрования, тем больше времени на это уходит.

Ну, а теперь, как всегда, переходим к недостаткам этого метода. О том, что на это уходит время, я упоминал. Нельзя напрямую вводить в таблицы и формы данные, подлежащие шифрованию. Приходится делать для ввода и редактирования записей, содержащих шифрованные или сжатые данные, специальные формы. Но в некоторых случаях это даже к лучшему. Можно разрешить доступ к таким формам только определенным пользователям, с соответствующими привилегиями. Если Вы используете самописные функции (функции собственной разработки), то алгоритм шифрования и ключ содержатся в программе, а значит, есть и потенциальная уязвимость. В этом случае рекомендуется эти подпрограммы вынести в отдельный модуль. Если у пользователя клиентская часть будет в формате MDE, то он не сможет определить, какой файл подключен по References. Конечно, под отладчиком можно определить, какая библиотека (функция, класс) отсутствует. Для этого потенциальный взломщик должен иметь под рукой и клиентскую часть базы и часть с таблицами. И это уже квалификация не рядового пользователя. Если Вы используете библиотеки DLL, то здесь могут возникнуть вопросы с их установкой и регистрацией. Но в и-нете можно найти примеры, как можно установить и зарегистрировать DLL из самой базы Access. Кроме того, установку DLL и OCX можно возложить на программу-инсталлятор клиентского приложения (если она у Вас есть). В конце-концов в и-нете много бесплатных программ для создания инсталляционных пакетов - например, InnoSetup. Потратив некоторое время, вы можете создать свой инсталляционный пакет, предназначенный для установки н��обходимых библиотек.


Комментарий к предыдущему выпуску (№70)


    Честно сказать, я совершенно убит рекомендациями, которые вы даёте начинающим разработчикам в номере рассылки от 7 марта 2007 :( Не дай бог кто-нибудь из них действительно им последует и станет называть таблицы t001, t002, ..., поля f01, f02, ... Этим они станут бороться не с хакерами, а в первую очередь с самими собой. Представляю, как они будут себя чувствовать, когда захотят сделать изменения в собственной программе через полгода! Особенно если ни один хакер никогда этих программ не увидит, что скорее всего. Зря вы это написали, видит бог зря! Предлагаемый "метод" защиты данных представляется мне самым вредным из всех, что только можно придумать. Если бы Microsoft писала свои программы подобным образом, мы вообще никогда не увидели бы даже самую первую версию MS Access.

прислал Павел Воронков

Выпуск 70. Защита данных в файлах MDB - часть 3

Поздравляем представительниц прекрасного пола с праздником 8 Марта, желаем прекрасного настроения, исполнения всех желаний и море-море цветов. !!! Мужчины не забудьте поздравить знакомых и родственников с наступающим праздником.

Данная статья ориентирована на начинающих разработчиков Access, желающих более углубленно изучить возможности программирования в Access и сделать свои приложения более профессиональными.

Автор: Дмитрий Сонных

Защита данных в файлах MDB СУРДБ Access. Часть 3.

Маскирование таблиц и полей.

    Предположим, что злоумышленнику удалось обойти вашу защиту и добраться до таблиц. Как быть в этом случае? Здесь тоже можно подпортить «хакеру» немного крови. Как Вы называете таблицы? Русские версии Access понимает русские названия и поначалу таблицы имеют такие имена; Адрес организации, Поступление Товара, Транспортные накладные и т.п. Очень скоро разработчик приходит к пониманию, что пробелы в названиях сильно усложняют жизнь, и появляются названия АдресОрганизации, ПоступлениеТовара, ТоварноТранспортныеНакладные… Еще через некоторое время появляются таблицы с именами: Sotrudniki, Tovar, Otdel… И в конце концов появляются названия tblAdressOrg (или tbAdressOrg), tblOtdel, tblZarplata… То же самое происходит и с именами запросов, форм, макросов, отчетов, а так же с названиями полей в таблицах и контролов на форме. Для большей читабельности базы, заполняются параметры «Описание» таблиц, запросов, форм, отчетов, макросов, полей.

    А теперь представьте себе такую картину. Вы открываете базу, а там Table01, Table02, Table03…. Form01, Form02…. Report01, Report02… Поля в таблице имеют наименование Field01, Field02… В общем Вы меня поняли. Но для этого у Вас на компе или на листочке всё должно быть расписано подробнейшим образом. Имя таблицы, её назначение, имя поля – характер информации. Это потребует дополнительных затрат рабочего времени и большей организованности в работе. Не все на это легко согласятся.

    А как же связи между таблицами? Открыв схему данных можно легко отследить связи между таблицами и тогда… В книгах и на форумах высказывалось много соображений про полезность и необходимость установки связей между таблицами. И сохранение целостности данных, и каскадное удаление записей, и увеличение скорости выполнения запросов и т.д. и т.п. Я не буду возражать насчет полезности связей, но без них можно обойтись. Пусть меня ругают и тыкают в меня пальцем, но я скажу, что создать довольно сложные приложения на Access можно и без создания схемы данных. Я это говорю из личного опыта. Но при этом все действия по сохранению целостности базы, удалению данных, разруливанию критических ситуаций Вы берете на себя. Это дополнительный код, это более тщательное программирование, дополнительный контроль при некоторых операциях (например – удалении). Более тщательный порядок при работе с таблицами. Всё это дополнительные затраты, но всё это не так сложно, как кажется на первый взгляд. А схему данных можно сделать и на бумаге. (Я так и делал).

    А теперь, как всегда, критические замечания. Про неудобство составления запросов и работы с рекордсетами, я уже писал. И про дополнительные сложности в программировании при отсутствии схемы данных – тоже. А вот про то, что текст всех запросов можно спокойно просмотреть даже в MDE файле об этом не упоминал. Даже то, что формы нельзя править, не является препятствием, для определения запроса, на котором основана форма. Даже если вы вручную набрали текст в поле «Источник данных» не спасает его от просмотра через панель (форму) «Свойства». Терпеливый пользователь, посидев с бумагой и ручкой, может восстановить схему данных. Так что переходим к следующему уровню защиты – шифрованию данных. Но об этом в следующей  статье.

 

Выпуск 69. Программирование с человеческим лицом

Данная статья ориентирована на начинающих разработчиков Access, желающих более углубленно изучить возможности программирования в Access и сделать свои приложения более профессиональными.

Автор. Алексей Канищев

Программирование с человеческим лицом

Почти каждый программист знает, как важны удобство использования программ и дружественный интерфейс (usability и friendly user interface). И всё же, программисты и пользователи - это два разных мировоззрения. Пользователь чаще желает простоты, а программист мыслит категориями: универсальности, настроек и дополнительных возможностей. Справку и руководство пользователи читают, только если им интересна какая-то функция. Если с первого знакомства программа в целом - непонятна, то её просто удалят.

Что бы не говорили о компьютерной грамотности населения - это грамотность базовая. Люди знают, что в поля ввода (кстати, должно быть ясно, что это именно поле ввода) - можно вводить буквы и цифры в соответствии с её надписью, что от нажатия кнопки можно ждать того, что на ней надписано. И так далее. Ведь программы - это не головоломки, а способ решения рутинных человеческих задач. А написание программ - перенос простых нетворческих действий человека на компьютер, чтобы человек мог заниматься вещами более ему присущими.

Многие, особенно начинающие программисты часто прибывают в иллюзии, придавая своей деятельности излишнюю важность. Тем самым ставят результат программирования - на второе место.

Представьте себе, что вам нужна табуретка. Вы приходите столяру, а он, вместо решения проблемы (вам не на чем сидеть) - начинает рассказывать о своих инструментах и о том, как хорошо и удобно вам будет, когда вы сможете опереть свою пятую точку на продукт его творчества.

В процессе диалога окажется, что такие магические вещи (любимые программистами Wizard'ы), как молоток, пассатижи, шуруповерт, рубанок, рулетка и штангенциркуль - станут необходимыми предметами Вашего быта, с помощью которых вы сможете индивидуально конфигурировать сиденье под ваш зад хоть каждый день.

Первое, что вы почувствуете: вы, перед этим «мастером», как м��нимум - глупо выглядите. Мало кто платит деньги за то, чтобы чувствовать себя дураком. Второе: Вы начинаете думать, что присесть на что-либо - это не так просто. А обслуживание своей возможности сидения на табуретке - вообще целая наука.

Нафиг-нафиг. Проще пойти в какую-нибудь Икею и выбрать там стандартный стул под нужды своей пятой точки. Многие так и поступают. Пусть не совсем «под меня», но зато - это решение проблемы. Проще купить готовое решение - чем циклится на его реализации. Хотя бы потому, что табуретка - это не смысл жизни, а просто средство для сидения перед монитором.

Точно также и программы: тонкости настройки, ради которых надо быть таким же умным, как и вы - никого не интересуют. Необходимо решение, которое может освоить любой.

Мне, наверное, повезло. Когда я только начал писать первые программы на MS Access - я сам же был их непосредственным пользователем. Я программировал базы данных и оболочки к ним для маркетинговых исследований и сам же был их оператором - вбивал анкеты.

Это сказалось на моём стиле программирования: интерфейс был, в прямом смысле «как для себя». Я вылизывал эргономику до совершенства: экономил каждое движения пальцев над клавиатурой, а мышкой не пользовался вообще, потому что использование мыши оказалось не эффективным по трудозатратам.

Представьте себе интерфейс, где есть пусть даже 10 лишних нажатий клавиш (и их сочетаний). Ничего страшного, многие программы страдают и большим излишеством? А теперь - представьте, что Вы - оператор базы данных, которому надо вбить 10 000 анкет. Получаем 100 000 лишних движений! Не жутко? :)

В былые времена, инженер, по проекту которого построили мост - заплывал под него на лодке. А по мосту ехал, например, паровоз, или телеги с камнями. В-общем, то - для чего мост был предназначен. Многим нынешним программистам такой подход был бы очень кстати.

Представьте себя пользователем, «включите дурака» (не забудьте потом выключить! :)), поработайте в своей программе часок-другой. Такой тест-драйв даст много полезной информации. Покажите программу вашим близким, далёким от программирования. Если они не разобрались на 15 минут - то вам ещё есть над чем поработать.

Плоха статья без примеров. Один из вариантов программы «для людей» - программа «Окна-Двери 1.20» - для расчёта окон, дверей и балконов. Я написал её с точки зрения пользователя. Первый же отзыв о программе был такой: «Алексей - где ты научился такие простые программы писать?». Даже инструкцию читать не хотели, и так всё поняли. Скачать программу можно с моего сайта: http://alexvk.ru/window/. Дистрибутив занимает всего 290Кб, программа написана на Access 2003.

Статья наверняка вас чем-то зацепила, у вас есть свой опыт по программированию с человеческим лицом. Давайте им делиться! Напишите мне, и на страницах этой рассылки появится новый, интересный материал.

Постоянный адрес этой статьи в интернете: http://alexvk.ru/articles/user-interface.php


Ответы на вопросы


Вопрос 1. Добрый день
Подскажите, есть в форме путь к файлу xls. Какую процедуру навесить на кнопку для открытия?
  Ответ. Application.FollowHyperlink strPath
Вопрос 2. Подскажите пожалуйста такая проблема: в отчете есть три выводимых поля
1 Сума
2 Валюта
3 Еквивалент
Необходимо чтоб если поле валюта было например UAH то поле еквивалент равнялось [SUMA]\5.05, Если USD то поле еквивалент равнялось [SUMA] ?
  Ответ. Можно использовать IIF([Валюта]='USD';[SUMA];[SUMA]\5) в запросе отчета.
Вопрос 3. Перед репликацией забыл дать доступ одному пользователю к одной таблице. Вроде все просто: так как дать доступ в реплике нельзя (так "оно" сообщает), открывается основная реплика и там дается доступ. НО! В основной реплике доступ есть (можно "поставить-снять"- нет проблем) НО в реплике он (доступ) не появляется. И основная реплика и реплика "пользуются" одним и тем же Secured.mdw. Синхронизация не приводит к "появлению" доступа. Я- администратор (начинающий) БД и владелец всех объектов БД. Win2000, MSAccess-2003 Может есть идея- в "чем собака порылась"? Заранее благодарен.
  Ответ. При репликации в каждую таблицу mdb добавляются 4 ключевых поля, сам же файл mdw не реплицируется. Туда ничего не добавляется. Возможный выход - создаете новую базу данных mdb и из главной реплики туда загружаете все таблицы. Далее удаляете все импортированные оля репликации. Далее нужно повторить все действия по репликации и защите базы данных.

Вопрос 4. Добрый день, подскажите пожалуйста:
1.Необходимо чтоб а поле отчета если оно пустое выводилось "0,00" (отчет не хочет считать если одно из полей пустое)

  Ответ. Формат поля = "# ##0,00;# ##0,00;0,00;0,00". Ввести без кавычек.
Вопрос 5. Подскажите как быть в одном блоке If необходимо проверка еще на значение как правильно оформить?

If me.Поле0 = "USD" And me.Поле1 = "2" Then
    MsgBox "Ok"
    If me.Поле3 = "2" And me.Поле4 = "5" Then
        MsgBox "False"
    End if
End If

Ответ.  flag1 = Cbool(me.Поле0 = "USD" And me.Поле1 = "2")
                 flag2 = Cbool(me.Поле3 = "2" And me.Поле4 = "5")

                If flag1 = True And Flag = True Then msgbox "ОК"

Выпуск 68. Защита данных в файлах MDB-часть 2

Данная статья ориентирована на начинающих разработчиков Access, желающих более углубленно изучить возможности программирования в Access и сделать свои приложения более профессиональными.

Автор. Дмитрий Сонных

Защита данных в файлах MDB СУРДБ Access. Часть 2.

 Защита с использованием пароля БД.

    Данный способ защиты позволяет установить пароль на открытие БД, для всех пользователей. Для его создания необходимо открыть файл БД в "монопольном" режиме и выбрать пункт меню Сервис / Защита / Задать пароль базы данных. Для работы с такой базой данных в MS Access потребуется вводить пароль. Вот пример работы с файлом БД, используя DAO или ADO.

    Public Sub TestDAO()
        Dim mWS As DAO.Workspace
        Dim mDB As DAO.Database
        Set mWS = DBEngine.Workspaces(0)
        Set mDB = mWS.OpenDatabase ("C:\a97.mdb", True, True, ";pwd=123")
    End Sub

    Public Sub TestADO()
        Dim CnDB As New ADODB.Connection
        CnDB.Open "Provider=Microsoft.Jet.OLEDB.4.0" & ";Data Source=C:\a97.mdb" & ";Jet OLEDB:Database Password=123"
    End Sub

    Это тоже не самый надёжный способ защиты баз данных. Существует достаточное количество бесплатных и платных утилит, отображающих пароль. В том числе доступны исходники кода на VB позволяющие прочитать такой пароль. В прочем не всё так плохо.

    Дело в том, что некоторые разработчики считают, что кроме английского языка, других языков не существует. Достаточно включить в пароль русские буквы, чтобы привести в ступор пользователя, который использует такие программы. Да, они вроде бы и вскрывают пароль, но то, что они выдают в качестве пароля, разобрать невозможно.

    Продолжим игры с паролем базы данных. Например, можно использовать в пароле непечатные символы. В первую очередь этот способ нацелен на противодействие определению паролей с помощью специальных программ. Стандартный способ установки и использования пароля БД подразумевает его ввод с клавиатуры в диалоговом окне. Если строка пароля содержит непечатные символы, то они не будут корректно отображены программой открывающей пароли БД. С другой стороны этот пароль нельзя ввести в диалоговом окне при открытии БД в MS Access.

    Если бы пароль содержал символы табуляции, Esc или Enter, то стандартным образом Вы бы не смогли их ввести в окошко ввода пароля. Способ основан на том, что пароль БД формата Access 2000 и 2002-2003 - текстовая строка в формате Unicode (в Access 97 – ANSI). При этом нет ни каких ограничений на её содержимое. В спецификации баз данных и в справке по DAO 3.60 указано, что максимальное число символов в пароле - 14. Но на самом деле их может быть 20. При этом и сам Access 97 не допускает ввода строк пароля более 14 символов. В спецификации Access 2003 также сказано про 14 символов, но программа допускает ввод всех 20. Также возможно использование непечатных символов, что приводит большинство программ взламывающих пароли в ступор.

    Для установки такого пароля потребуется применить специальную программу, использующую метод CompactDatabase библиотек ADOX или DAO. Но, как говорится, против всего можно найти лом. И такая защита вскрывается.

  • Во-первых, можно воспользоваться программой AccessRecovery, которая создаёт новый файл без защиты и переносит в него таблицы, запросы, формы, макросы, отчеты и код модулей.
  • Во-вторых, можно попытаться определить пароль БД с помощью специальных программ.
  • В-третьих, можно узнать пароль, проанализировав код программы в отладчике. Каков бы ни был пароль, он всё равно передаётся как текстовая строка в методе открытия БД. При наличии определённого опыта - это не очень сложная задача.
  • Узнать или изменить пароль БД можно, не прибегая к помощи специальных программ. В Access 97 пароль получается сложением по XOR пароля с 20 байтной последовательностью. Значения этих байт можно получить из любого не защищённого паролем mdb файла. Начиная с Access 2k, в связи с использованием Unicode, для хранения 20 символов пароля отведены 40 байт. При шифровании также используется сложение по XOR, но для получения последовательности байт соответствующей пустому паролю необходимо создать файл с датой исследуемой БД. Полученные байты можно вписать в исследуемый файл и обнулить пароль, либо сложить их с аналогичными байтами исследуемого файла и получить значение пароля.

    Но всё это уже требует наличие определенных знаний и опыта, так, что есть шансы на то, что любопытному пользователю надоест экспериментировать.

При составлении статьи были использованы материалы с сайта http://www.msvb.narod.ru/doc_access.htm


Комментарий к предыдущему выпуску (№67)


Цитата. Всю свою трудовую историю работы с Аксесом, был твёрдо уверен, что защитить ФС (файл-сервер) Аксеса (mdb\mde) в сети (да и не только Аксеса, а вообще ФС) от несанкционированного доступа толком невозможно. Пока один очень сильный админ у моего клиента не продемонстрировал мне такую штуку. Файл сервер, Аксес, домен, АД, шара (полный доступ, т.к. это требуется для ФС), приложения на клиентских ПК (более 20) работают с файлом как обычно, штатно прилинкованные таблицы. Но... Ни в сети, ни в консоли, даже зная путь к шаре и имена файла, я не смог скопировать (дёрнуть) ф-л БД с сервера, ни открыть никакой вменяемой программой - призрак. Тыкался, тыкался... Уп-с. Чего он там намудрил с политиками - не знаю, не кололся. Но факт, я не смог получить доступ к самому файлу БД. При этом админ работал штатными средствами виндового сервера. После этого случая я задумался. О жизни, о админах и о технологиях ФС, одной из острых претензий к которой у меня была "незащищаемость" хранилища БД в сети. Если бы мне это рассказали ДО этого случая, если бы я сам не пытался безуспешно "ломануть" свою же АСУ, не поверил бы...
  Комментарий. У пользователя отбираются права на просмотр содержимого каталога и поиск по каталогу где лежит база на сервере. И всё. Юзер файл увидеть не может, скопировать не может, найти не может, ярлык создать не может. НО! Может запросто с ним работать, если ему дали разрешение на изменение этого файла. И это не обязательно должен быть сервер под Windows. На Nowell такое тоже возможно запросто. прислал Малков Андрей Геннадьевич
 Комментарий. Еще один вариант микро-защиты. Можно в названии папки добавить $, например, ww$, тогда ее в сети не видно, но напрямую к ней обращаться можно и сохранять файлы тоже, если конечно есть права доступа (справка от leadersoft.ru).

Выпуск 67. Защита данных в файлах MDB

Данная статья ориентирована на начинающих разработчиков Access, желающих более углубленно изучить возможности программирования в Access и сделать свои приложения более профессиональными.

Автор: Дмитрий Сонных

Защита данных в файлах MDB Access

     Маленькое отступление. Что такое СУРБД? Это расшифровывается как Система Управления Реляционными Базами Данных. А что такое - реляционные? Для простоты можно сказать, что это базы, основанные на таблицах. А что, бывают другие? Да, бывают. Базы знаний, иерархические базы, есть и другие, но это уже отдельный разговор. И так, продолжим. Более-менее продвинутый разработчик делит свою базу на две, а иногда и более частей. Деление на интерфейсную и табличную часть надо проводить, когда программа готова к передаче в эксплуатацию, а иногда и раньше (если Вы не пишете программу только для себя). Это облегчает сопровождение программы, находящейся у клиентов. Это практически обязательное требование при построении файл-серверных многопользовательских систем. О защите клиентской части здесь уже поднимался вопрос. Я же хочу рассмотреть проблему защиты данных, находящихся в таблицах. Будем рассматривать файл-серверный вариант размещения базы.

     Прежде, чем начнем разговор о защите, Вы должны ясно представить себе, от чего вы хотите защитить свои данные. Защиты бывают разных уровней и сложностей. И может быть выполнение требования «максимально защитить все данные» превысит по трудоемкости разработку и отладку самой базы. И помните, что один человек сделал, другой завсегда сломать может. И никакая защита не спасет от обыкновенного разгильдяйства. Я встречал случаи, когда логин и пароль доступа писали на бумажке, а затем эту бумажку клеили на монитор, «чтобы не потерять». И это не анекдот. Дело в том, что рядовому сотруднику фирмы/отдела чаще всего нет никакого дела до защиты информации. Его задача – отработать положенные часы, причем с наибольшим комфортом для себя. Отсюда и выходит: раздаешь пароли доступа КАЖДОМУ сотруднику, а они их пишут на бумажке (общим списком) и кладут под стекло. Такое «безобразие» обычно заканчивается тем, что кто то чего то не туда ввел/удалил. Начинаются разборки – и тут до оператора доходит, что если бы он не разглашал свой пароль, то, стало быть, никто не смог бы влезть в базу и «ковыряться» там от его имени. Отсюда вывод – защита базы, дело РУКОВОДИТЕЛЯ, а не операторов. Рассмотрим теперь способы защиты. Есть несколько уровней и способов защиты.

Административный метод.

     Позволяет защитить от несанкционированного копирования самой части базы с таблицами. Из компьютеров изымаются пишущие CD/DVD приводы, FDD, Zip и JAZZ, магнитооптика, USB закрываются программно системным администратором. Все операции записи на носители может выполнять только определенный человек. Если есть выход в и-нет, то соответствующе настраивается прокси-сервер. У пользователей удаляются полные версии Access и устанавливаются Run-time версии, отбираются права администратора. Такую ситуацию сейчас можно увидеть на многих фирмах с устоявшейся структурой и налаженной работой, и где персональные компьютеры – действительно персональные, а не как шутили ранее - «персональный компьютер коллективного пользования.

     Иногда, к сожалению, административная защита превращается в фарс: «опломбировали» (заклеили) бумажками USB, на КПП охране дали указание проверять входящих/выходящих на наличие дискет (подумать только, какой архаизм – воровать дискетами), дисков… А многие спокойно ходят с мобильниками, в которых встроена Flash – карта. Такой уровень «защиты» показывает, что ей занимается человек весьма далекий от программных дел. Обычно такая картина наблюдается на госпредприятиях. Вообще, в отделах, отвечающих за защиту, не мешало бы повесить такой плакат:
Если информация записана – значит, ее можно прочитать, если ее можно прочитать – можно и скопировать, если можно скопировать – можно и украсть.

Маскировка.

     Как я писал ранее, разговор идет о разделенной базе данных. Часть с таблицами обычно хранится на сервере. И все пользователи должны иметь к ней доступ. Обычно на сервере создается каталог share (имя может быть любым) через который пользователи обмениваются файлами, где хранятся документы общего пользования и т.п. Никто не запрещает создать подходящий каталог и замаскировав его под служебный, присвоив какое-либо высокоумное название. Поместить в него базу данных (обычно, уже хорошо проработанная и долго эксплуатированная система обрастает кучей дополнительных каталогов, файлов, шаблонов и т.п.) и присвоить ей расширение, отличное от MDB. При подключении (линковании) таблиц Вы указываете точный путь и имя базы данных. И Access всё равно, как называется файл, главное, чтобы совпадала структура. В своё время, в Донецке, мне пришлось столкнуться с системой «Акцент» (бухгалтерская программа). Она была написана на VC, а вот в качестве хранилища данных в ней использовались MDB-файлы, с расширением – acc. Я встречал предложения вообще менять заголовок файла, а перед линковкой подставлять правильный. Но я бы не советовал такого делать. Операции прямой записи некоторые программы-сторожа (антивирусные мониторы) определяют как вирусные атаки и блокируют.

     Кроме того, в многопользовательской среде, достаточно подключиться к базе с таблицами одному из клиентов, как измененный заголовок будет восстановлен. Для того, чтобы при простом просмотре клиентской части нельзя было определить путь к базе с таблицами, путь шифруется и восстанавливается только в момент самого линкования. Для того, чтобы нельзя было скопировать линки с клиентского модуля, рекомендуется в конце работы отключать все прилинкованные таблицы, а в начале – подключать. Но это хорошо для неработающего модуля. Стоит только запустить клиентскую часть, как линки на таблицы с данными будут восстановлены. А дальше можно уже подключаться из чистой базы к работающему клиентскому приложению и копировать себе линки на таблицы. Чтобы этого не происходило, можно использовать вспомогательные программы-стартёры. Например,- ReleaseUpdate (http://am.rusimport.ru/MsAccess/topic.aspx?ID=533). Она проверяет наличие обновлений клиентской части, если они есть, то обновляет клиентскую часть, и запускает её на выполнение. Клиентскую часть можно расположить где-нибудь в Program Files, в специальном каталоге, а путь к ней, находящийся во внутренних таблицах программы ReleaseUpdate, можно зашифровать. Есть и другие готовые аналогичные программы. Например – MDBStarter (http://mdbprogs.narod.ru/mdbstart.html).

Защита на уровне доменных политик.

     На форуме по Access, на сайте SQL.RU я встретил такую заметку: «Всю свою трудовую историю работы с Аксесом, был твёрдо уверен, что защитить ФС (файл-сервер) Аксеса (mdb\mde) в сети (да и не только Аксеса, а вообще ФС) от несанкционированного доступа толком невозможно. Пока один очень сильный админ у моего клиента не продемонстрировал мне такую штуку. Файл сервер, Аксес, домен, АД, шара (полный доступ, т.к. это требуется для ФС), приложения на клиентских ПК (более 20) работают с файлом как обычно, штатно прилинкованные таблицы. Но... Ни в сети, ни в консоли, даже зная путь к шаре и имена файла, я не смог скопировать (дёрнуть) ф-л БД с сервера, ни открыть никакой вменяемой программой - призрак. Тыкался, тыкался... Уп-с. Чего он там намудрил с политиками - не знаю, не кололся. Но факт, я не смог получить доступ к самому файлу БД. При этом админ работал штатными средствами виндового сервера. После этого случая я задумался. О жизни, о админах и о технологиях ФС, одной из острых претензий к которой у меня была "незащищаемость" хранилища БД в сети.

     Если бы мне это рассказали ДО этого случая, если бы я сам не пытался безуспешно "ломануть" свою же АСУ, не поверил бы.» Подробности не были раскрыты, но высказывалось предположение, «Как версия: например, в Windows зашёл пользователь user1, у которого нет прав на доступ к сетевому каталогу с базой, а приложение запускалось с правами другого пользователя user2 (через runas или указан в свойствах ярлыка), у которого есть такие права.» Я не являюсь специалистом по администрированию Windows, но из личного опыта расскажу следующее. Когда возникла необходимость мне работать с Developer SQL Server, то наш админ установил его у меня на компе, причем так, что я мог свободно работать с базами, которые находились локально тут же на компьютере, знал раздел, где они лежали, но не мог в него зайти.

Защита при помощи терминального доступа к серверу.

     Практически непрошибаемая защита. И клиентская часть и база с таблицами находится на сервере. У клиента на компьютере эмулируется терминал сервера. Словно ты за ним сидишь (в смысле, за сервером). Можно настроить терминальный доступ так, что при запуске требуемой задачи (по ярлыку), запроса соответствующих паролей доступа к системе, сразу грузится требуемая база. При закрытии базы терминал закрывается. В самой базе прописана защита от шифта, отключены все стандартные Access-овские меню и горячие клавиши, отключено окно базы. И ничего пользователь ни затереть, ни скопировать не может. Ни открыть напрямую таблицы, ни получить доступ к закрытым для него формам и отчетам. Ещё терминальный доступ называется, по-моему, удаленным рабочим столом.

     Недостатки этого способа – вся обработка данных ложится на сервер, зато в качестве клиентов можно использовать слабые машины.

     Есть еще два метода: Защита при помощи макроса AutoExec и блокировки Shift, защита паролем. Но о них уже рассказывалось в предыдущизх статьях http://www.accessoft.ru/Text/Text201.html     http://www.accessoft.ru/Text/Text202.html

При составлении статьи были использованы материалы с сайта http://www.msvb.narod.ru/doc_access.htm


Ответы на вопросы


Вопрос 1. Добрый день. Вопрос я понимаю пустяковый, но меня это почему-то поставило в тупик
Есть таблица с полями. Первоначально она не заполнена. Надо сделать форму, чтобы через нее заполнялась данная таблица. При этом в таблице есть поле Проект, и вот хочется, чтобы в форме в поле со списком выбирался этот проект и все записи были присвоены выбранному проекту. Не знаю почему, но я абсолютно запуталась. Хотя может судя по моим объяснениям запутаетесь и вы :)
Пожалуйста, помогите разобраться!
  Ответ. Чаще всего открывают 2 таблицы, одна будет хранить проекты (название и ID), другая ID и все данные по проекту. Связь таблиц организуется по ID. Далее организуете форму (1 таблица) с подчиненной формой (2 таблица).
Вопрос 2. Есть форма раздела БД,которая состоит из нескольких вкладок.На вкладках находятся подчиненные формы.Подскажите как сделать чтобы ярлычок вкладки менял цвет взависимости от значения в определенном поле подчиненной формы (0-зеленый;>0-красный).
  Ответ. У ярлычка вкладки нет такого свойства, чтобы можно было менять ее локальный цвет. Для отличия от других вкладок, можно установить у нее иконку
Вопрос 3. Добрый день, Admin!
У вас имеется пример заполнения файла Excel из Access. Что необходимо дописать, что бы после получения данных, xls сохранялся в опред. папке?
  Ответ. ActiveWorkbook.SaveAs Filename:="E:\Папка\Книга.xls", FileFormat:= xlNormal, Password:="", WriteResPassword:="", ReadOnlyRecommended:=False, CreateBackup:=False
Вопрос 4. У нас на предприятии есть база данных на Акцессе2000, на ней ведется складской учет. Работает в сети на общем доступе (в сети 4 компа) при работе БД иногда появляется, что-то типа пока вы тут работали, данные были изменены другим пользователем и предлагает выбор "сохранить в буфере", "сохранить", "отменить", хотя пользователь может быть вообще один, затем данные слетают, некоторые макросы перестают работать, все жутко глючит, и появляется новая таблица в БД: MSysCompactError с полями ErrorCode (-1206) ErrorDescription, ErrorRecid, ErrorTable. Подскажите пожалуйста в каком направлении тут копать?
  Ответ. 1. Индексируйте каждую таблицу базы данных.
                2. После создания записи сохраняйте ее базе.Все действия над новыми записями сохраняются в буфере у клиента. Реально в базе данных запись не создается, а эта операция требует некоторого времени на изменение размера файла. Поэтому лучше 1 или несколько пустых записей создать (me.refresh), а потом можно будет их редактировать, тогда ошибок в сети будет меньше из-за новых записей, а точнее конфликтов с индексами.
Вопрос 5. Добрый день. Подскажите, есть в форме путь к файлу xls. Какую процедуру навесить на кнопку для открытия ?
  Ответ. Application.FollowHyperlink strPath

Выпуск 66. Особенности проектирования приложений Access

Данная статья ориентирована на начинающих разработчиков Access, желающих более углубленно изучить возможности программирования в Access и сделать свои приложения более профессиональными.

Автор. Парусников Алексей

Особенности проектирования приложений Access.

     Одной из причин, почему Access завоевал такую большую популярность во всем мире как средство разработки приложений баз данных, является скорость, с которой разрабатываются подобные приложения по сравнению с другими средствами. Причем, это признают и программисты, занимающиеся разработкой баз данных при помощи других пакетов. В этой статье я расскажу о некоторых особенностях Access, которые и способствуют такой «акселерации».

Формы и отчеты.

     Как известно, основная часть приложения состоит из диалоговых окон, или просто форм. Обычно у каждой формы есть свой источник данных – таблица или  запрос. Часто начинающие разработчики Access даже не задумываются об этом, а вот программистам, использующим другие средства разработки, не ориентированные специально на базы данных, это хорошо известно. Им приходится создавать подключение к источнику данных (обычно через ADO), цеплять этот источник к форме, потом цеплять к каждому контролу соответствующее ему поле таблицы. В Access все это сделано по умолчанию, что и позволяет значительно ускорить проектирование приложений.

     Еще большей скорости можно добиться, если использовать шаблоны – заготовки форм по умолчанию. Действительно, если Вам не нравится стандартный вид формы и контролов, предлагаемый Access по умолчанию, и Вы все время изменяете высоту полей, стиль оформления, шрифты и т. д., то можно это сделать один раз, сохранить заготовку формы и объявить ее как шаблон. Теперь при создании новой формы параметры контролов в ней будут установлены по умолчанию.

     Итак, заходим на вкладку формы, жмем «создать в режиме конструктора». Вызываем в конструкторе  панель свойств формы (двойным щелчком по форме или жмем кнопку «Свойства»). Разворачиваем панель элементов, если ее нет, то жмем кнопку «Панель элементов» - та, что с «молотками»). Теперь на панели элементов выбираем элемент, например «Надпись» и задаем параметры элемента (в форме настроек) – шрифт, высоту шрифта, выравнивание и т. д. То же  самое проделывает с другими элементами. В результате получаем пустую форму, в которой заданы пользовательские параметры контролов. Чтобы убедиться в этом, закидываем какой-нибудь котрол на форму, и смотрим, какие у него параметры – как видно, те, которые задавались в настройках. Теперь, чтобы эти параметры контролов были заданы для всех будущих форм, а не только для этой, нужно созданную форму указать как шаблон.

     Сначала сохраним ее, например под именем «ФормаШаблон». Затем жмем Сервис – Параметры – Формы и отчеты и указываем в поле «Шаблон формы» имя нашего шаблона – «ФормаШаблон». Таким же образом можно создать шаблон настроек отчета, сохранить его и указать в поле «Шаблон отчета».

     Эти настройки сохраняются только для текущего проекта. В новом проекте опять появятся стандартные – тип «Обычный». Чтобы применить пользовательский шаблон в новом проекте, импортируем его в проект и укажем его имя.
При создании форм, часто приходится выравнивать элементы. Чтобы дело пошло быстрее, можно выравнивать их все сразу: выделяем группу элементов (окном или удерживая Shift), затем правой кнопкой – и выбираем стиль выравнивания: по левому краю, по правому и т. д. Такой способ удобен, когда нужно сдвинуть группу контролов, которые разбросаны по форме – сдвигаем один «как надо», а остальные выравниваем по нему.

Запросы.

     В Access есть отличный мастер создания запросов. Мне лично больше всего нравится, что запрос можно редактировать в графическом режиме, что намного нагляднее, к тому же вероятность ошибки в синтаксисе SQl сведена практически к минимуму – ведь пишет мастер. Как правило, в 90% случаев его хватает, руками приходится писать только совсем уж заумные вещи, да и те обычно предварительно создаются в мастере.

Как работать с мастером, думаю, нет нужды рассказывать. Остановлюсь лишь на таком моменте: иногда приходится прописывать строку SQl в модуле формы. Очевидно, чтобы избежать ошибок, а заодно ускорить процесс создания, лучше «нащелкать» запрос в мастере, проверить его, затем переключиться в режим SQL, скопировать полученные «кракозябры» в буфер и вставить в текст модуля. Такой способ позволяет, даже не понимая практически ничего в SQl, создавать достаточно сложные запросы, к тому же скорость создания запросов на порядок выше, чем вручную. Правда, синтаксис в VBA несколько отличается от того, что пишет мастер в конструкторе. Вот некоторые особенности:

  1. вместо «;» (точка с запятой) в VBA следует писать просто «,» (запятая)
  2. в конструкции WHERE для полей типа «дата» должна быть дата в «буржуйском» формате. SQL по другому не поймет. То есть 22.02.04 должно выглядеть как 02/22/07. Для этого удобно использовыть функцию Format. Для текущей даты он должен выглядеть так: Format(Date(), "\#MM\/DD\/YY\#")

Модули.

     Практически все начинали «творить» свои первые приложения при помощи специальных мастеров, а их в Access не мало, на каждой вкладке окна программы есть свой мастер: мастер создания таблиц, мастер создания запросов, мастер создания форм, мастер создания отчетов, мастер создания страниц доступа к данным. Среди всей этой гвардии особенно выделяется «мастер создания программ» - макрос.

     Часто начинающие разработчики Access не спешат «разбираться» с VBA, предпочитая пользоваться мастерами. Тем не менее, можно создавать достаточно сложные программы … практически не разбираясь в программировании! И делается это при помощи макросов.

     Макрос в Access представляет собой структуру, состоящую из одной или нескольких макрокоманд, которые выполняются либо последовательно, либо в порядке, заданном определенными условиями. С помощью макросов можно выполнить практически все действия над объектами Access. Каждая макрокоманда имеет определенное имя и, возможно, один или несколько аргументов, которые задаются пользователем. Например, при использовании макрокоманды ОткрытьФорму (OpenForm) в качестве аргументов необходимо задать, по крайней мере, имя открываемой формы и режим вывода ее на экран.

     Я бы назвал использование макросов как очередной шаг на пути к профессиональному программированию в Access. Использование макросов оправдано тем, что их легко создавать, и для этого не нужно изучать синтаксис языка программирования. К тому же в русской версии Access все макрокоманды переведены на русский язык, что еще более упрощает их применение. Если Вы решили, что стандартных возможностей мастеров Access Вам уже не достаточно, а разбираться в тонкостях VBA не собираетесь, или пока не собираетесь, и в то же время, хотите сделать свое приложение более профессиональным – то макросы помогут Вам в этом. Однако использование макросов имеет и некоторые недостатки:

  • Возможности макрокоманд ограничены по сравнению с возможностями языка VBA, поэтому в ряде случаев без программирования на VBA не обойтись
  • Макросы можно использовать практически везде, где применяются процедуры VBA, однако процедуры VBA, как правило, выполняются быстрее
  • Макросы являются объектами, существующими отдельно от форм и отчетов, в которых они используются, поэтому, когда этих объектов становится очень много, их поддержка достаточно трудоемка. Процедуры обработки событий VBA являются неотъемлемой частью форм и отчетов, и в этом есть свои преимущества. Например, при переносе форм и отчетов из одной базы данных в другую с ними автоматически переносятся связанные процедуры
  • В отличие от процедур макросы при преобразовании приложения в .mde формат не компилируются и могут редактироваться и даже удаляться.

     Есть еще одна причина, по которой начинающим разработчикам стоит присмотреться к макросам: при помощи макросов можно… изучать VBA. Поясню на примере.

     Допустим, Вы хотите написать процедуру экспорта запроса в Excel, и как водится, не знаете, как это сделать. Заходим на вкладку Макросы, жмем «создать». В поле Макрокоманда выбираем «ВывестиВФормате». В аргументах макрокоманды устанавливаем параметры: тип объекта – запрос, имя объекта – (имя запроса), формат вывода - Microsoft Excel (*.xls), имя файла – (например D:/Таблица.xls), автозагрузка – нет. Сохраняем макрос. Теперь, чтобы посмотреть, как все это выглядит в VBA, выделяем в окне проекта макрос, выбираем Сервис – Макрос – Преобразовать макросы и далее по диалогу. В результате появится модуль, в котором среди прочего будет:

     DoCmd.OutputTo acQuery, "", "MicrosoftExcelBiff8(*.xls)", "", False, "", 0

Таким образом, можно создавать процедуры что называется «по кусочкам», изучая заодно VBA.

Выпуск 65. Эффект "бегущая строка"

Данная статья ориентирована на начинающих разработчиков Access, желающих более углубленно изучить возможности программирования в Access и сделать свои приложения более профессиональными.


Эффект "бегущая строка"

     В этой статье рассмотрим пример реализации эффекта «бегущая строка». Применять его можно, например, как своеобразную «напоминалку», побуждающую пользователя зарегистрировать программу, или просто выводить название и версию программы (для эффекта), или, наконец, как ленту новостей программы. Конечно, здесь нужно знать меру, чтобы понапрасну не раздражать пользователя такой «рекламой», иначе может получиться обратный результат.

     Идея взята у Андрея Митина. Для начала определимся, что же мы будем выводить в строке. Как вариант – название и версия программы и напоминание о необходимости регистрации. Строки лучше объявить как глобальные константы и переменные в общем модуле. В этом случае, если Вы решите применить эффект бегущей строки в нескольких формах, то для изменения текста строки достаточно будет изменить значения констант.

     Пример реализации интерфейса регистрации программы уже рассматривался ранее. Добавлю лишь, что если Вы будете включать в строку напоминание о необходимости регистрации программы, то после ее проведения нужно будет либо убрать строку, либо сменить ее цвет с красного, например на синий.

     lab.ForeColor =16711680      ‘  синий цвет

     Для реализации эффекта напишем функцию с двумя параметрами

     Public Function StrAnime(Str As String, lbStr As Label)

     Str – строка, которую выводим
     lbStr – элемент (Label) на форме, в котором выводится строка

     Public Function StrAnime(Str As String, lbStr As Label)
     On Error GoTo Err_
     Const iTrim As Long = 100
   ' максимальная ширина строки (число знаков, включая пробелы)
     Dim sIntStr As String
     Dim i As Long, j As Long
          bStr.TextAlign = 1
     ' выравниваем строку
          sIntStr = Str
          Do While Len(sIntStr) < iTrim
   ' заполняем пробелами начало строки - до макс числа знаков <= 100
               sIntStr = " " & sIntStr
          Loop
          For i = Len(sIntStr) To 1 Step -1
               lbStr.Caption = Mid(sIntStr, i)
     ' здесь собственно и происходит "выдвижение" строки - показываем строку, начиная с последнего символа
               DoEvents    ' передаем управление системе
               j = 1
               Do While j < 1500000
    ' а здесь просто мотыляем счетчик - вариант временной задержки процесса
                    j = j + 1
               Loop
          Next i
          For i = 1 To Len(sIntStr)
   ' строка выползла, теперь ее таким же образом надо убрать
               lbStr.Caption = String(i, " ") & Mid(sIntStr, 1, Len(sIntStr) - i)  ' убираем строку - отсекаем символы
               DoEvents    ' передаем управление системе
               j = 1
               Do While j < 1500000
    ' мотыляем счетчик
                    j = j + 1
               Loop
          Next i
     Exit_:
          Exit Function
     Err_:
          Resume Exit_
     End Function

     Функцию сделали, теперь ее надо запустить. Используем свойство формы – Таймер. Интервал таймера поставим например 500. И вставим процедуру:

     Private Sub Form_Timer()
     On Error GoTo Err_
          Do While True
               lab.ForeColor = 0
               StrAnime NomWers, Me.lab
               lab.ForeColor = 255
               StrAnime StrEnabled, Me.lab
          Loop
     Err_:
          Exit Sub
     End Sub

     Если Вы решите применять рассмотренный эффект, то учтите, что он в какой то мере загружает систему во время «временной задержки» - ведь приходится гонять циклы накрутки. Так же и скорость движения строки зависит от производительности системы: если машина считает быстро, то и строка будет так же летать.

Выпуск 64. Создание установочного дистрибутива программы

Данная статья ориентирована на начинающих разработчиков Access, желающих более углубленно изучить возможности программирования в Access и сделать свои приложения более профессиональными.

Автор. Парусников Алексей

Создание установочного дистрибутива программы.

     Если Вы решили заняться распространением своих программ, то без установочного дистрибутива не обойтись. В настоящее время практически все программы имеют инсталлятор, обычно он называется Setup.exe. В этой статье мы рассмотрим на примере, как собрать инсталлятор для приложения Access и разберем некоторые особенности, которые необходимо при этом знать.

     Как уже говорилось ранее, Access не позволяет сделать исполняемый файл, способный работать без Access. Но в то же время, Microsoft предлагает для решения проблемы воспользоваться пакетом Microsoft Office Developer, в состав которого входит и лицензия на распространение программы Microsoft Access runtime. Программа Microsoft Access runtime – это версия Access, которая позволяет пользователям выполнять, но не модифицировать приложение Access. Интересно, что полную версию Access можно запустить в runtime – режиме, задав в командной строке ключ /runtime. Например, создайте на рабочем столе ярлык, кликнете по нему правой кнопкой мыши, в появившемся диалоговом окне в поле объект напишите примерно так: (это для Office 2000 – XP, а для 2003 нужно будет исправить вместо Office10 - Office11)

     "C:\Program Files\Microsoft Office\Office10\MSACCESS.EXE" "D: \Базы\Моя База.mdb"/runtime

а в поле «Рабочая папка»:

     "D: \ Базы"

     Теперь запустим приложение через этот ярлык. Откроется окно проекта Access, но ярлыка Access, а так же стандартных панелей инструментов уже там не будет. Это и есть runtime – режим.

     Для начинающих разработчиков распространение приложений Access через пакет Microsoft Office Developer вряд ли приемлемо. Ведь он стоит денег, и не малых. Мы рассмотрим другой способ, при помощи бесплатного инсталлятора Inno Setup.
Вообще, есть конечно и другие как платные, например InstallShield, так и бесплатные инсталляторы. Различаются они по удобству работы, размеру создаваемого дитсрибутива.
     Inno Setup – свободно распространяемый инсталлятор для программ Windows. Английские версии появились ещё в 1997, теперь  Inno Setup переводится на несколько языков, а инсталляторы может создавать более чем на 20 языках. Inno Setup превосходит многие коммерческие инсталляторы по возможностям, стабильности и размеру создаваемых файлов.

     Итак, рассмотрим задачи, которые нужно решить (определим только минимальные). Наш инсталлятор должен сделать следующее:

  1. Распаковать файлы в нужные места
  2. Создать папку в каталоге программы (папка «Коп» - для хранения резервных копий базы)
  3. Создать меню запуска приложения в Пуск – Все программы, а так же иконку на рабочем столе

     Это необходимый минимум. Но, разумеется, это далеко не все возможности Inno Setup. Ведь не зря его используют многие разработчики. Но в данной статье я ограничусь только этим, желающие глубже изучить возможности программы могут обратиться к справочной системе. В Интернет есть множество ссылок как на программу, так и на переводы справки. Например, Inno Setup 5.1.6. и справку к нему Вы можете скачать здесь… Английский сайт программы http://www.innosetup.com

     Особенность создания инсталлятора в Inno Setup – это то, что инсталляторы создаются при помощи скриптов - простых текстовых файлов ASCII, напоминающих .INI файлы. Скрипты редактировать легче, чем, например, работать с интерфейсом Installshield. Скрипты имеют расширение ".iss" (inno setup script). В нём указываются все параметры инсталлятора, и при установке, программа ассоциирует себя с этими файлами.

     Для начала попробуйте поэкспериментировать, создавая инсталлятор при помощи мастера, а затем изучая структуру полученного скрипта. В принципе, я думаю нет нужды подробно описывать, что где нажимать. Inno Setup настолько прост в освоении, что без проблем изучается, что называется «методом научного тыка». Вот например скрипт инсталятора, который делает определенные ранее задачи (все файлы дистрибутива находятся в каталоге D:\Setup.)

[Setup]
AppName=Моя программа
AppVerName=Моя программа. Версия 1.0.
AppPublisher=MyProgram, Inc.
AppPublisherURL=http://MyMySoft.ru/
AppSupportURL=http://MyMySoft.ru/
AppUpdatesURL=http://MyMySoft.ru/
DefaultDirName={pf}\MyProgram
DisableDirPage=no
DefaultGroupName=Моя программа
DisableProgramGroupPage=yes
LicenseFile=D:\Setup\license.txt
InfoAfterFile=D:\Setup\readme.txt
AlwaysCreateUninstallIcon=yes

[Tasks]
Name: "desktopicon"; Description: "Создать ярлык на &Рабочем столе"; GroupDescription: "Дополнительные ярлыки:"

[Files]
Source: "D:\Setup\Сервер.mdb"; DestDir: "{app}"; DestName: "Сервер.mdb";
Source: "D:\Setup\license.txt"; DestDir: "{app}";
Source: "D:\Setup\readme.txt"; DestDir: "{app}";
Source: "D:\Setup\Log.JPG"; DestDir: "{app}";
Source: "D:\Setup\Log.ico"; DestDir: "{app}";
Source: "D:\Setup\База.mdb"; DestDir: "{app}";

[INI]
Filename: "{app}\MyProg.url"; Section: "InternetShortcut"; Key: "URL"; String: "http://MyMySoft.ru/"

[Dirs]
Name: "{app}\Коп"

[Icons]
Name: "{group}\Моя программа"; Filename: "{app}\База.mdb" ;WorkingDir: "{app}";IconFilename:{app}\Log.ico
Name: "{group}\Сайт программы"; Filename: "{app}\MyProg.url"
Name: "{userdesktop}\Моя программа"; Filename: "{app}\База.mdb" ;WorkingDir: "{app}"; IconFilename:{app}\Log.ico;Tasks: desktopicon

Выпуск 63. Защита от несанкционированного копирования

Данная статья ориентирована на начинающих разработчиков Access, желающих более углубленно изучить возможности программирования в Access и сделать свои приложения более профессиональными.

Автор. Парусников Алексей

Защита от несанкционированного копирования

     Такая защита необходима, если Вы решите помешать кому либо сделать копию вашей программы. Это в первую очередь касается коммерческих разработок. Хотя в случае с Access приложениями это несколько спорный вопрос: а нужна ли кому то Ваша программа кроме Вас и иногда заказчику, для которого она делалась? Ведь даже в таких, казалось бы, стандартных приложениях типа «Складской учет» довольно часто приходится что то править под конкретного заказчика. В этом особенность распространения баз данных. Тем не менее, рассмотрим способ, затрудняющий копирование программы. Речь пойдет о регистрации.

     Чтобы нельзя было «воровать» программу, ее нужно привязать к конкретному компьютеру. Делается это при помощи специальных функций, определяющих уникальные параметры машины: номер винчестера, имя компьютера, процессор, имя пользователя и т. д. Общая схема распространения программ, используя сервис регистрации такая:

  1. Разработчик свободно распространяет дистрибутив программы. При установке на компьютере и первом запуске программа опрашивает компьютер и формирует уникальную контрольную сумму, которая называется "Регистрационный номер". Затем программа осуществляет преобразование регистрационного номера в "регистрационный ключ".
  2. "Регистрационный номер" предъявляется пользователю, а в ответ пользователь должен ввести "регистрационный ключ", который программа сравнит со своим.
  3. Пользователь должен связаться с разработчиком и сообщить "регистрационный номер" программы.
  4. Разработчик должен (запустив спец.процедуру регистрации) сообщить пользователю "регистрационный ключ".
  5. Пользователь вводит "регистрационный ключ". Если он правильный, то программа запоминает его и при дальнейших запусках не опрашивает пользователя.

     Такая схема позволяет сделать очень удобный сервис: сначала пользователь скачивает демо-версию программы, а затем, если она ему понравится, регистрирует ее и получает полнофункциональную версию.

     В демо-режиме программу нужно в чем то ограничить. Для баз данных это обычно ограничение по количеству записей, или невозможность распечатки какого либо важного отчета. Реализуется это при помощи функции, которая запускается, например, при попытке распечатать отчет, и если программа не зарегистрирована, блокирует печать. То же и в случае с ограничением количества записей: если на событие формы «после обновления» повесить процедуру, проверяющую регистрацию и считающую максимальное количество записей в данной таблице (источник данных формы), то можно сделать условие – если записей больше чем можно, то свойству формы «Разрешить добавление» присвоить False.

     Form.AllowAdditions = False

     Подобное ограничение реализовано в примере. Итак, схема такая:

  1. Через макрос AutoExec запускаем функцию SetReferences (), которая в свою очередь запускает функцию isLicense, проверяющую регистрацию. Затем считывается номер винчестера, шифруется (fShifrDrv) и записывается в поле SystBase служебной таблицы tAdminCop.
  2. В этом же макросе после запуска функции следует запуск стартовой формы frmStart. А вот в ней, при событии «Открытие» происходит сравнение номера винчестера с тем, что хранится в таблице. Совпадают – хорошо, нет – выход из приложения. Подобную процедуру можно повесить и на другие «важные» формы.
  3. Если номер винчестера правильный, приложение открывается. Если isLicense=True, то полнофункциональный режим, иначе – демо.
  4. Для регистрации программы (переход в полнофункциональный режим) служит функция RegKluch. Она шифрует регистрационный номер, сформированный программой. У разработчика должен быть «генератор» - программа с аналогичной функцией. Пользователь присылает разработчику регистрационный номер, разработчик запускает генератор, вводит номер в поле «№ версии», ставит курсор в поле «Ключ» - и соответственно получает его (на событие «фокус в поле» стоит процедура RegKluch). Затем он отсылает ключ пользователю.
  5. Пользователь вводит ключ в поле формы регистрации, жмет «Зарегистрировать», и программа переходит в полноценную версию.

     В прилагаемом примере показана только привязка к номеру винчестера. Однако, если пользователь установит другой и запросит заново пройти регистрацию? А вдруг, он врет, и на самом деле его попросил знакомый, установивший Вашу программу и желающий «на халяву» ей воспользоваться? Поэтому, данная система регистрации не отрицает, а, наоборот, требует наличия всех остальных средств защиты: администрирование, шифрование и MDE-интерфейс. Если, например, при формировании регистрационного номера учитывается много констант (например, имя компьютера, имя пользователя, название процессора и т.д.), то можно регистрационный номер составлять из частей. Например, цифры 1 – 4  - это имя компьютера, 5 – 9 – это номер винчестера и т. д. Можно конечно и более хитро, тут полная свобода творчества. Теперь, если Вам скажут, что поменяли винчестер, проверьте, остались ли прежними имя компьютера, имя пользователя, версия BIOS и т. д. Если все изменилось – стало быть, Вас обманывают (а может и вправду, поменяли все «железо»). Но, как известно, железо не меняют каждую неделю, и единичным случаям можно и поверить.

     Теперь испытаем:

     Запускаем приложение. На стартовой форме появился регистрационный номер, стало быть, считали и зашифровали номер винчестера. Так же видно, что программа не зарегистрирована. Об этом сообщает надпись красного цвета. Жмем на кнопку «Открыть». На появившейся форме видим предупреждение о максимальном количестве записей – 10. Проверяем: вводим новые записи, и на десятой добавление закрывается.
Теперь попробуем зарегистрировать программу. Открываем приложение «Генератор». Копируем из поля «Рег. номер» в буфер значение и вставляем его в соответствующее поле формы – генератора. При переходе на поле «Ключ» получаем его значение. Копируем его в буфер.
Теперь на стартовой форме приложения жмем кнопку «Регистрация». В появившейся форме вставляем из буфера в поле значение ключа, жмем «Зарегистрировать». Все, программа готова к полноценной работе. Чтобы убедится в этом, пробуем ввести записей в табличную форму больше 10.


Ответы на вопросы


Вопрос 1. Подскажите, пожалуйста, в отчетах Access 2000 постоянно слетают настройки поля... становятся стандартными (24,4) и страницы становятся с альбомной на книжную... как быть ???

Ответ. Снять в Сервис - Параметры - Общие - Отслеживать автозамену имен флажок или установить сервис пак

Вопрос 2. Добрый день!
Помогите разобраться Есть форма (DEP_DOSROCHNO) в ней подчиненная (DEP_DOSROCHNO_1), на основной форме кнопка : код следующий:
[Forms]![DEP_DOSROCHNO_1]![KILKIST_DNIV] = DateDiff("d", [Forms]![DEP_DOSROCHNO_1]![DATA_DU], Now) Но подчененную форму выдает ошибку - "НЕ УДАЕТСЯ НАЙТИ ФОРМУ" - может из за того что подчиненная форма находится на вкладке ???

  Ответ. Forms![DEP_DOSROCHNO]![DEP_DOSROCHNO_1].Form![KILKIST_DNIV]
Вопрос 3. Добрый день, Admin!
В основной и в подчиненной форме имеются по кнопке. Эти кнопки выполняют одинаковые команды.
Возможно, команды этих кнопок записать в общем модуле? Как будет выглядеть ссылка на этот модуль?
  Ответ. Public Function - описывают не в классе формы, а во внешнем модуле.

Вопрос 4. Имеется класс для работы с деревом Treeview. Когда открывается одна форма с деревом - все работает нормально. Но когда открывается еще одна форма, в которой также есть дерево и которая использует тот же класс, то возникает ошибка: "Введенное выражение содержит недопустимую ссылку на свойство "|".(№2147024809)". В чем причина ошибки и как ее устранить? Спасибо.

  Ответ.Желательно деревья размещать в подчиненной форме.
Вопрос 5. Хочу сделать такую штуку: источник ПолеСоСписком1 - запрос, где есть ссылка на поле формы типа Forms!Форма!ПолеСоСписком2. Т. е выбираем в ПолеСоСписком2 значение, и делаем ПолеСоСписком2.Requery. Все это работает в простой форме. А вот в табличной и ленточной - источник данных списка меняется для всего столбца. А мне надо для каждого поля каждой записи. Единственное, что придумал - в ленточной форме делать два поля одно поверх другого и проявлять их на GotFocus и LostFocus. А может кто чего умнее знает?
  Ответ. 1. Должны быть специальная форма вверху таблицы (или всплывать), которая настраивается в зависимости от выбранного поля.
                2. Смарт-тег можно вставить.
Вопрос 6. Добрый день, Admin! c помощью этой команды можно открыть новый документ Word: Call Shell("winword", 1).
Но какая нужна команда для открытия существующего файла "Договор.doc"?
  Ответ. Application.FollowHyperlink "Договор.doc"

Выпуск 62. Вход в базу данных через форму авторизации

Данная статья ориентирована на начинающих разработчиков Access, желающих более углубленно изучить возможности программирования в Access и сделать свои приложения более профессиональными.

Автор. Парусников Алексей

Вход в базу данных через форму авторизации 

     В этой статье рассмотрим один из способов защиты приложения Access. Речь пойдет о входе в базу через ввод пароля, или говоря иначе - авторизация. В Access предусмотрена возможность задать пароль на базу данных: Сервис – Защита – Задать пароль базы данных. Однако сам пароль хранится в системном реестре в незашифрованном виде, и чтобы открыть такую защищенную базу, достаточно лишь зайти в реестр и прочитать его. Мы же попробуем создать аналогичный интерфейс, но уже с зашифрованным паролем, причем сделаем так, чтобы при попытке открыть форму, если пользователю удалось войти в базу, минуя стартовую форму авторизации, база аварийно закрывалась.
Для этого нам понадобится в служебной таблице, например tAdminCop, завести поле Password, в котором будем хранить пароль, а так же модуль шифрования пароля – AdminPassword.
Схема авторизации следующая:

  1. При старте приложения запускается форма авторизации formAdmPassword, в которой вводим пароль
  2. Пароль считывается, шифруется и сравнивается с зашифрованным паролем в поле таблицы tAdminCop
  3. Если пароли совпадают, то открывается стартовая форма приложения, если нет – выход из приложения.

В модуле Constants задана константа ло��ического типа. При правильном пароле она принимает значение True, при ложном (по умолчанию) – соответственно False. В событие формы frmStart есть такая процедура:

     Private Sub Form_Open(Cancel As Integer)
          If flgEnabled = False Then
               DoCmd.Quit acPrompt
          End If
     End Sub

     Как видно, если flgEnabled = False, то, стало быть, выход из приложения. Таким образом, и делается невозможность открытия формы без ввода пароля. Если аналогичные процедуры повесить на остальные формы, отчеты, то единственной лазейкой для "врагов" останутся только таблицы, у которых, к сожалению, нет никаких событий, которые можно бы было перехватить. Единственной защитой для них будет скрытие окна приложения и установка защиты от Shift.
     Очевидно, что такая авторизация эффективна лишь в том случае, когда "врагам" нет хода к исходному коду модулей, иными словами база преобразована в формат .mde. Вообще, основа любой защиты приложений Access – это .mde формат. Действительно, вздумай Вы защищать подобным образом .mdb, любой мог бы просто открыть модуль Constants  и прописать там

     Public Const flgEnabled = True

     И все, никакой защиты.
     Защита шифрованием пароля будет зависеть от сложности шифрования. Я показал лишь простейший пример (модуль AdminPassword). Вообще, стоит поискать в Интернете, или попытаться придумать самому более хитрый (стойкий) алгоритм шифрования.
     Итак, проведем испытание:
     Запускаем приложение. Появляется форма авторизации. Вводим 123456, жмем ввод – открывается стартовая форма. Теперь попробуем открыть форму frmStart без ввода пароля. Запускаем приложение, удерживая Shift – открывается окно проекта Access. Пытаемся запустить frmStart – приложение закрывается.
     Если теперь добавить в нашу программу защиту от Shift, то приложение станет еще более «неприступным».

     Используя защиту от Shift и вход через форму авторизации, можно здорово попортить нервы всем любителям лазить куда не следует. Но допустим, Вы решите установить (продать) свою программу кому - либо. Как сделать так, чтобы он не смог распространять ее без Вашего ведома? Иными словами, как организовать сервис регистрации программы? Об этом в следующей статье...

Ответы на вопросы

Вопрос 1. Я любитель, так что, пожалуйста, не бейте ногами. В поиске не нашел. Необходимо из одной формы вызвать SUB другой, знаю что это можно сделать, но не помню синтаксис вызова. Что то вроде Call Forms![SubForm]!NAME_SUB, не могу ни вспомнить, ни подобрать методом тыка...
P. S. Перемещать все в модуль по определенным причинам не имеет смысла. Спасибо заранее.

Ответ. Forms![имя формы].имя процедуры Без всяких Call и т. п.

Вопрос 2. Добрый день!
Такая проблема есть подчиненная форма на основной кнопка с кодом для подчиненной формы. Код выполняется только для одной записи... как зделать чтоб для всех выбраных записей ???
  Ответ. Определить рекодсет (...Form.Recordset ) или его Clone (если не нужны зрительные эффекты) для подчиненной формы, далее пройтись по всем записям и провести для нужные изменения.
Вопрос 3. Добрый день
Подскажите ,пожалуйста, где можно подробнее почитать о выгрузке данных с Access в файл txt. Мне надо чтоб создавался фйл с данными например:
данные с поля 1 в промежутке с 1- 20 (длина столбца), Данные поля 2 в промежутке с 20-25.... и т.д.
  Ответ. Команда OutputTo выводит данные в текстовый формат

Вопрос 4. Добрый день
Подскажите как быть... Необходим запрос на выборку сумы "двойной с плавающей точкой" но он упорно отказывается выбирать !!!
Может необходимо как-то по другому ???
("SELECT * FROM [Oplata_MVKV_EXPORT] WHERE [SumaOplati]=" & Me.MySpisok& " ")
MySpisok - поле со списком ... в котором есть сума 100,30 и просто 100,00 где выбираем 100,00 то все работает где 100,30 ОШИБКА
Подскажите как разрешить проблему

  Ответ. Надо изменить точку: replace(Me.MySpisok,",",".") или replace(Me.MySpisok,".",",")
Вопрос 5. Как скопировать базу данных с Microsoft SQL Server 2005 на 2000
  Ответ. Когда копируются данные с 2000 сервера на 2005 проблем практически не возникает. Обратный процесс копированием невозможен, т.к. версии баз несовместимы. Вариант решения проблемы без репликаций.
1. Создайте пустую базу SQL 2000. В нее будем копировать данные из SQL 2005.
2. Откройте Microsoft SQL Server Management Studio и выберите базу данных.
3.Правой кнопкой выполните задачу создания скриптов: Tasks-Generate Scripts ...
4. Выберите флажок Script all objects in the selected database. Нажмите Next>
5. Установите в настройках скрипты версии SQL Server 2000. Нажмите Next>
6. Выберите Script to file. Нажмите Next>
7. Нажмите Finish и Close
Закройте менеджер и Microsoft Visual Studio
1. Создайте новый Business Intelligence Project - > Integration Services Project
2. Добавьте Execute T-SQL Statement Task мышкой из группы Maintence Plan Task
3. Правой кнопкой на поле Connection Managers выберите New ADO.net connection и New File Connection.
4. Выполните задачу по добавлению данных (правая кнопка)