Pergunta

Existe alguma maneira de se conectar a um banco de dados MS SQL Server com python no linux usando credenciais do Windows domínio?

Eu posso conectar perfeitamente bem da minha máquina Windows usando credenciais do Windows, mas a tentativa de fazer o mesmo a partir de uma python linux com pyodbs + freetds + unixodbc

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

resultados neste erro:

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

Eu tenho certeza que a senha está escrito corretamente, mas eu tentei muitas combinações diferentes de usuário:

DOMAIN\username
DOMAIN\\username

ou mesmo

UID=username;DOMAIN=domain

sem sucesso. Alguma idéia?

Foi útil?

Solução

Como apontado em um dos comentários, esta resposta é bastante obsoleto por agora. Eu regularmente e rotineiramente usar GSSAPI para autenticar do Linux para o SQL Server 2008 R2, mas principalmente com o gerente ODBC EasySoft eo motorista (comercial) EasySoft ODBC SQL Server.

No início de 2009, um colega e eu consegui conectar a uma instância do SQL Server 2005 do Solaris 10 usando (credenciais Kerberos) GSSAPI usando DBB :: Perl mais de FreeTDS construir ligados contra uma versão específica do MIT Kerberos bibliotecas. O truque era - e isso é um pouco difícil de acreditar, mas tenho verificado que, olhando através do código fonte FreeTDS - para especificar um de comprimento zero user_name. Se o comprimento da corda user_name é 0, em seguida, o código de FreeTDS tentará usar GSSAPI (se que o apoio foi compilado em). Eu não tenho sido capaz de fazer isso via Python e pyodbc como eu não poderia descobrir uma maneira de obter ODBC para passar para baixo um user_name de comprimento zero.

Aqui no código perl .. Há múltiplas oportunidades para a configuração quebra wrt arquivos como .freetds.conf etc. Eu me lembro que o principal tinha que ser em letras maiúsculas, mas minhas notas parecem estar em desacordo com isso.

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

Você tem que saber como usar o utilitário setspn a fim de obter o servidor SQL Server para usar o nome principal de segurança apropriada.

Eu não tenho qualquer conhecimento do lado do kerberos das coisas porque nosso ambiente foi criada por um fora e de fora Kerberos guru e tem coisas extravagantes como a confiança mútua criada entre o domínio AD que o SQL Server está sendo executado e se o domínio Kerberos que meu cliente estava correndo.

Há algum código http://code.google.com/p/libsqljdbc- auth / que faz a autenticação GSSAPI do Linux para o SQL Server, mas é apenas Java. O autor (que parece saber coisas dele) também contribuiu um patch semelhante ao projeto jTDS que funciona com as versões mais recentes do Java que têm GSSAPI construído em.

Assim, as peças estão todas lá, é apenas um emaranhado grande tentando levá-los todos a trabalhar juntos. Achei o pyodbc para unixODBC para FreeTDS ODBC para integração TDS muito difícil trace / debug. O perl coisas porque era um invólucro muito fina no topo de CT-Lib era muito mais fácil para começar.

Outras dicas

A partir de, pelo menos, Março de 2013, isso parece funcionar fora da caixa com FreeTDS. I especificado o TDS versão do protocolo para uma boa medida - não tenho certeza se isso faz a diferença:

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

A autenticação integrada também parece ser apoiada em piloto oficial da Microsoft para Linux: http: //msdn.microsoft.com/en-us/library/hh568450.aspx . Eu não tenho certeza de quantas distribuições Linux ele realmente funciona em ou quanto da fonte está disponível. explicitamente Eles mencionam RHEL 5 e 6 e algumas dependências no href="https://www.microsoft.com/en-us/download/details.aspx?id=28160" rel="nofollow"> página de download .

Provavelmente um pouco tarde demais para ajudá-lo - mas eu encontrei o mesmo problema. No momento da escrita, a última versão do pyodbc me permite entrar com as credenciais do Windows. Basta deixar o campo em branco UID em sua seqüência de conexão da seguinte forma:

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

Agora, isso é usando suas credenciais do Windows existente quando você está logado na ... não sei como especificar qualquer credenciais de domínio janelas arb ...

Eu não tenho feito isso em um tempo, mas eu me lembro de toda unixodbc + FreeTDS + coisa pyodbc ser um pouco complicado. No entanto, isso pode ser feito, e assim que a configuração não é tão difícil.

Este site oferece muito boas instruções: http://www.pauldeden. cOM / 2008/12 / how-to-setup-pyodbc-to-connect-to-mssql.html (cópia arquivada no web Archive)

Além disso, na minha experiência pyodbc tinha problemas compilando / executando em máquinas Linux de 64 bits. Por causa do que nós eventualmente usado ceODBC. ceODBC não é tão estável quanto pyodbc (encontrados erros mais inesperados do que em pyodbc quando rodando em prorgram python), mas é muito fácil de se levantar e correr em Linux de 64 bits.

Eu não acredito que você vai ser capaz de fazer logon em uma conta de domínio do Windows desta forma. Você precisa configurar um usuário no SQL diretamente para esta maneira de passar credenciais.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top