Java I/O错误:SSO失败:未加载本机SSPI库

Java I/O错误:SSO失败:未加载本机SSPI库,java,sql-server,jdbc,ioerror,Java,Sql Server,Jdbc,Ioerror,我正在尝试运行以下代码: import java.sql.DriverManager; public class Connect { public static void main(String[] args){ try{ String databaseDriver = "net.sourceforge.jtds.jdbc.Driver"; Class.forName(databaseDriver); }

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

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 server正在机器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
这是我文件的结构

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

你能发现什么错误吗?

似乎和这个问题一样:

您应该将相应的ntlmauth.dll文件从放入JRE bin文件夹

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

  • 此32位DLL:

    下载>>>jtds-1.3.0-dist.zip>>>x86>>>SSO>>>ntlmauth.dll

  • 位于此32位JRE位置:

    C:\ProgramFiles(x86)\Java\jre7\bin

  • 此64位DLL:

    下载>>>jtds-1.3.0-dist.zip>>>x64>>>SSO>>>ntlmauth.dll

  • 位于此64位JRE位置:

    C:\ProgramFiles\Java\jre7\bin

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

  • 此32位DLL:

    下载>>>jtds-1.3.0-dist.zip>>>x86>>>SSO>>>ntlmauth.dll

  • 位于此32位JRE位置:

    C:\ProgramFiles\Java\jre7\bin

如果不起作用,请尝试在主方法顶部添加这一行:
System.out.println(java.lang.System.getProperty('java.library.path')

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

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

注意:如果Java客户机程序在非windows机器上运行,那么使用ntlmauth.dll方法就不走运了。这是对JTDS下载包附带文档的引用:Downloads>>>JTDS-1.3.0-dist.zip>>>README.SSO

从0.9.2版开始,jTDS能够使用Windows 客户端程序使用其帐户的当前用户的凭据 正在运行以登录SQL Server(Windows单点登录)

使用Windows单点登录(SSO)客户端将能够连接到 没有提供凭据的Microsoft SQL Server。它将是动态的 读取当前用户的凭据并连接到数据库。只要 Windows帐户在数据库中具有足够的权限。这是通过使用 本机(仅限Windows)库,ntlmauth.dll


我遇到了一个类似的问题,我试图将
ntlmauth.dll
文件放在我认为sql开发人员会查找的目录中。通过将
ntlmauth.dll
文件放在sql developer应用程序目录本身的
\jdk\jre\bin
文件夹中(即
sql developer\jdk\jre\bin
),我最终实现了它。我无法理解为什么sql developer会在这个文件夹中查找ntlmauth.dll而不是系统文件夹。不管怎么说,它起了作用

下面是我刚才回答的一个类似问题的链接

干得好

但是,在部署JAR文件时有一个小问题

我建议创建一个文件夹(例如,
lib
)并在中复制所有本机库。最后添加一个Java执行参数:

java -jar your_jar.jar -Djava.library.path=./lib

它的灵感来源于。

我将
ntlmauth.dll
文件放在
\jdk\jre\bin
上,使它工作起来。我正在使用作为我的应用程序服务器


但是,我注意到,这种方法一次只适用于部署的一个web应用程序。如果我对多个web应用程序具有相同的设置,则除了一个应用程序之外,所有应用程序都会失败。这是一种很奇怪的行为。知道这里发生了什么吗?

无法传递身份验证参数会导致相同的错误,因此除了其他答案之外,您还可以在连接字符串中传递用户名和密码,例如

jdbc:jtds:sqlserver://localhost:1433/dbname;user=username;password=s3cr3t

即使成功地将ntmauth.dll文件放入JRE/bin中,我也会遇到相同的错误


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

文件夹
Tester
是否位于根文件夹中?Tester是我在Eclipse中创建的java项目的名称。它就在我的工作区中。请尝试指定包含ntlmauth.dllI的文件夹的绝对路径。我使用绝对路径C:\Users\nos1001\workspace\Tester\jdbc\x64\SSO进行了尝试,但我仍然收到相同的消息非常有用,但是我没有将ntlmauth.dll添加到jre目录,而是将它添加到sdk目录:C:\Program Files\Java\jdk1.7.0\u 17\bin@Rob.Kachmar为什么不建议设置域?我只是在设置了它和没有设置它的情况下运行它,两者都运行得很好。使用0xDBE?将jTDS dist zip文件中的
x86\SSO\ntlmauth.dll
复制到
C:\Program Files(x86)\JetBrains\0xDBE 139.795.5\jre\jre\bin
。我需要将.dll文件复制到
C:\Program Files\Java\jdk1.8.0\u 77\jre\bin
中。我已将此dll放置在上述所有文件夹中,但运气不佳。我正在用Java1.7和EclipseHelios运行一个RCP应用程序。如果我包含用户名和密码,它可以正常工作,但是当我使用integratedSecurity=trueNote时会出现此错误。请注意,一旦您将文件放置在此文件夹中,您需要重新启动Oracle SQL Developer。就我个人而言,我更进一步,在类路径中包含了lib文件夹的路径。这有助于确保在编译成可执行形式时,任何本机库都与应用程序一起使用。这并不能真正回答这个问题。要提出新问题,请使用页面顶部的“提问”按钮。如果这个问题有助于提供背景,你可以链接到这个问题。这个答案最终对我有用,谢谢。此外,我还必须使用
runas
命令启动sqldeveloper:
runas/netonly/user:DOMAIN\user“指向sqldeveloper.exe的路径”
jdbc:jtds:sqlserver://localhost:1433/dbname;user=username;password=s3cr3t