2016-02-02 17 views
5

Sto cercando di connettersi a SQL server 2000 installato sul Windows server 2003 da Windows Server 2008 R2 utilizzando il modulo Python 3.4 e pyodbc. Questi server si trovano in diversi domini AD. L'autenticazione Windows only è abilitata sul server SQL e non posso cambiarla.Come utilizzare l'autenticazione di Windows per la connessione al server MS SQL da workstation Windows in un altro dominio con Python

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) 

Il collegamento sopra non riesce con il seguente errore:

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)") 

Ci sono alcune domande, ad esempio this one, suggerendo di aggiungere trusted_connection='yes' argomento pyodbc collegamento per il supporto di autenticazione di Windows, ma in questo caso non aiuta perché con questa opzione vengono utilizzate le credenziali locali e devo fornire esplicitamente le credenziali perché la workstation di origine si trova in un dominio AD diverso.

La creazione di in ODBC Data Source Administrator con il driver SQL Server non riesce con lo stesso errore sopra menzionato.

C'è un modo per farlo funzionare?

Nel frattempo ho installato FreeTDS driver Windows da http://sourceforge.net/projects/freetdswindows/ e test di connessione utilizzando tsql utility funziona:

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

Ma FreeTDS driver non è disponibile in ODBC Data Source Administrator. Il driver FreeTDS viene tradizionalmente utilizzato con unixODBC. È possibile utilizzare questo driver in ambiente Windows con pyodbc?

Aggiornamento:

Si scopre FreeTDS binari di cui sopra comprendono unixODBC pure. La configurazione di freetds.conf, odbc.ini e odbcinst.ini è stata effettuata come descritto, ad esempio here. Ma a questo punto non capisco come si supponga che pyodbc sappia che esiste il driver FreeTDS. E in effetti tentativo di connessione con FreeTDS driver non riesce con il seguente errore:

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

Pyodbc conosce solo i driver disponibili in ODBC Data Source Administrator:

ODBC Data Source Administrator screenshot

Ci sono 2 modi per andare avanti. La prima opzione è quella di rendere il ODBC Data Source Administrator consapevole del driver FreeTDS. Per ottenere questo è necessario creare un nuovo valore nella chiave di registro HKEY_LOCAL_MACHINE\SOFTWARE\ODBC\ODBCINST.INI\ODBC Drivers con nome FreeTDS e nel valore Installed. Quindi una nuova chiave FreeTDS viene creata in HKEY_LOCAL_MACHINE\SOFTWARE\ODBC\ODBCINST.INI e le impostazioni per il driver FreeTDS vengono impostate come valori stringa in questa chiave di registro.

FreeTDS registry settings

Dopo il completamento di questo driver procedimento FreeTDS è diventato disponibile in ODBC Data Source Administrator ma la connessione ancora non è riuscito.Tentativo di creare ODBC Data Source Administrator con ODBC Data Source Administrator con FreeTDS non riuscito con il codice di errore 193 causato dall'incompatibilità di 642 ODBC Data Source Administrator e dalla versione a 32 bit FreeTDS. Non ho una versione a 64 bit di FreeTDS disponibile. Potenzialmente potrebbe essere possibile compilarlo dalla fonte.

Un'altra opzione è quella di rendere pyodbc un altro gestore di driver (unixODBC) anziché ODBC Data Source Administrator. Non so come affrontarlo ancora.

risposta

2

Ho finito per utilizzare pymssql versione 2.1.3 installata con una ruota ottenuta da http://www.lfd.uci.edu/~gohlke/pythonlibs/#pymssql. Ha incluso FreeTDS e ha funzionato immediatamente fuori dalla scatola:

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') 
Problemi correlati