Сохранить пароль для подключения ODBC к серверу MS SQL из MS Access 2007

Я отвечаю за перенос старого проекта Access 2007 на MS SQL Server 2008 Express. Первый этап - переместить все данные из базы данных MS Access на сервер SQL, сохраняя формы и отчеты Access на клиенте.

Итак, данные перемещены, пользователь SQL-сервера (для доступа только к этой конкретной базе данных) создан, а таблицы связаны с базой данных Access через соединение ODBC. Однако есть одна неприятность, которую нужно как-то решить: Access регулярно запрашивает пароль пользователя при открытии базы данных Access.

Пользователи как на серверном, так и на клиентском ПК входят в систему на своих локальных машинах, т. Е. Их пользователи не проверяются на независимом сервере домена.

Я вижу, что есть несколько способов решить эту проблему:

  • 1) Сконфигурируйте интегрированную модель безопасности так, чтобы пользователь мог войти в систему, автоматически авторизовавшись под своим логином в Windows (т. Е. Использовать «доверенное соединение»). Я не уверен, как это можно сделать, учитывая, что серверный компьютер не распознает пользователя с клиентского компьютера. Если я попытаюсь сделать это сейчас, я получаю сообщение об ошибке, что пользователь подключается из ненадежного домена.
  • 2) Сохраните пароль пользователя SQL-сервера на стороне клиента. Однако я не уверен, что это возможно. Я знаю, что сохранение пароля в каком-то конфигурационном файле или хранение в скрытом виде в конфигурации приложения должно рассматриваться как снижение безопасности, но это приемлемо для данной настройки.
  • 3) Может быть, каким-то другим способом связать таблицы SQL-сервера с Access?

person Passiday    schedule 01.02.2012    source источник


Ответы (5)


Очевидно, что лучшим решением является использование безопасности Windows.

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

  1. скопируйте строку подключения одной из ваших таблиц
  2. создать сквозные запросы «ptqConnect» и ввести в него любой быстрый оператор SQL, например SELECT 1
  3. вставьте строку подключения в свойство PTQ Connect и убедитесь, что вы добавили в нее PWD=something;.
  4. в процедуре запуска вашего приложения убедитесь, что вы вызываете этот PTQ. Что-то вроде DCount("*", "ptqConnect") подойдет.

Вот и все. Поскольку Access запоминает открытые соединения, пока вы не закроете его, даже если вы закроете базу данных, другие ваши таблицы теперь будут открываться без каких-либо проблем, даже если в связанных таблицах не хранится пароль. Строка подключения.
Если вы не хотите предоставив строку подключения, которая включает PWD, вы также можете инициировать подключение из VBA и скрыть код, доставив MDE или просто защищая код паролем.

Вы можете найти объяснение такого поведения здесь.

person Patrick Honorez    schedule 26.02.2014
comment
Это действительно лучшее решение. прелесть в том, что вам даже не нужно указывать пользователь + пароль в строке подключения. Небольшое окно входа в систему при запуске, выполните небольшой проход, и PRESTO - все связанные таблицы теперь работают. Таким образом, даже не требуется повторная привязка таблицы. Конечно, соединение без DSN и некоторый код связывания таблиц требуются для первой ссылки или если нужно переключаться между тестовым и производственным сервером. - person Albert D. Kallal; 27.02.2014
comment
Я должен добавить, что на шаге 3 в вашем ответе вы должны указать также параметр UID, а не только PWD. Таблицы, связанные с ODBC, не хранят одновременно UID и PWD, поэтому они должны быть предоставлены кодом VBA, иначе пользователь столкнется с диалоговым окном входа в SQL Server. - person Passiday; 15.08.2016

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

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

Изменить. Поскольку ваш вариант № 2 приемлем, вы можете просто сохранить uid и pwd в строках подключения для таблиц, связанных с ODBC.

Вот пример, скопированный с connectionstrings.com

Driver={SQL Server Native Client 10.0};
Server=myServerAddress;
Database=myDataBase;
Uid=myUsername;Pwd=myPassword;

Я разделяю однострочную строку для отображения в браузере. Вам также необходимо определить, на какую таблицу указывает каждая из ссылок; изучите текущие строки подключения ссылки, чтобы увидеть, как это делается.

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

person HansUp    schedule 01.02.2012
comment
Это хороший совет, но пока, скорее всего, мне придется сменить пароль на один символ. Им кажется, что настройка центрального сервера домена - слишком сложная задача, чтобы можно было просто использовать данные SQL-сервера из приложения Access на другом ПК. И я склонен согласиться, в конце концов, у меня есть полный контроль над привилегиями этого небезопасного пользователя SQL-сервера, и соединение также может быть ограничено локальным брандмауэром на сервере. - person Passiday; 02.02.2012
comment
Проблема с брандмауэром перешла мне в голову. Если брандмауэр разрешает соединения с компьютера Боба с SQL Server, как он может узнать, что за компьютером Боба сидит Боб, а не какой-то подозрительный персонаж, который сел, когда Боба неожиданно вызвали и он забыл выйти из своего сеанса Windows, или закрой? - person HansUp; 02.02.2012
comment
Нет, я предполагал, что вы изначально думали о каком-то темном персонаже, использующем другой компьютер в локальной сети. Конечно, упомянутый вами сценарий представляет собой потенциальный риск, но, опять же, у компании есть более серьезная проблема, если подозрительные персонажи подкрадываются к компьютерам оставленных без присмотра пользователей. - person Passiday; 02.02.2012
comment
Я проверил предложенную вами строку подключения, и оказалось, что Access 2007 не хранит параметры uid и pwd свойства строки подключения ODBC связанной таблицы. Я могу их настроить, но когда я читаю свойство, эти параметры удаляются. Итак, я оказываюсь в еще более плачевном состоянии, когда пользователю предлагается ввести и имя пользователя, и пароль, и теперь это происходит не только при запуске приложения, но и при каждом извлечении набора записей, когда бы это ни происходило. Если строка подключения относится к определенному DSN, то пароль сохраняется в памяти до конца сеанса приложения. - person Passiday; 02.02.2012

У меня была эта проблема с Access 2010, подключенным к SQL Azure, но это было очень просто. При связывании таблиц есть опция флажка для каждой таблицы, чтобы сохранить пароль.

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

person Andrew Mogford    schedule 26.11.2015
comment
У меня нет флажка для сохранения пароля. И когда я пытаюсь обновить строку подключения вручную (TableDef.Connect = connectionString), кажется, что параметр pwd игнорируется. - person Christine; 03.03.2017

Просто столкнулся с этой проблемой при удаленном подключении к моему серверу sql на рабочем месте с помощью Access. У меня есть Access 2013, но я не думаю, что он внес какие-либо изменения в что-то настолько простое, как соединение ODBC с 2010 года. Поскольку это не доверенное соединение, да, вам придется входить на сервер каждый раз, когда вы подключаетесь к база данных. Это просто базовая безопасность; Не могу представить, зачем вам когда-либо нужно, чтобы приложение просто беспрепятственно подключалось из ненадежной сети. Итак, я ожидаю, что мне придется войти в систему при открытии базы данных.

Однако что сводило меня с ума, так это то, что каждый раз, когда я пытался открыть таблицу, меня спрашивали пароль, и не один раз, а дважды, и я должен использовать пароль из 13 символов, который был сгенерирован случайным образом при создании! Так что, разумеется, это было совершенно неприемлемо.

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

Но использование db в Access в качестве локального файла означает, что я внимательно следил за именами DSN-подключений. Пока они абсолютно идентичны на всех компьютерах, это прекрасно работает. Итак, если мой DSN был назван «ProductsDBIII», когда я создавал его на работе в инструменте ODBC32 Windows, то мне нужно использовать это же имя при создании его дома. Фактическая строка подключения будет другой, но Access это не волнует. Однако вот в чем уловка: когда я впервые использую БД из дома, например, после рабочего дня, мне нужно обновить соединения в диспетчере связанных таблиц Access. Просто отметьте нужные таблицы / представления или «Отметьте все» и вперед. Access установит соединение - вероятно, предложит вам войти в систему - а затем быстро обновит строковое поле «connect» в таблице MSysObjects, потому что они будут другими, по крайней мере, при переключении с доверенного доступа.

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

Надеюсь, это кому-то поможет.

Джим

person user3091705    schedule 21.02.2014

Повторное использование Passthrough QAuery для установки соединения ODBC.

Форма, указанная как форма запуска в параметрах базы данных, будет запущена ПЕРЕД autoexec. Таким образом, эта форма не может / не должна цитировать связанные таблицы или не указывать их; и установите форму в autoexec.

В противном случае вам все равно будет предложено ввести pwd для подключения ODBC.

Типичный сценарий проблемы - использование формы Switchboard с таблицей в связанной базе данных.

person Ian Fry    schedule 15.12.2014