错误28000:使用pyodbc的用户DOMAIN \\用户登录失败

时间:2016-06-08 03:34:33

标签: python sql-server pyodbc

我正在尝试使用Python通过Window身份验证连接到SQL数据库。我查看了一些帖子(例如here),但建议的方法似乎不起作用。

例如,我使用了以下代码:

cnxn = pyodbc.connect(driver='{SQL Server Native Client 11.0}',
                      server='SERVERNAME', 
                      database='DATABASENAME',               
                      trusted_connection='yes')

但是我收到了以下错误:

Error: ('28000', "[28000] [Microsoft][SQL Server Native Client 11.0][SQL Server]
Login failed for user 'DOMAIN\\username'. (18456) (SQLDriverConnect); [28000] [Microsoft]
[SQL Server Native Client 11.0][SQL Server]Login failed for user 'DOMAIN\\username'. 
(18456)") 

请注意,我在上面的错误消息中分别用DOMAINusername替换了实际的域名和用户名。

我也尝试使用我的UIDPWD,这导致了同样的错误。

最后,我尝试按照上述链接中的建议更改服务帐户,但在我的计算机上,当我转到Log On Properties时,没有services.msc标签}。

我想知道我做错了什么以及如何解决这个问题。

8 个答案:

答案 0 :(得分:12)

从Windows计算机连接:

使用Microsoft的SQL Server ODBC驱动程序,Trusted_connection=yes告诉驱动程序使用“Windows身份验证”,您的脚本将尝试使用运行脚本的用户的Windows凭据登录SQL Server UIDPWD不能用于在连接字符串中提供备用Windows凭据,因此如果您需要以其他Windows用户身份进行连接,则需要使用RUNAS来运行Python脚本和其他用户一样..

如果要对UIDPWD指定的特定 SQL Server登录使用“SQL Server身份验证”,请使用Trusted_connection=no

从非Windows机器连接:

如果您需要从非Windows计算机连接并且SQL Server配置为仅使用“Windows身份验证”,则Microsoft的SQL Server ODBC驱动程序将要求您使用Kerberos。或者,您可以使用FreeTDS ODBC,在连接字符串中指定UIDPWDDOMAIN,前提是SQL Server实例配置为支持较旧的NTLM身份验证协议。

答案 1 :(得分:1)

试试这个cxn字符串:

cnxn = pyodbc.connect('DRIVER={SQL Server};SERVER=localhost;PORT=1433;DATABASE=testdb;UID=me;PWD=pass')

http://mkleehammer.github.io/pyodbc/

答案 2 :(得分:0)

我尝试了一切,这最终对我有用:

#include <bits/stdc++.h>

using namespace std;

vector<vector<int>> tree;
int n;

void update (int k, vector<int> vect)
{
    k+=n;
    tree[k]=vect;

    for (k/=2;k>=1;k/=2)
    {
        tree[k]=merge(tree[2*k],tree[2*k+1]);
    }
}

vector<int> merge (vector<int> arr1, vector<int> arr2)
{
    int a1=arr1.size(), a2=arr2.size();
    vector<int> sortvect(a1+a2);

    int i=0,j=0,k=0;

    while (i<a1&&i<a2) sortvect[k++]=((arr1[i]<arr2[j])?arr1[i++]:arr2[j++]);
    while (i<a1) sortvect[k++]=arr1[i++];
    while (j<a2) sortvect[k++]=arr2[j++];

    return sortvect;
}

int main()
{
    cin>>n; tree.resize(2*n,{0});
    int a;

    for (int i=0;i<n;i++)
    {
        cin>>a;
        update(i,{a});
    }
}

答案 3 :(得分:0)

连接到默认数据库(MSSQLSERVER)时遇到类似问题。如果要连接到默认数据库,请删除

  

数据库= 'DATABASENAME',

从连接参数部分开始,然后重试。

干杯, 迪帕克

答案 4 :(得分:0)

如果已使用命令提示符存储了凭据,则第一个选项有效。另一个选择是在连接中提供凭据(UId,Psw)。

以下对我有用:

conn = pyodbc.connect('DRIVER={SQL Server};SERVER=yourServer;DATABASE=yourDatabase;UID=yourUsername;PWD=yourPassword')

答案 5 :(得分:0)

import pyodbc   #For python3 MSSQL

cnxn = pyodbc.connect("Driver={SQL Server};"   #For Connection
                   "Server=192.168.0.***;"
                   "PORT=1433;"
                   "Database=***********;"
                   "UID=****;"
                   "PWD=********;")
cursor = cnxn.cursor()                        #Cursor Establishment
cursor.execute('select site_id from tableName')   #Execute Query

rs = cursor.fetchall() 
print(rs)

答案 6 :(得分:0)

与OP稍有不同的用例,但对于感兴趣的用例,可以使用Windows身份验证连接到与登录用户帐户不同的用户帐户来使用MS SQL Server数据库。

这可以通过使用带有JDBC JTDS驱动程序的python jaydebeapi模块来实现。有关详细信息,请参见我的答案here

答案 7 :(得分:-1)

Trusted_connection = no并没有帮助我。当我删除整行并添加UID,PWD参数时,它起作用了。我从中得到的收获是

相关问题