Domanda

C'è un modo per connettersi a un database MS SQL Server con il pitone su Linux utilizzando le credenziali di Windows di dominio?

Posso collegarmi benissimo dalla mia macchina Windows utilizzando credenziali di Windows, ma il tentativo di fare lo stesso da un pitone Linux con pyodbs + FreeTDS + unixodbc

>>import pyodbc
>>conn = pyodbc.connect("DRIVER={FreeTDS};SERVER=servername;UID=username;PWD=password;DATABASE=dbname")

risultati in questo errore:

class 'pyodbc.Error'>: ('28000', '[28000] [unixODBC][FreeTDS][SQL Server]Login incorrect. (20014) (SQLDriverConnectW)')

Sono sicuro che la password è scritta correttamente, ma ho provato molte combinazioni diverse di nome utente:

DOMAIN\username
DOMAIN\\username

o anche

UID=username;DOMAIN=domain

senza alcun risultato. Tutte le idee?

È stato utile?

Soluzione

Come sottolineato in uno dei commenti, questa risposta è piuttosto stantio ormai. Ho regolarmente e regolarmente uso GSSAPI per autenticare da Linux a SQL Server 2008 R2, ma per lo più con il direttore EasySoft ODBC e il driver (commerciale) EasySoft ODBC di SQL Server.

All'inizio del 2009, un collega e sono riuscito a connettersi a un'istanza di SQL Server 2005 da Solaris 10 utilizzando (credenziali Kerberos) GSSAPI usando DBB :: Perl oltre un FreeTDS costruiscono collegati contro una particolare versione del MIT Kerberos librerie. Il trucco era - e questo è un po 'difficile da credere, ma ho verificato che, cercando attraverso il codice sorgente di FreeTDS - per specificare un di lunghezza zero nome_utente. Se la lunghezza della stringa nome utente è 0 allora il codice FreeTDS tenterà di utilizzare GSSAPI (se tale sostegno è stato compilato). Non sono stato in grado di fare questo tramite Python e pyodbc come io non riuscivo a capire un modo di ottenere ODBC per tramandare un nome utente di lunghezza zero.

Qui nel codice Perl .. ci sono più opportunità per i file di configurazione rottura WRT quali .freetds.conf ecc Mi sembra di ricordare che il principale doveva essere in maiuscolo, ma i miei appunti sembrano essere in disaccordo con questo.

$serverprincipal = 'MSSQLSvc/foo.bar.yourdomain.com:1433@YOURDOMAIN.COM';
$dbh = DBI->connect("dbi:Sybase:server=THESERVERNAME;kerberos=$serverprincipal", '', '');

Si dovrà sapere come utilizzare l'utilità setspn al fine di ottenere il server SQL Server per utilizzare il nome di entità di protezione appropriato.

Non ho alcuna conoscenza del lato kerberos delle cose perché il nostro ambiente è stato istituito da un vero e proprio Kerberos guru e ha cose fantasiose come la fiducia reciproca che si instaura tra il dominio AD che SQL Server è in esecuzione e il dominio Kerberos che il mio cliente è stato in esecuzione in.

V'è una certa http://code.google.com/p/libsqljdbc- auth / che fa l'autenticazione GSSAPI da Linux a SQL Server, ma è solo Java. L'autore (che sembra conoscere la sua roba) ha anche contribuito una patch simile al progetto jTDS che funziona con le versioni più recenti di Java che hanno costruito in GSSAPI.

Così i pezzi sono tutti lì, è solo un gran casino aggrovigliato cercando di farli tutti di lavorare insieme. Ho trovato il pyodbc per unixODBC a FreeTDS ODBC all'integrazione TDS piuttosto difficile da rintracciare / debug. La roba perl perché era un involucro piuttosto sottile in cima al CT-Lib era molto più facile per andare avanti.

Altri suggerimenti

Come di almeno marzo 2013, questo sembra funzionare out of the box con FreeTDS. Ho specificato il TDS versione del protocollo per buona misura - non so se questo fa la differenza:

connStr = "DRIVER={{FreeTDS}};SERVER={0};PORT=1433;TDS_Version=7.2;UID={1}\\{2};PWD={3}".format(hostname, active_directory_domain, username, password)

l'autenticazione integrata inoltre sembra essere supportato in pilota ufficiale di Microsoft per Linux: http: //msdn.microsoft.com/en-us/library/hh568450.aspx. Non sono sicuro di quante distribuzioni Linux funziona realmente o quanta parte del sorgente è disponibile. Essi indicano esplicitamente RHEL 5 e 6 e alcune dipendenze nella pagina di download href="https://www.microsoft.com/en-us/download/details.aspx?id=28160" rel="nofollow"> .

Probabilmente un po 'troppo tardi per aiutare fuori - ma ho incontrato lo stesso problema. Al momento della scrittura, l'ultima versione di pyodbc mi permette di login con le credenziali di Windows. Basta lasciare il campo UID vuoto nella stringa di connessione in questo modo:

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

Ora, questo è utilizzando le credenziali di Windows esistenti quando si è registrato su ... non so come specificare eventuali credenziali finestre arb dominio ...

Non ho fatto in un po ', ma mi ricordo tutto unixODBC + FreeTDS + cosa pyodbc essere un po' difficile. Tuttavia, si può fare, e una volta che l'installazione non è così difficile.

Questo sito offre molto buone istruzioni: http://www.pauldeden. com / 2008/12 / how-to-setup-pyodbc-to-connect-a-mssql.html (copia archiviata sul Web Archive)

Inoltre, nella mia esperienza pyodbc ha avuto problemi di compilazione / esecuzione su macchine Linux 64 bit. A causa di ciò alla fine abbiamo usato ceODBC. ceODBC non è abbastanza stabile come pyodbc (riscontrato bug più inaspettati che in pyodbc durante l'esecuzione in pitone prorgram), ma è molto facile da ottenere installato e funzionante su Linux a 64 bit.

Non credo che sarete in grado di accedere ad un account di dominio Windows in questo modo. È necessario impostare un utente in SQL direttamente per questo modo di passaggio delle credenziali.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top