如何使用Windows身份验证通过Python

时间:2016-02-02 15:48:59

标签: python sql-server odbc pyodbc freetds

我正在尝试使用SQL server 2000Windows server 2003模块从Windows Server 2008 R2连接到Python 3.4上安装的pyodbc。这些服务器位于不同的AD域中。在SQL Server上启用了Windows only身份验证,我无法更改。

drv = '{SQL server}'
svr = 'sql.my-domain.local'
usr = 'my-domain.local\testuser'
pwd = 'password'
db = 'testdb'
pyodbc.connect(driver=drv, server=svr, user=usr, password=pwd, database=db)

上述连接失败,出现以下错误:

pyodbc.Error: ('28000', "[28000] [Microsoft][ODBC SQL Server Driver][SQLServer] 
Login failed for user 'svx-iroot.local\\sqlexecutive'. 
Reason: Not associated with a trusted SQL Server connection. (18452) (SQLDriverConnect)")

有一些问题,例如this one,建议将trusted_connection='yes'参数添加到pyodbc连接以支持Windows身份验证,但在这种情况下它没有帮助,因为使用此选项本地使用凭据,我需要明确提供凭据,因为发起工作站位于不同的AD域中。

使用User DSN驱动程序在ODBC Data Source Administrator中创建SQL Server失败,并出现上述错误。

有没有办法让这项工作?

同时我从http://sourceforge.net/projects/freetdswindows/为Windows安装了FreeTDS驱动程序,使用tsql实用程序进行连接测试确实有效:

tsql -S sql.my-domain.local -U my-domain.local\testuser -P password

FreeTDS中没有ODBC Data Source Administrator驱动程序。 FreeTDS驱动程序传统上与unixODBC一起使用。是否可以在Windows环境中使用此驱动程序pyodbc

更新

上面提到的FreeTDS二进制文件也包括unixODBCfreetds.confodbc.iniodbcinst.ini的配置与所描述的相同,例如,here。但是在这一点上,我并不了解pyodbc应该知道FreeTDS驱动程序是否存在。事实上,与FreeTDS驱动程序的连接尝试失败,并出现以下错误:

pyodbc.Error: ('IM002', '[IM002] [Microsoft][ODBC Driver Manager] 
Data source name not found and no default driver specified (0) (SQLDriverConnect)')

Pyodbc只知道ODBC Data Source Administrator中可用的驱动程序:

ODBC Data Source Administrator screenshot

有两种方法可以向前推进。第一个选项是让ODBC Data Source Administrator知道FreeTDS驱动程序。为此,需要在名为HKEY_LOCAL_MACHINE\SOFTWARE\ODBC\ODBCINST.INI\ODBC Drivers且值为FreeTDS的注册表项Installed中创建新值。然后在FreeTDS中创建一个新密钥HKEY_LOCAL_MACHINE\SOFTWARE\ODBC\ODBCINST.INI,并将FreeTDS驱动程序的设置设置为此注册表项中的字符串值。

FreeTDS registry settings

完成此过程FreeTDS驱动程序在ODBC Data Source Administrator中可用,但连接仍然失败。尝试使用User DSNODBC Data Source Administrator中创建FreeTDS失败,错误代码193由64位ODBC Data Source Administrator和32位版本{{1}的不兼容性引起}。我没有64位版本的FreeTDS可用。可能有可能从源代码编译它。

另一个选择是让FreeTDS使用其他驱动程序管理器(pyodbc)而不是unixODBC。不知道如何接近它。

1 个答案:

答案 0 :(得分:3)

我最终使用pymssql版本2.1.3安装了从http://www.lfd.uci.edu/~gohlke/pythonlibs/#pymssql获得的轮子。它已包含FreeTDS,并且开箱即用:

import pymssql
conn = pymssql.connect(
  host=r'sql.my-domain.local',
  user=r'my-domain.local\testuser',
  password='password',
  database='testdb'
)
cursor = conn.cursor()
cursor.execute('SELECT * FROM testtable')
相关问题