Подключение к MS SQL Server с использованием Python в Linux с «учетными данными Windows»
-
22-08-2019 - |
Вопрос
Есть ли способ подключиться к базе данных MS SQL Server с помощью Python в Linux, используя учетные данные домена Windows?
Я могу прекрасно подключиться со своего компьютера с Windows, используя учетные данные Windows, но пытаюсь сделать то же самое с Linux-питона с помощью pyodbs + freetds + unixodbc.
>>import pyodbc
>>conn = pyodbc.connect("DRIVER={FreeTDS};SERVER=servername;UID=username;PWD=password;DATABASE=dbname")
приводит к этой ошибке:
class 'pyodbc.Error'>: ('28000', '[28000] [unixODBC][FreeTDS][SQL Server]Login incorrect. (20014) (SQLDriverConnectW)')
Я уверен, что пароль написан правильно, но я пробовал много разных комбинаций имени пользователя:
DOMAIN\username
DOMAIN\\username
или даже
UID=username;DOMAIN=domain
но безрезультатно.Есть идеи?
Решение
Как указано в одном из комментариев, этот ответ уже довольно устарел.Я регулярно и регулярно использую GSSAPI для аутентификации с Linux на SQL Server 2008 R2, но в основном с помощью менеджера EasySoft ODBC и (коммерческого) драйвера EasySoft ODBC SQL Server.
В начале 2009 года нам с коллегой удалось подключиться к экземпляру SQL Server 2005 из Solaris 10, используя GSSAPI (учетные данные Kerberos), используя DBB::Perl через сборку FreeTDS, связанную с определенной версией библиотек Kerberos MIT.Хитрость заключалась в том — и в это немного трудно поверить, но я проверил это, просмотрев исходный код FreeTDS — указать нулевая длина имя пользователя.Если длина строки user_name равна 0, код FreeTDS попытается использовать GSSAPI (если эта поддержка скомпилирована).Мне не удалось сделать это с помощью Python и pyodbc, поскольку я не мог придумать, как заставить ODBC передавать имя пользователя нулевой длины.
Здесь в перл-коде..существует множество возможностей для повреждения файлов конфигурации, таких как .freetds.conf и т. д.Кажется, я припоминаю, что главное слово должно было быть написано заглавными буквами, но мои записи, похоже, с этим не согласны.
$serverprincipal = 'MSSQLSvc/foo.bar.yourdomain.com:1433@YOURDOMAIN.COM'; $dbh = DBI->connect("dbi:Sybase:server=THESERVERNAME;kerberos=$serverprincipal", '', '');
Вам необходимо знать, как использовать утилиту setspn, чтобы заставить сервер SQL Server использовать соответствующее имя участника безопасности.
У меня нет никаких знаний о стороне Kerberos, потому что наша среда была настроена опытным гуру Kerberos и имеет такие причудливые вещи, как взаимное доверие, установленное между доменом AD, в котором работает SQL Server, и доменом Kerberos, который мой клиент вбегал.
Есть некоторый код http://code.google.com/p/libsqljdbc-auth/ который выполняет аутентификацию GSSAPI из Linux на SQL Server, но это только Java.Автор (который, кажется, знает свое дело) также внес аналогичный патч в проект jTDS, который работает с более поздними версиями Java со встроенным GSSAPI.
Итак, все части на месте, это просто большой запутанный беспорядок, пытающийся заставить их работать вместе.Я обнаружил, что интеграцию pyodbc в unixODBC и FreeTDS, odbc в TDS довольно сложно отслеживать/отлаживать.Perl, поскольку это была довольно тонкая оболочка поверх CT-Lib, было гораздо проще освоить.
Другие советы
По крайней мере, по состоянию на март 2013 года это работает с FreeTDS «из коробки».я уточнил Версия протокола TDS на всякий случай - не уверен, имеет ли это значение:
connStr = "DRIVER={{FreeTDS}};SERVER={0};PORT=1433;TDS_Version=7.2;UID={1}\\{2};PWD={3}".format(hostname, active_directory_domain, username, password)
Интегрированная аутентификация также поддерживается официальным драйвером Microsoft для Linux: http://msdn.microsoft.com/en-us/library/hh568450.aspx .Я не уверен, на скольких дистрибутивах Linux он действительно работает или какая часть исходного кода доступна.Они явно упоминают RHEL 5 и 6 и некоторые зависимости от страница загрузки.
Возможно, уже слишком поздно, чтобы вам помочь, но я столкнулся с той же проблемой.На момент написания последняя версия pyodbc позволяет мне входить в систему с учетными данными Windows.Просто оставьте поле UID пустым в строке подключения, например:
cnxn = pyodbc.connect('DRIVER={SQL Server};SERVER=myserverinstance;DATABASE=mydatabase;UID=;PWD=mypassword')
Теперь при входе в систему используются ваши существующие учетные данные Windows...не знаю, как указать учетные данные домена Windows arb...
Я давно этого не делал, но помню, что вся эта штука с unixodbc + FreeTDS + pyodbc была немного сложной.Однако это можно сделать, и после настройки это не так уж и сложно.
На этом сайте есть очень хорошие инструкции:http://www.pauldeden.com/2008/12/how-to-setup-pyodbc-to-connect-to-mssql.html (копия в архиве в веб-архиве)
Кроме того, по моему опыту, у pyodbc были проблемы с компиляцией/запуском на 64-битных машинах Linux.По этой причине мы в конечном итоге использовали ceODBC.ceODBC не так стабилен, как pyodbc (при работе в программе Python обнаружено больше неожиданных ошибок, чем в pyodbc), но его очень легко запустить в 64-разрядной версии Linux.
Я не верю, что вы сможете войти в учетную запись домена Windows таким образом.Вам необходимо настроить пользователя непосредственно в sql для такого способа передачи учетных данных.