Подключение к MS SQL Server с использованием Python на Linux с «Windows Credentials» - PullRequest
7 голосов
/ 12 февраля 2009

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

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

DOMAIN\username
DOMAIN\\username

или даже

UID=username;DOMAIN=domain

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

Ответы [ 5 ]

4 голосов
/ 05 июня 2009

Как указывалось в одном из комментариев, этот ответ на данный момент довольно устарел. Я регулярно и регулярно использую 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 ... существует множество возможностей для поломки файлов конфигурации, таких как .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 довольно сложно отследить / отладить. Перл, потому что это была довольно тонкая оболочка для CT-Lib, было намного проще.

3 голосов
/ 21 марта 2013

По крайней мере, с марта 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 и некоторые зависимости на странице загрузки .

1 голос
/ 29 апреля 2011

Возможно, слишком поздно, чтобы помочь вам - но я столкнулся с той же проблемой. На момент написания статьи последняя версия pyodbc позволяет мне входить с учетными данными Windows. Просто оставьте поле UID пустым в строке подключения, например:

cnxn = pyodbc.connect('DRIVER={SQL Server};SERVER=myserverinstance;DATABASE=mydatabase;UID=;PWD=mypassword')

Теперь это использует ваши существующие учетные данные Windows, когда вы вошли в систему ... не знаю, как указать какие-либо учетные данные домена arb windows ...

1 голос
/ 12 февраля 2009

Я давно этого не делал, но помню, что вся штука с 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 prorgram встречаются более неожиданные ошибки, чем в pyodbc), но его очень легко запустить и запустить в 64-битной Linux.

0 голосов
/ 12 февраля 2009

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

...