При интеграции 1С с внешними базами данных Microsoft SQL Server разработчики нередко используют COM-объект ADODB.Connection. Если со стандартной авторизацией по логину и паролю SQL Server (SQL Server Authentication) сложностей обычно не возникает, то попытка переключиться на учетную запись домена Active Directory часто приводит к ошибке «Login failed for user». Проанализируем причину этой ошибки и подробно разберем, как правильно организовать доменное подключение.
Посмотрим на исходную попытку формирования строки соединения:
СтрокаСоединения = "Provider=SQLOLEDB;
|Data Source=" + ИмяСервера + ";
|Password='" + ПарольПользователя +"';
|User ID='" + ИмяПользователя +"';
|Initial Catalog=" + ИмяБазы;
Когда мы передаем параметры User ID и Password, OLE DB провайдер всегда интерпретирует это как попытку аутентификации средствами самого SQL Server (SQL Authentication). Даже если мы укажем имя пользователя в формате DOMAIN\Username, сервер баз данных не будет проверять пароль через контроллер домена Windows, а попытается найти локального SQL-пользователя с точно таким же именем. Так как доменного пользователя с паролем в базе данных SQL нет, сервер немедленно возвращает ошибку авторизации.
Технология Windows Authentication (NTLM или Kerberos) работает принципиально иначе: она не передает открытый пароль провайдеру, а использует существующий токен безопасности текущего процесса Windows. Следовательно, передавать логин и пароль в строке подключения нельзя — вместо этого необходимо включить режим доверительного соединения.
Разберем по шагам, как модифицировать код 1С для работы с доменной авторизацией:
User ID и Password из строки инициализации.Trusted_Connection=Yes; (или его аналог Integrated Security=SSPI;).//), так как они становятся частью самой строки подключения и приводят к синтаксической ошибке OLE DB парсера.Посмотрим на рабочий пример кода для платформы 1С:
ИмяСервера = "sql-server-main";
ИмяБазы = "ProductionDB";
СтрокаСоединения = "Provider=SQLOLEDB;"
+ "Data Source=" + ИмяСервера + ";"
+ "Initial Catalog=" + ИмяБазы + ";"
+ "Trusted_Connection=Yes;";
Попытка
Соединение = Новый COMОбъект("ADODB.Connection");
Соединение.ConnectionString = СтрокаСоединения;
Соединение.Open();
// Подключение успешно установлено, выполняем необходимые запросы
Соединение.Close();
Исключение
ВызватьИсключение "Не удалось подключиться к базе данных: " + ОписаниеОшибки();
КонецПопытки;
Рассмотрим критически важную деталь, от которой зависит успешность подключения. Поскольку мы используем доверенное соединение, SQL Server получает информацию о том пользователе, в контексте которого запущен процесс, исполняющий код 1С:
usr1cv8 или SYSTEM). Если служба запущена под локальным системным пользователем, а SQL Server расположен на отдельном сервере, доменная авторизация завершится ошибкой. В такой ситуации необходимо запускать службу сервера 1С под специальной доменной сервисной учетной записью и предоставлять права на SQL Server именно ей.Важное ограничение: Если вам требуется подключиться к базе под конкретным доменным пользователем, отличным от пользователя текущего запущенного процесса Windows, сделать это напрямую через параметры строки ADODB.Connection невозможно. В архитектуре Windows для этого требуется имперсонация потока через API-функции операционной системы (например, LogonUser), что требует привлечения внешних компонент.
Проанализируем используемый драйвер. Провайдер SQLOLEDB (Microsoft OLE DB Provider for SQL Server) входит в состав операционной системы Windows по умолчанию, но на сегодняшний день является устаревшим. Он не обеспечивает полноценную поддержку современных протоколов безопасности (таких как TLS 1.2 и TLS 1.3) при работе с новыми версиями MS SQL Server.
Для современной инфраструктуры рекомендуется использовать обновленный драйвер MSOLEDBSQL (Microsoft OLE DB Driver for SQL Server). Для этого его предварительно устанавливают на рабочий сервер или клиентскую машину, а строку подключения формируют следующим образом:
СтрокаСоединения = "Provider=MSOLEDBSQL;"
+ "Data Source=" + ИмяСервера + ";"
+ "Initial Catalog=" + ИмяБазы + ";"
+ "Integrated Security=SSPI;";
При проектировании обменов и прямых запросов к базам данных учитываем технические ограничения платформы 1С:Предприятие:
COMОбъект("ADODB.Connection") работает исключительно в среде Windows. Если кластер серверов 1С функционирует под управлением ОС Linux, создание COM-объекта вызовет фатальное исключение.Если настроить доменную аутентификацию в гетерогенной среде сложно или сервер 1С работает под Linux, рассмотрим альтернативные варианты архитектуры:
User ID и Password.