【问题标题】:Connecting to MS SQL Server using python on linux with 'Windows Credentials'使用带有“Windows 凭据”的 Linux 上的 python 连接到 MS SQL Server
【发布时间】:2010-10-07 01:38:21
【问题描述】:

有没有办法使用 Windows 域凭据在 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

无济于事。有什么想法吗?

【问题讨论】:

    标签: python sql-server pyodbc freetds unixodbc


    【解决方案1】:

    至少从 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 的一些依赖。

    【讨论】:

    • 这对我有用。关键是将广告域添加到用户名之前。
    • 添加TDS_Version=7.2;允许基于域的sql server从基于linux的操作系统登录到在windows上运行的sql server实例。
    • 我不得不将 FreeTDS 替换为 /usr/local/anaconda/lib/libtdsodbc.so,否则这行得通。
    【解决方案2】:

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

    在 2009 年初,我和一位同事设法使用 GSSAPI(Kerberos 凭据)通过与特定版本的 MIT kerberos 库链接的 FreeTDS 构建,使用 DBB::Perl 从 Solaris 10 连接到 SQL Server 2005 实例。诀窍是——这有点难以置信,但我已经通过查看 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 顶部的一个非常薄的包装器,所以更容易上手。

    【讨论】:

    • 可以肯定,这是一个史诗般的故事,但它现在的误导性太强,以至于当前的事态不能成为最高和公认的答案。如果您在免责声明中进行编辑,请告诉我,我将删除我的反对票。
    【解决方案3】:

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

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

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

    【讨论】:

    • @tponthieux:是的,代码(至少在我的回答中)适用于 Linux。
    • @anbanm,如果你在连接字符串中指定密码,这个集成认证如何?
    • @Chetan - 也许我理解错了,但它不是集成身份验证,它只是能够使用现有用户凭据对 sql server 进行身份验证。
    【解决方案4】:

    我有一段时间没做过了,但我记得整个 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 程序中运行时遇到比 pyodbc 更多的意外错误),但在 64 位 Linux 上启动和运行非常容易。

    【讨论】:

    • 我已经使用该网站获取说明,它对 Windows 凭据登录没有帮助,尽管它为设置整个系统提供了很好的介绍。
    • 投反对票,因为这个答案没有明确解决每个问题的集成身份验证/“Windows 凭据”。
    【解决方案5】:

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

    【讨论】:

    • 看来这是目前唯一可行的方法。
    猜你喜欢
    • 2011-02-23
    • 1970-01-01
    • 2019-08-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多