如何使用Windows身份验证从Python中的另一个域的Windows工作站连接到MS SQL服务器

And*_*hev 7 python sql-server odbc pyodbc freetds

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

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)
Run Code Online (Sandbox Code Playgroud)

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

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)")
Run Code Online (Sandbox Code Playgroud)

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

使用驱动程序创建User DSNin 失败,并出现上述相同的错误.ODBC Data Source AdministratorSQL Server

有没有办法让这项工作?

同时我FreeTDShttp://sourceforge.net/projects/freetdswindows/安装了Windows驱动程序,使用tsql实用程序的连接测试确实有效:

tsql -S sql.my-domain.local -U my-domain.local\testuser -P password
Run Code Online (Sandbox Code Playgroud)

FreeTDS司机不在ODBC Data Source Administrator.FreeTDS驱动程序传统上使用unixODBC.是否可以在Windows环境中使用此驱动程序pyodbc

更新:

事实证明,FreeTDS上面提到的二进制文件也包括在内unixODBC.配置freetds.conf,odbc.iniodbcinst.ini作出类似描述,例如,在这里.但在这一点上,我不知道如何pyodbc知道FreeTDS驱动程序存在.事实上,与FreeTDS驱动程序的连接尝试失败并出现以下错误:

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

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

ODBC数据源管理员截图

有两种方法可以向前推进.第一种选择是ODBC Data Source Administrator了解FreeTDS驱动程序.为了实现这一点,需要在HKEY_LOCAL_MACHINE\SOFTWARE\ODBC\ODBCINST.INI\ODBC Drivers具有名称FreeTDS和值的注册表项中创建新值Installed.然后FreeTDS创建一个新密钥,HKEY_LOCAL_MACHINE\SOFTWARE\ODBC\ODBCINST.INIFreeTDS在此注册表项中将驱动程序的设置设置为字符串值.

FreeTDS注册表设置

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

另一个选择是pyodbc使用另一个驱动程序管理器(unixODBC)而不是ODBC Data Source Administrator.不知道如何处理.

And*_*hev 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')
Run Code Online (Sandbox Code Playgroud)