2016-02-02 20 views
5

próbuję połączyć się SQL server 2000 zainstalowanego na Windows server 2003 z Windows Server 2008 R2 użyciu Python 3.4 i pyodbc moduł. Te serwery znajdują się w różnych domenach AD. Windows only uwierzytelnianie jest włączone na serwerze SQL i nie mogę tego zmienić.Jak używać uwierzytelniania systemu Windows, aby połączyć się z serwerem MS SQL z okien stanowisku w innej domenie z Pythonem

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) 

powyżej połączenie nie powiedzie się z powodu następującego błędu:

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

Istnieje kilka pytań, na przykład this one, sugerując, aby dodać trusted_connection='yes' argument pyodbc połączenie do wspierania uwierzytelniania systemu Windows, ale w tym przypadku nie pomaga, ponieważ z tą opcją używane są lokalne poświadczenia i muszę jawnie podać referencje, ponieważ pochodząca stacja robocza znajduje się w innej domenie AD.

Utworzenie User DSN w ODBC Data Source Administrator z SQL Server powoduje błąd sterownika z tym samym błędem, o którym mowa powyżej.

Czy istnieje sposób, aby to zadziałało?

FreeTDS Tymczasem Zainstalowałem sterowniki dla Windows z http://sourceforge.net/projects/freetdswindows/ i test połączenia za pomocą tsql narzędzie działa:

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

Ale FreeTDS kierowca nie jest dostępny w ODBC Data Source Administrator. Sterownik jest zwykle używany z unixODBC. Czy jest możliwe użycie tego sterownika w środowisku Windows z pyodbc?

Aktualizacja:

Okazuje się FreeTDS binarne wymienione powyżej obejmują unixODBC również. Konfiguracja freetds.conf, odbc.ini i odbcinst.ini została wykonana tak, jak opisano, na przykład, here. Ale w tym momencie nie rozumiem, jak powinienem wiedzieć, że istnieje sterownik . I rzeczywiście próba połączenia z FreeTDS kierowcy nie powiedzie się z powodu następującego błędu:

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

Pyodbc wie tylko o kierowców dostępnych w ODBC Data Source Administrator:

ODBC Data Source Administrator screenshot

Istnieją 2 sposoby, aby ruszyć do przodu. Pierwszą opcją jest powiadomienie ODBC Data Source Administrator o sterowniku FreeTDS. Aby to osiągnąć, należy utworzyć nową wartość w kluczu rejestru HKEY_LOCAL_MACHINE\SOFTWARE\ODBC\ODBCINST.INI\ODBC Drivers o nazwie FreeTDS i wartości Installed. Następnie utworzono nowy klucz FreeTDS w ustawieniach HKEY_LOCAL_MACHINE\SOFTWARE\ODBC\ODBCINST.INI, a ustawienia dla sterownika FreeTDS są ustawiane jako wartości łańcuchowe w tym kluczu rejestru.

FreeTDS registry settings

Po zakończeniu tej procedury FreeTDS sterownik stał się dostępny w ODBC Data Source Administrator ale gra nadal nie powiodło się.Próba utworzenia User DSN w ODBC Data Source Administrator z FreeTDS kończy się niepowodzeniem z kodem błędu 193, który jest spowodowany niekompatybilnością 64-bitowej ODBC Data Source Administrator i 32-bitowej wersji FreeTDS. Nie mam dostępnej 64-bitowej wersji FreeTDS. Potencjalnie możliwe byłoby skompilowanie go ze źródła.

Inną opcją jest sprawienie, aby pyodbc używał innego menedżera sterowników (unixODBC) zamiast ODBC Data Source Administrator. Nie wiem, jak do tego podejść.

Odpowiedz

2

Skończyło się na zastosowaniu pymssql w wersji 2.1.3 zainstalowanej za pomocą koła uzyskanego z http://www.lfd.uci.edu/~gohlke/pythonlibs/#pymssql. Zawiera FreeTDS i działało od razu po wyjęciu z pudełka:

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') 
Powiązane problemy