使用带有'Windows凭据'的Linux上的python连接到MS SQL Server

时间:2009-02-11 23:59:39

标签: python sql-server pyodbc freetds unixodbc

有没有办法使用Windows Domain Credentials在Linux上使用python连接到MS SQL Server数据库?

我可以使用Windows凭据在我的Windows机器上完美连接,但尝试使用pyodbs + freetds + unixodbc从linux python中做同样的事情

>>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 个答案:

答案 0 :(得分:4)

正如其中一条评论所指出的那样,这个答案现在已经过时了。我定期并定期使用GSSAPI从Linux到SQL Server 2008 R2进行身份验证,但主要使用EasySoft ODBC管理器和(商业)EasySoft ODBC SQL Server驱动程序。

2009年初,我和一位同事使用GSSAPI(Kerberos凭证)使用DBB :: Perl通过FreeTDS构建连接到特定版本的MIT kerberos库,从而连接到Solaris 10的SQL Server 2005实例。诀窍是 - 这有点难以置信,但我通过查看FreeTDS源代码验证了它 - 指定零长度 user_name。如果user_name字符串的长度为0,则FreeTDS代码将尝试使用GSSAPI(如果已编译该支持)。我无法通过Python和pyodbc这样做,因为我无法找到一种让ODBC传递零长度user_name的方法。

这里的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大师建立的,并且在SQL Server运行的AD域和之间建立了相互信任等奇特的东西。我的客户端正在运行的Kerberos域。

有一些代码http://code.google.com/p/libsqljdbc-auth/可以执行从Linux到SQL Server的GSSAPI身份验证,但它只是Java。作者(似乎知道他的东西)也为jTDS项目提供了类似的补丁,该项目与更新版本的Java一起使用,内置了GSSAPI。

所以这些碎片都在那里,这只是一个纠结的混乱,试图让他们一起工作。我发现unixODBC的pyodbc到FreeTDS odbc到TDS集成很难跟踪/调试。 perl的东西,因为它是一个非常薄的包装在CT-Lib的顶部更容易开始。

答案 1 :(得分:3)

截至2013年3月,这似乎与FreeTDS开箱即用。我指定了TDS protocol version以获得良好的衡量标准 - 不确定这是否有所不同:

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以及对download page的一些依赖。

答案 2 :(得分:1)

我有一段时间没有这样做,但我记得整个unixodbc + FreeTDS + pyodbc的事情有点棘手。但是,它可以完成,一旦设置就不那么难了。

本网站提供了非常好的指示: http://www.pauldeden.com/2008/12/how-to-setup-pyodbc-to-connect-to-mssql.html (archived copy on Web Archive)

另外,根据我的经验,pyodbc在64位Linux机器上编译/运行时出现问题。因此,我们最终使用了ceODBC。 ceodBC并不像pyodbc那么稳定(在python prorgram中运行时遇到比pyodbc更多的意外错误),但它很容易在Linux 64位上运行并运行。

答案 3 :(得分:1)

可能有点太晚了,无法帮助你 - 但我遇到了同样的问题。在撰写本文时,最新版本的pyodbc允许我使用Windows凭据登录。只需将UID字段留在连接字符串中,如下所示:

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

现在,当您登录时,这是使用您现有的Windows凭据...不确定如何指定任何arb Windows域凭据...

答案 4 :(得分:0)

我不相信您能够以这种方式登录Windows域帐户。您需要在sql中直接设置用户以获得这种传递凭据的方式。