9

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

我可以使用 Windows Credentials 从我的 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

无济于事。有任何想法吗?

4

5 回答 5

5

至少截至 2013 年 3 月,这似乎与 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 以及一些依赖项。

于 2013-03-21T15:34:02.530 回答
4

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

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

在 perl 代码中.. 有多种机会破坏 wrt 配置文件,例如 .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 项目提供了一个类似的补丁,该补丁适用于内置 GSSAPI 的更新版本的 Java。

所以碎片都在那里,试图让它们一起工作只是一个大杂烩。我发现 pyodbc 到 unixODBC 到 FreeTDS odbc 到 TDS 集成很难跟踪/调试。perl 的东西,因为它是 CT-Lib 顶部的一个非常薄的包装器,所以更容易上手。

于 2009-06-05T01:47:56.197 回答
1

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

该网站提供了非常好的说明: http: //www.pauldeden.com/2008/12/how-to-setup-pyodbc-to-connect-to-mssql.html(Web Archive 上的存档副本)

此外,根据我的经验,pyodbc 在 64 位 Linux 机器上编译/运行时遇到问题。因此,我们最终使用了 ceODBC。ceODBC 不如 pyodbc 稳定(在 python 程序中运行时遇到的意外错误比在 pyodbc 中更多),但在 64 位 Linux 上启动和运行非常容易。

于 2009-02-12T01:05:14.110 回答
1

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

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

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

于 2011-04-29T12:49:35.933 回答
0

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

于 2009-02-12T00:46:42.063 回答