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

时间:2012-11-07 10:27:27

标签: 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);
        }
        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

我已经了解了为什么会出现这种情况并找到类似的问题here,但这似乎不起作用。运行代码时,我已经包含以下参数来查找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

你能发现什么问题吗?

6 个答案:

答案 0 :(得分:59)

似乎与此问题相同:jtds-driver-not-working-for-sql-sever-2008r2-and-denali-native-sspi-library-not

您应该将JTDS download package中相应的ntlmauth.dll文件放入JRE bin文件夹中。

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

  • 这个32位DLL:

      

    下载&gt;&gt;&gt; jtds-1.3.0-dist.zip&gt;&gt;&gt; x86&gt;&gt;&gt; SSO&gt;&gt;&gt; ntlmauth.dll

  • 在此32位JRE位置进入此处:

      

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

  • 这个64位DLL:

      

    下载&gt;&gt;&gt; jtds-1.3.0-dist.zip&gt;&gt;&gt; x64&gt;&gt;&gt; SSO&gt;&gt;&gt; ntlmauth.dll

  • 在此64位JRE位置进入此处:

      

    C:\ Program Files \ Java \ jre7 \ bin

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

  • 这个32位DLL:

      

    下载&gt;&gt;&gt; jtds-1.3.0-dist.zip&gt;&gt;&gt; x86&gt;&gt;&gt; SSO&gt;&gt;&gt; ntlmauth.dll

  • 在此32位JRE位置进入此处:

      

    C:\ Program Files \ Java \ jre7 \ bin

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

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

注意:使用此方法时,请勿设置连接的域,用户或密码属性。

注意:如果您的Java客户端程序在非Windows机器上运行,那么使用ntlmauth.dll方法就不顺利了。这是JTDS下载包附带的文档中的引用:下载&gt;&gt;&gt; jtds-1.3.0-dist.zip&gt;&gt;&gt; README.SSO

  

从版本0.9.2开始,jTDS能够使用Windows   客户端程序所属帐户下的当前用户的凭据   运行以登录到SQL Server(Windows单一登录)。

     

使用Windows Single Sign On(SSO)客户端将能够连接到   Microsoft SQL Server不提供凭据。它会动态的   读取当前用户的凭据并连接到数据库。提供的   Windows帐户在数据库中拥有足够的权限。这是使用a完成的   本机(仅限Windows)库,ntlmauth.dll。

答案 1 :(得分:6)

我遇到了类似的问题,我试图将ntlmauth.dll文件放在我认为sql-developer会寻找的目录中。我终于通过将ntlmauth.dll文件放在sql-developer应用程序目录本身的\jdk\jre\bin文件夹中(即sql-developer\jdk\jre\bin)来实现它。为什么sql-developer会在这个文件夹中查找ntlmauth.dll,而不是系统文件夹超出我的理解水平。无论如何,它奏效了。

以下是我刚刚回答的类似问题的链接。

Oracle SQL Developer connection to Microsoft SQL Server

答案 2 :(得分:2)

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

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

答案 3 :(得分:1)

干得好。

但是,部署JAR文件时有一点问题!

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

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

这是受到 JTDS driver not working for SQL Server 2008R2 and Denali Native SSPI library not loaded 的启发。

答案 4 :(得分:1)

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

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

答案 5 :(得分:0)

我通过将ntlmauth.dll文件放在\jdk\jre\bin来实现它。我使用Tomcat作为我的应用程序服务器。

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