Question

Est-il possible de se connecter à une base de données MS SQL Server avec Python sous Linux avec informations d'identification de domaine Windows?

Je peux me connecter parfaitement bien de ma machine Windows en utilisant identification Windows, mais d'essayer de faire la même chose à partir d'un python linux avec pyodbs + freetds + unixodbc

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

résultats dans cette erreur:

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

Je suis sûr que le mot de passe est correctement écrit, mais je l'ai essayé différentes combinaisons de nom d'utilisateur:

DOMAIN\username
DOMAIN\\username

ou même

UID=username;DOMAIN=domain

en vain. Toutes les idées?

Était-ce utile?

La solution

Comme indiqué dans l'un des commentaires, cette réponse est tout à fait obsolète maintenant. Je l'utilise régulièrement et systématiquement GSSAPI pour authentifier de Linux vers SQL Server 2008 R2, mais la plupart du temps avec le gestionnaire ODBC EasySoft et le (commercial) pilote ODBC EasySoft SQL Server.

Au début de 2009, un collègue et moi avons réussi à se connecter à un SQL Server 2005 par exemple de Solaris 10 à l'aide (informations d'identification Kerberos) GSSAPI utilisant DBB :: Perl sur un FreeTDS BUILD lié à une version particulière des bibliothèques MIT KERBEROS. L'astuce était - ce qui est un peu difficile à croire, mais je l'ai vérifié en regardant à travers le code source FreeTDS - pour spécifier un zéro longueur user_name. Si la longueur de la chaîne de user_name est 0 alors le code FreeTDS tentera d'utiliser GSSAPI (si ce soutien a été compilée). Je ne l'ai pas été en mesure de le faire via Python et pyodbc que je ne pouvais pas trouver un moyen d'obtenir ODBC pour transmettre un user_name de longueur nulle.

Voici le code perl .. il y a plusieurs possibilités pour les fichiers de configuration casse wrt tels que .freetds.conf etc. Je crois me rappeler que le principal devait être en majuscules, mais mes notes semblent être en désaccord avec cela.

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

Vous devez savoir comment utiliser l'utilitaire setspn afin d'obtenir le serveur SQL Server pour utiliser le nom principal de sécurité approprié.

Je n'ai pas connaissance du côté kerberos des choses parce que notre environnement a été mis en place par une sortie et hors gourou Kerberos et a des choses extravagantes comme la confiance mutuelle établie entre le domaine AD que le SQL Server est en cours d'exécution et la domaine Kerberos que mon client était en cours d'exécution dans.

Il y a un code http://code.google.com/p/libsqljdbc- auth / qui fait l'authentification GSSAPI de Linux à SQL Server, mais il est Java. L'auteur (qui semble connaître son affaire) a également contribué un patch similaire au projet jTDS qui fonctionne avec les versions plus récentes de Java qui ont GSSAPI construits.

Ainsi, les morceaux sont tous là, il est juste un grand désordre emmêlé essayant de les amener tous à travailler ensemble. J'ai trouvé le pyodbc à unixODBC à FreeTDS odbc à l'intégration TDS assez difficile à tracer / debug. Les trucs de perl parce qu'il était une enveloppe assez mince sur le dessus pour CT-Lib était beaucoup plus facile d'y aller.

Autres conseils

d'au moins Mars 2013, cela semble fonctionner hors de la boîte avec FreeTDS. J'ai spécifié TDS version du protocole pour faire bonne mesure - pas sûr si cela fait la différence:

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

L'authentification intégrée semble également être pris en charge dans le pilote officiel de Microsoft pour Linux: http: //msdn.microsoft.com/en-us/library/hh568450.aspx. Je ne sais pas combien de distributions Linux, il fonctionne réellement ou la quantité de la source est disponible. Ils mentionnent explicitement RHEL 5 et 6 et quelques dépendances sur la page de téléchargement .

Probablement un peu trop tard pour vous aider - mais j'ai rencontré le même problème. Au moment de l'écriture, la dernière version de pyodbc me permet de vous connecter avec les informations d'identification Windows. Il suffit de laisser le champ vide UID dans votre chaîne de connexion comme ceci:

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

est d'utiliser vos informations d'identification de fenêtres existantes lorsque vous êtes connecté ... pas sûr comment spécifier toutes les fenêtres arb les informations d'identification de domaine ...

Je ne l'ai pas fait dans un certain temps, mais je me souviens l'ensemble unixodbc + FreeTDS + chose pyodbc être un peu délicat. Cependant, il peut être fait, et une fois l'installation il est pas difficile.

Ce site fournit de très bonnes instructions: http://www.pauldeden. com / 2008/12 / how-to-setup-pyodbc à se connecter à mssql.html (copie archivée sur Web Archive)

En outre, dans mon expérience pyodbc avait des problèmes compilation / en cours d'exécution sur 64 bits machines Linux. À cause de cela nous avons finalement utilisé ceODBC. ceODBC est pas tout à fait aussi stable que pyodbc (rencontré des bugs plus inattendus que dans pyodbc lors de l'exécution en prorgram python), mais il est très facile de se lever et en cours d'exécution sur le bit Linux 64.

Je ne crois pas que vous serez en mesure de se connecter à un compte de domaine Windows de cette manière. Vous devez configurer un utilisateur dans SQL directement pour cette manière de pouvoirs qui passe.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top