输入/输出错误:SSO失败:未加载本地SSPI库

39

我正在尝试运行以下代码:

import java.sql.DriverManager;

public class Connect {
    public static void main(String[] args){
        try{
            String databaseDriver = "net.sourceforge.jtds.jdbc.Driver";
            Class.forName(databaseDriver);
        }
        catch (Exception e) {
            e.printStackTrace();
        }

        try{
            String url = "jdbc:jtds:sqlserver://BHX:1433/Forecast;instance=SQLEPXRESS";
            java.sql.Connection con = DriverManager.getConnection(url);
            System.out.println("Connection");
        }
        catch (Exception e){
            e.printStackTrace();
        }
    }
}

我的 SQL 服务器正在 BHX 机器上的端口 1433 上运行。

我收到的错误信息如下:

java.sql.SQLException: I/O Error: SSO Failed: Native SSPI library not loaded. Check the     java.library.path system property.
    at net.sourceforge.jtds.jdbc.TdsCore.login(TdsCore.java:615)
    at net.sourceforge.jtds.jdbc.ConnectionJDBC2.<init>(ConnectionJDBC2.java:352)
    at net.sourceforge.jtds.jdbc.ConnectionJDBC3.<init>(ConnectionJDBC3.java:50)
    at net.sourceforge.jtds.jdbc.Driver.connect(Driver.java:185)
    at java.sql.DriverManager.getConnection(Unknown Source)
    at java.sql.DriverManager.getConnection(Unknown Source)
    at Connect.main(Connect.java:14)
Caused by: java.io.IOException: SSO Failed: Native SSPI library not loaded. Check the java.library.path system property.
    at net.sourceforge.jtds.jdbc.TdsCore.sendMSLoginPkt(TdsCore.java:1893)
    at net.sourceforge.jtds.jdbc.TdsCore.login(TdsCore.java:588)
    ... 6 more

我已经阅读了关于为什么通常会发生这种情况的内容,并在这里找到了一个类似的问题,但这似乎不起作用。 当运行代码时,我已经包括了以下参数来定位SSO文件:

-Djava.library.path=/Tester/jdbc/x64/SSO

这是我的文件结构

**Tester**
   *src*
     default package
         Connect.java
   *JRE System Library*
   *jdbc*
     conf
     html
     IA64
     x64
       SSO
        ntlmauth.dll
     x86

你能发现任何不对的地方吗?


Tester文件夹是否位于根目录下? - Mark Rotteveel
Tester是我在Eclipse中创建的Java项目名称,它只存在于我的工作区中。 - Nosheen
尝试指定包含 ntlmauth.dll 的文件夹的绝对路径。 - Mark Rotteveel
我尝试使用绝对路径 C:\Users\nos1001\workspace\Tester\jdbc\x64\SSO,但我仍然收到相同的消息。 - Nosheen
6个回答

77

看起来和这个问题一样:jtds-driver-not-working-for-sql-sever-2008r2-and-denali-native-sspi-library-not

您应该将适当的 ntlmauth.dll 文件从JTDS下载包放入 JRE bin 文件夹中。

如果您正在64位Windows计算机上运行:

  • 这个32位DLL文件:

    Downloads >>> jtds-1.3.0-dist.zip >>> x86 >>> SSO >>> ntlmauth.dll

  • 放在这个32位JRE位置:

    C:\Program Files (x86)\Java\jre7\bin

  • 这个64位DLL文件:

    Downloads >>> jtds-1.3.0-dist.zip >>> x64 >>> SSO >>> ntlmauth.dll

  • 放在这个64位JRE位置:

    C:\Program Files\Java\jre7\bin

如果您正在32位Windows计算机上运行:

  • 这个32位DLL文件:

    Downloads >>> jtds-1.3.0-dist.zip >>> x86 >>> SSO >>> ntlmauth.dll

  • 放在这个32位JRE位置:

    C:\Program Files\Java\jre7\bin

如果这样做不起作用,请尝试在您的主方法顶部添加此行:

System.out.println(java.lang.System.getProperty('java.library.path'));

应输出程序使用的实际JRE路径。确保适当的ntlmauth.dll位于该JRE的bin文件夹中。

注意:不要在使用该方法时设置连接的域、用户或密码属性。

注意:如果您的Java客户端程序运行在非Windows机器上,那么使用ntlmuth.dll方法就无法成功。这是从JTDS下载包的文档中摘录的一句话:Downloads >>> jtds-1.3.0-dist.zip >>> README.SSO

jTDS从版本0.9.2开始,能够使用当前用户帐户下的Windows凭据(Windows Single Sign On)登录到SQL Server。使用Windows Single Sign On(SSO),客户端将能够连接到Microsoft SQL Server而无需提供凭据。只要 Windows 帐户在数据库中拥有足够的权限即可。此操作使用了一个本地(仅限Windows)库ntlmuth.dll。


1
非常有用,但是我不得不将ntlmauth.dll添加到sdk目录而不是jre目录中:C:\Program Files\Java\jdk1.7.0_17\bin。 - Steffen
@Rob.Kachmar 为什么您建议不设置域名?我刚刚尝试了设置和不设置域名两种方式,都可以正常运行。 - Jeremy W
使用0xDBE?请将jTDS dist zip文件中的x86\SSO\ntlmauth.dll复制到C:\Program Files (x86)\JetBrains\0xDBE 139.795.5\jre\jre\bin目录下。 - bonh
我需要将.dll文件复制到C:\Program Files\Java\jdk1.8.0_77\jre\bin - Tiago Sippert
我已经将这个dll放在上述所有文件夹中,但没有成功。我正在使用Java 1.7和Eclipse Helios运行RCP应用程序。如果我包括用户名和密码,它可以正常工作,但是当我使用integratedSecurity=true时会出现此错误。 - dead_jake
显示剩余3条评论

8
我曾遇到类似的问题,尝试将 ntlmauth.dll 文件放置在我认为 sql-developer 会查找的许多目录中。最终,我通过将 ntlmauth.dll 文件放置在 sql-developer 应用程序目录本身的 \jdk\jre\bin 文件夹中(即 sql-developer\jdk\jre\bin)使其正常工作。为什么 sql-developer 会在此文件夹而不是系统文件夹中查找 ntlmauth.dll 超出了我的理解范围。无论如何,它起作用了。
下面是一个我刚回答过的类似问题的链接。

Oracle SQL Developer连接到Microsoft SQL Server


1
请注意,一旦您将文件放置在此文件夹中,您需要重新启动Oracle SQL Developer。 - Mir

6

即使我已经成功地将ntmauth.dll文件放置在JRE / bin中,仍然出现了相同的错误。

然后我尝试将ntmauth.dll放置在C:\ Windows \ System32目录中。通过这样做,问题得到解决。


这个答案最终对我有用,谢谢。另外,我不得不使用runas命令启动SQL Developer:runas /netonly /user:DOMAIN\User "path-to-sql-developer.exe" - Jason Robinson

2
未能通过身份验证参数会导致相同的错误,因此作为其他答案的替代方案,您还可以在连接字符串中传递用户名和密码,例如:
jdbc:jtds:sqlserver://localhost:1433/dbname;user=username;password=s3cr3t

1

就个人而言,我进一步将lib文件夹的路径包含在类路径中。这有助于确保在编译成可执行形式的应用程序时,任何本地库都随之携带。 - nihilon

0

我通过将ntlmauth.dll文件放置在\jdk\jre\bin中使其正常运行。我正在使用Tomcat作为我的应用服务器。

然而,我注意到这仅适用于一次部署一个Web应用程序。如果我对多个Web应用程序设置相同,所有的都会失败,只有一个成功。这是相当奇怪的行为。你知道这里发生了什么吗?


这并没有真正回答问题。如果您想提出新的问题,请使用页面顶部的“提问”按钮。如果需要,您可以链接到此问题以提供上下文。 - elixenide

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接