Отправляет email-рассылки с помощью сервиса Sendsay
  Все выпуски  

Microsoft Access - программирование и готовые решения


Выпуск 61. Материалы для начинающих (8 урок)

Подписка: "Access 2000 - программирование и готовые решения"
Дата:         31.01.2007
Автор:     Парусников Алексей
Сайт:        http://www.accessoft.ru под редакцией с http://www.leadersoft.ru/
Новые материалы: защита приложений
На сайте AccesSoft публикуются статьи, посвященые вопросам, связанным с разработкой и продвижением приложений Access. Вы так же можете ознакомиться с готовыми программами, получить исходный код, купить программу, связаться с автором для решения вопроса о доработке программы под Ваши требования.



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

Защита приложений Access от несанкционированного доступа.

     Часто возникает необходимость закрыть доступ пользователям к окну проекта Access.

Причины могут быть разные:

  1. Любопытные пользователи стали «лазить» по базе и удалили макрос или «отредактировали» запрос (такое возможно ведь и в случае c .mde)
  2. Вы решили продать свою программу. Чем меньше покупатель будет видеть не нужных ему элементов, тем лучше (см. п. 1)
  3.  Скрытие окна проекта позволяет сделать приложение более удобным в работе.

     Как правило, одним из признаков, что разработчик «шагнул» от начинающего к «продвинутому» чаще всего является скрытие окна приложения.
Простейшим вариантом решения проблемы может быть скрытие окна базы данных через стандартные настройки: Сервис – Параметры запуска – убрать галочку «окно базы данных». Однако, как уже говорилось в предыдущей статье, такую защиту столь же просто убрать, удерживая при запуске приложения Shift. В той же статье говорилось о неких «модулях», способных блокировать такую возможность. Познакомимся с одним из них.
     Для построения интерфейса защиты создадим два макроса: AutoExec, AutoKeys. С первым Вы уже знакомы по статье «Автолинковка и резервное копирование». Второй выполняет похожую роль – перехватывает нажатие клавиш на клавиатуре. Чтобы он их перехватывал, он должен называться AutoKeys (зарезервированное имя в Access).
     В макросе AutoExec дадим команду на запуск формы FrmStart, в макросе AutoKeys – формы ВклОткШифт. Причем форма ВклОткШифт будет запускаться при нажатии комбинации клавиш Ctrl + Q. Для этого в конструкторе зададим имя макроса - ^Q.
Зачем так мудрено? Дело в том, что если мы просто зададим запуск формы в Сервис – Параметры запуска, то при включении защиты от Shift будет открываться пустое окно Access. Мы закроем базу вообще для всех, в том числе и от себя! Для всякого замка должен быть ключ: им и выступает форма ВклОткШифт - через нее устанавливается и снимается защита. А если ее сделать скрытой (см. ниже) и запускать через макрос (комбинацию клавиш) – мы еще больше запутаем любопытных юзеров.
     Само включение происходит через свойство базы
          DBS.Properties("AllowBypassKey") = True (или False)
     В зависимости от значения пароля, введенного в поле формы «ВклОткШифт» этому свойству присваивается  True или False. Затем база закрывается (чтобы изменения вступили в силу)
     DoCmd.Quit acPrompt
     Итак, проведем испытание:
     Запускаем наше приложение, удерживая Shift – открывается стартовая форма, окно проекта закрыто. Жмем Ctrl + Q, вводим 1234, жмем «Ввод». База закрывается. Снова щелкаем по базе, удерживая Shift – открывается стартовая форма, окно проекта открыто! И так делаем, пока не надоест.
     А теперь по поводу «скрытый объект». Есть еще одна возможность заморочить пользователя. Дело в том, что в Access есть три варианта отображения объектов:

  • Нормальный режим (в окне базы данных не отображаются скрытые и системные объекты) установлен по умолчанию
  • Режим отображения скрытых объектов (в окне базы дынных не отображаются системные объекты)
  • Режим отображения системных объектов (отображаются все объекты)

      Системный объект – это встроенный объект базы данных, определенный как системный, например таблица "MSysIndexes", или системные объекты, определенные пользователем. Для определения системного объекта необходимо, что бы его имя начиналось с символов USys. Например, добавьте к названию формы, таблицы, отчета USys – и они тут же «исчезнут», станут скрытыми, но обращаться к ним из приложения можно так же, как обычно. Чтобы увидеть их, нужно сделать следующее: 
Сервис – Параметры – Вкладка вид. В группе Отображать выберите требуемый вариант – поставьте (уберите) галочку «Скрытые объекты», «Системные объекты» и т. д.
     Многих пользователей такая «защита» способна будет сбить с толку: даже сумев открыть приложение через Shift, они с удивлением обнаружат, что какой то формы или таблицы там нет, хотя при работе она видна. Но на профессионалов, конечно, такая уловка не подействует – разумеется, они знают о свойствах объектов базы данных. Но, если учесть, что большинство любопытных чаще всего бросают попытки «ковыряться», если у них не получилось с первого раза, то такая «защита» заслуживает внимания.
     Выводы:

  1. Защиту от Shift можно применять только при условии, что база преобразована в .mde. В противном случае ее легко обойти, сделав простой импорт всех объектов в новую базу. В .mde как известно без декомпиляции (взлома) невозможно сделать импорт общих модулей, форм и отчетов – самого ценного содержимого базы.
  2. Если вы разрабатываете приложения на своей работе, то обычно лучший способ защиты – поговорить «по душам» с пользователями (и с начальством). Защита от Shift будет служить подобно реечному замку на гараже – при желании легко вскрывается, но не будь его, гараж обокрали бы еще быстрее.
  3. Обычно защиту от Shift применяют в комплексе с другими методами: привязка к компьютеру, вход по паролю, шифрование данных  и т. д. Но об этом – в следующих статьях.

Как всегда, чтобы посмотреть, как все это работает, жмем на эту ссылку…


Ответы на вопросы
Вопрос 1. Добрый день! Подскажите, пожалуйста, необходимо экспортировать отчет как снимок, как прописать это в модуле без использования диалога с пользователем.
  Ответ. DoCmd.OutputTo acOutputReport, "Отчет1", acFormatSNP, "Отчет1.snp", True
Вопрос 2. Добрый день.
Подскажите пожалуста в форме в 1 поле текст при нажатие кнопки происходит процедура "Print" в файл значения поля 1. Создается определенный файл но сохранение в кодеровке WIN а надо DOS как быть ???
  Ответ. 1. Функция StrConv конвертирует данные строки в нужный формат.
                2. С другой стороны файл для печати должен открываться в бинарном виде, иначе будут потеряны "управляющие" сисмволы.
                3. Иногда самостоятельно создают таблицу для перекодировки символов.
Вопрос 3. Есть три таблицы Artikul, Prihod, Rashod. Нужен запрос вытаскивающий все артикулы из базы Artikul для которых нет записей в таблицах Prihod, Rashod. т.е. артикулы без проводок. Начал с простого запроса. Подскажите, почему не работает:
SELECT NAIM FROM ARTIKUL LEFT JOIN PRIHOD ON ARTIKUL![KOD] = PRIHOD![IND] WHERE PRIHOD![KOLVO] IS NULL
  Ответ. В таких запросах используется ключевое слово Exists для проверки записей в других таблицах. Изучите его применение.

Вопрос 4. Добрый день.
Подскажите как быть... В форме есть три поля 1 Числовое 2 Текстовое 3 результатирующие
мне необходимо сцепить эти два поля.. например если 1 = AG а второе 00001 то чтоб поле 3 = AG00001
Подскажите очень надо

  Ответ. В свойстве "Данные" третьего поля ввести =Поле1 & Поле2
Вопрос 5. Подскажите такую хитрость.
Есть форма с несколькими текстовыми полями, по нажатию кнопки значения из этих полей обрабатываются RUN SQL (запрос на добавление), после чего поля нужно очистить, чтобы дать возможность пользователю ввести новые значения.
Обычно пользуюсь вот этим:
For Each ctrl In Me
      If ctrl.ControlType = acTextBox Or ctrl.ControlType = acComboBox Or ctrl.ControlType = acCheckBox Then ctrl.Text = ""
End If

Но - в данном примере одно из полей таблицы носит свойство Requared, соответственно VBA ругается, что поле не может содержать NULL и вываливается в ошибку
Вопрос - можно ли программно очистить поле, имеющее свойство Requared?
  Ответ. Может так сделать ctrl.Text = Null
Вопрос 6. Напишите, пожалуйста, программу. Я заполняю листы прибытия иностранных граждан, около 50 человек в день, а бланк состоит из клеточек, в которые и нужно вписывать каждую букву, Лист формата А-4 с двух сторон. Можно сделать программу, которая бы автоматически расставляла эти буквы по клеточкам? Если это возможно, пишите на dochka19@rambler.ru. Ирина
  Источник. http://leadersoft.ru/russian/help/conference1/conf1.htm

В избранное