Подключение к MS SQL Server с использованием Python в Linux с «учетными данными Windows»

StackOverflow https://stackoverflow.com/questions/539430

Вопрос

Есть ли способ подключиться к базе данных 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 для такого способа передачи учетных данных.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top