Подключение к MS SQL Server с использованием python в linux с "учетными данными Windows"

есть ли способ подключиться к базе данных MS SQL Server с python в linux с использованием учетных данных домена Windows?

Я могу подключиться отлично с моей машины windows, используя учетные данные Windows, но пытаясь сделать то же самое с Linux python с 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)')

Я уверен, что пароль написан правильно, но я пробовал много разных комбинаций имя пользователя:

DOMAINusername
DOMAINusername

или даже

UID=username;DOMAIN=domain

безрезультатно. Есть идеи?

5 ответов


Как указано в одном из комментариев, этот ответ уже довольно устарел. Я регулярно и регулярно использую GSSAPI для аутентификации из Linux в SQL Server 2008 R2, но в основном с менеджером EasySoft ODBC и (коммерческим) драйвером EasySoft ODBC SQL Server.

в начале 2009 года коллеге и мне удалось подключиться к экземпляру SQL Server 2005 из Solaris 10 с помощью gssapi (учетные данные Kerberos) с помощью DBB:: Perl через сборку FreeTDS, связанную с определенным версия библиотек MIT kerberos. Трюк был - и в это немного трудно поверить, но я проверил его, просмотрев исходный код FreeTDS - чтобы указать нулевой длины имя_пользователя. Если длина строки user_name равна 0, то код FreeTDS попытается использовать GSSAPI (если эта поддержка была скомпилирована). Я не смог сделать это через Python и pyodbc, поскольку я не мог понять, как заставить ODBC передать нулевую длину имя пользователя.

здесь, в коде perl .. существует несколько возможностей для файлов конфигурации WRT breakage, таких как.freetds.conf etc. Кажется, я помню, что директор должен был быть в верхнем регистре, но мои заметки, похоже, не согласны с этим.

$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 при входе в систему... не знаете, как указать учетные данные домена ARB windows...


Я не делал этого некоторое время, но я помню, что вся вещь unixodbc + FreeTDS + pyodbc была немного сложной. Однако, это можно сделать и после установки это не так сложно.

этот сайт предоставляет очень хорошие инструкции: http://www.pauldeden.com/2008/12/how-to-setup-pyodbc-to-connect-to-mssql.html (архивная копия в веб-архиве)

кроме того, по моему опыту у pyodbc были проблемы с компиляцией/запуском на 64-битных машинах Linux. Из-за этого мы в конечном итоге используется ceODBC. ceODBC не так стабилен, как pyodbc (встречается больше неожиданных ошибок, чем в pyodbc при работе в python prorgram), но очень легко встать и работать на Linux 64 бит.


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