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

2022-09-01 05:40:13

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

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

你能发现任何错误吗?


答案 1

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

您应该将相应的 ntlmauth.dll 文件从 JTDS 下载包拖放到 JRE bin 文件夹中。

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

  • 这个 32 位 DLL:

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

  • 在此 32 位 JRE 位置:

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

  • 这个 64 位 DLL:

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

  • 在此 64 位 JRE 位置:

    C:\Program Files\Java\jre7\bin

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

  • 这个 32 位 DLL:

    下载>>> jtds-1.3.0-dist.zip >>> x86 >>> SSO >>> 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下载包中包含的文档中的引用:下载>>>jtds-1.3.0-dist.zip >>> README。单点登录

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

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


答案 2

我遇到了类似的问题,我试图将文件放在我认为sql-developer会去寻找它的尽可能多的目录中。我最终通过将文件放在sql-developer应用程序目录本身的文件夹中(即)。来使其正常工作。为什么sql开发人员会在这个文件夹中寻找ntlmauth.dll而不是系统文件夹超出了我的理解水平。无论如何,它奏效了。ntlmauth.dllntlmauth.dll\jdk\jre\binsql-developer\jdk\jre\bin

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

Oracle SQL Developer 连接到 Microsoft SQL Server


推荐