2009-02-11 28 views
6

¿Hay alguna forma de conectarse a una base de datos de MS SQL Server con python en Linux usando las credenciales de dominio de Windows?Conexión a MS SQL Server usando python en Linux con 'Credenciales de Windows'

puedo conectar perfectamente bien de mi máquina Windows utilizando las credenciales de Windows, pero tratando de hacer lo mismo desde una pitón Linux con pyodbs + freetds + unixodbc

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

resultados en este error:

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

estoy seguro de la contraseña se escribe correctamente, pero yo he probado muchas combinaciones diferentes de nombre de usuario:

DOMAIN\username 
DOMAIN\\username 

o incluso

UID=username;DOMAIN=domain 

en vano. ¿Algunas ideas?

Respuesta

4

Como se señaló en uno de los comentarios, esta respuesta es bastante obsoleta por el momento. Uso GSSAPI regularmente y de forma rutinaria para autenticar de Linux a SQL Server 2008 R2, pero principalmente con el administrador EasySoft ODBC y el controlador (comercial) EasySoft ODBC SQL Server.

A principios de 2009, un colega y me las arreglé para conectarse a una instancia de SQL Server 2005 desde Solaris 10 usando (credenciales Kerberos) GSSAPI usando DBB :: Perl más de un FreeTDS contru enlazados con una versión particular del MIT Kerberos bibliotecas . El truco fue, y esto es un poco difícil de creer, pero lo he verificado mirando el código fuente de FreeTDS, para especificar de longitud cero user_name. Si la longitud de la cadena user_name es 0, entonces el código FreeTDS intentará usar GSSAPI (si ese soporte se ha compilado). No he podido hacer esto a través de Python y pyodbc ya que no pude encontrar una manera de hacer que ODBC transfiriera un nombre de usuario de longitud cero.

Aquí en el código perl ... hay múltiples oportunidades para romper los archivos de configuración wrt como .freetds.conf, etc. Parece que recuerdo que el principal tenía que estar en mayúsculas, pero mis notas parecen estar en desacuerdo con eso .

 
$serverprincipal = 'MSSQLSvc/foo.bar.yourdomain.com:[email protected]'; 
$dbh = DBI->connect("dbi:Sybase:server=THESERVERNAME;kerberos=$serverprincipal", '', ''); 

Usted tiene que saber cómo utilizar la utilidad setspn el fin de obtener el servidor SQL Server para utilizar el nombre principal de seguridad apropiado.

No conozco el lado kerberos de las cosas porque nuestro entorno fue creado por un gurú de Kerberos y tiene elementos de fantasía como la confianza mutua configurada entre el dominio AD en el que se ejecuta SQL Server y el dominio Kerberos en el que mi cliente se estaba ejecutando.

Hay un código http://code.google.com/p/libsqljdbc-auth/ que hace la autenticación GSSAPI de Linux a SQL Server pero solo es Java. El autor (que parece conocer sus cosas) también ha contribuido con un parche similar al proyecto jTDS que funciona con versiones más recientes de Java que tienen GSSAPI incorporado.

Así que las piezas están todas allí, es solo una gran enredo complicado tratando de hacer que todos trabajen juntos. Encontré el pyodbc a unixODBC a FreeTDS odbc a la integración TDS bastante difícil de rastrear/depurar. El material perl porque era un envoltorio bastante delgado en la parte superior de CT-Lib era mucho más fácil de poner en marcha.

+2

Es un cuento épico, pero ahora es demasiado engañoso para el estado actual de las cosas como la respuesta más alta y aceptada. Avíseme si edita en una cláusula de exención de responsabilidad y eliminaré mi voto negativo. – steamer25

0

No creo que pueda iniciar sesión en una cuenta de dominio de Windows de esta manera. Debe configurar un usuario en sql directamente para esta manera de pasar credenciales.

+0

Parece que esta es la única forma práctica de ir por el momento. –

1

No lo he hecho por un tiempo, pero recuerdo que todo unixodbc + FreeTDS + pyodbc es un poco complicado. Sin embargo, se puede hacer, y una vez configurado no es tan difícil.

Este sitio web ofrece muy buenas instrucciones: http://www.pauldeden.com/2008/12/how-to-setup-pyodbc-to-connect-to-mssql.html (archived copy on Web Archive)

Además, en mi experiencia pyodbc tenía problemas de compilación/ejecución en máquinas Linux de 64 bits. Debido a eso, finalmente usamos ceODBC. ceODBC no es tan estable como pyodbc (encontró más errores inesperados que en pyodbc cuando se ejecuta en prorgram de python), pero es muy fácil de instalar y ejecutar en Linux de 64 bits.

+0

Ya he usado ese sitio web para obtener instrucciones, pero no ayuda con el inicio de sesión de Credenciales de Windows, aunque proporciona una buena introducción para configurar todo el sistema. –

+0

Vínculo a la baja porque esta respuesta no aborda explícitamente la Autenticación integrada/"Credenciales de Windows" según la pregunta. – steamer25

1

Probablemente es demasiado tarde para ayudarte, pero me encontré con el mismo problema. En el momento de escribir, la última versión de pyodbc me permite iniciar sesión con las credenciales de Windows. Sólo deja en blanco el campo UID en la cadena de conexión, así:

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

Ahora esto está utilizando las credenciales de Windows existentes cuando haya iniciado sesión ... no estoy seguro cómo especificar las credenciales de dominio de Windows arb ...

+0

Esto funciona desde Linux? – tponthieux

+0

@tponthieux: Sí, el código (al menos en mi respuesta) funciona en Linux. – steamer25

+0

@anbanm, si está especificando la contraseña en la cadena de conexión, ¿cómo es esta autenticación integrada? – Chetan

2

Al menos hasta marzo de 2013, esto parece funcionar de la caja con FreeTDS. He especificado el TDS protocol version por si acaso - no estoy seguro si eso hace la diferencia:

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

autenticación integrada también parece estar apoyado en piloto oficial de Microsoft para Linux: http://msdn.microsoft.com/en-us/library/hh568450.aspx. No estoy seguro de la cantidad de distribuciones de Linux en las que realmente funciona ni de la fuente disponible. Mencionan explícitamente RHEL 5 y 6 y algunas dependencias en el download page.

+0

Esto funcionó para mí. La clave estaba anteponiendo el dominio publicitario al nombre de usuario. – stuckintheshuck

Cuestiones relacionadas