web-dev-qa-db-fra.com

Erreur d'E / S: SSO a échoué: la bibliothèque SSPI native n'est pas chargée

J'essaie d'exécuter le morceau de code suivant:

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();
        }
    }
}

Mon serveur SQL s'exécute sur le port 1433 sur la machine BHX.

Le message d'erreur que je reçois est le suivant:

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

J'ai lu pourquoi cela se produit généralement et j'ai trouvé une question similaire ici , mais cela ne semble pas fonctionner. Lors de l'exécution du code, j'ai inclus l'argument suivant pour localiser le fichier SSO:

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

Et c'est la structure de mes fichiers

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

Pouvez-vous repérer quelque chose de mal?

30
Nosheen

Semble comme le même problème que celui-ci: jtds-driver-not-working-for-sql-sever-2008r2-and-denali-native-sspi-library-not

Vous devez déposer le fichier ntlmauth.dll approprié du package de téléchargement JTDS dans votre dossier bin JRE.

Si vous exécutez sur une machine Windows 64 bits:

  • Cette DLL 32 bits:

    Téléchargements >>> jtds-1.3.0-dist.Zip >>> x86 >>> SSO >>> ntlmauth.dll

  • Va ici dans cet emplacement JRE 32 bits:

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

  • Cette DLL 64 bits:

    Téléchargements >>> jtds-1.3.0-dist.Zip >>> x64 >>> SSO >>> ntlmauth.dll

  • Va ici dans cet emplacement JRE 64 bits:

    C:\Program Files\Java\jre7\bin

Si vous exécutez sur une machine Windows 32 bits:

  • Cette DLL 32 bits:

    Téléchargements >>> jtds-1.3.0-dist.Zip >>> x86 >>> SSO >>> ntlmauth.dll

  • Va ici dans cet emplacement JRE 32 bits:

    C:\Program Files\Java\jre7\bin

Si cela ne fonctionne pas, essayez d'ajouter cette ligne en haut de votre méthode principale: System.out.println(Java.lang.System.getProperty('Java.library.path'));

Il doit afficher le chemin JRE réel utilisé par votre programme. Assurez-vous que le fichier ntlmauth.dll approprié se trouve dans le dossier bin de ce JRE.

REMARQUE: ne définissez PAS les propriétés de domaine, d'utilisateur ou de mot de passe de la connexion lorsque vous utilisez cette méthode.

REMARQUE: si votre programme client Java Java s'exécute sur une machine non Windows, vous n'avez pas de chance d'utiliser la méthode ntlmauth.dll. Il s'agit d'une citation tirée de la documentation incluse avec le téléchargement JTDS package: Téléchargements >>> jtds-1.3.0-dist.Zip >>> README.SSO

À partir de la version 0.9.2, jTDS est capable d'utiliser les informations d'identification Windows de l'utilisateur actuel sous le compte duquel le programme client s'exécute pour se connecter à SQL Server (Windows Single Sign On).

L'utilisation de clients Windows Single Sign On (SSO) pourra se connecter à Microsoft SQL Server sans fournir d'informations d'identification. Il lirait dynamiquement les informations d'identification de l'utilisateur actuel et se connecterait à la base de données. à condition que le compte Windows dispose de suffisamment de droits sur la base de données. Cela se fait à l'aide d'une bibliothèque native (Windows uniquement), ntlmauth.dll.

63
Rob.Kachmar

J'ai eu un problème similaire et j'ai essayé de placer le ntlmauth.dll fichier dans autant de répertoires que je pensais que sql-developer irait le chercher. Je l'ai finalement fait fonctionner en plaçant le ntlmauth.dll fichier dans le \jdk\jre\bin dossier dans le répertoire de l'application sql-developer lui-même (c'est-à-dire sql-developer\jdk\jre\bin). Pourquoi sql-developer chercherait le ntlmauth.dll dans ce dossier et non le dossier système est au-delà de mon niveau de compréhension. En tout cas, ça a marché.

Vous trouverez ci-dessous un lien vers une question similaire à laquelle je viens de répondre.

connexion Oracle SQL Developer à Microsoft SQL Server

6
codingknob

J'obtiens la même erreur même après avoir placé avec succès le fichier ntmauth.dll dans JRE/bin.

J'ai ensuite essayé en mettant ntmauth.dll dans le C:\Windows\System32 répertoire. Ce faisant, le problème a été résolu.

2
TechSunil

Bon travail.

Mais, il y a un petit problème lors du déploiement de votre fichier JAR!

Je suggère de créer un dossier (par exemple, lib) et de copier toutes les bibliothèques natives dedans. Enfin, ajoutez un paramètre d'exécution Java:

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

Cela a été inspiré de le pilote JTDS ne fonctionne pas pour SQL Server 2008R2 et la bibliothèque Denali Native SSPI n'est pas chargée.

1
Said AKHROUF

Ne pas transmettre les paramètres d'authentification entraîne la même erreur, donc alternativement aux autres réponses, vous pouvez également transmettre le nom d'utilisateur et le mot de passe dans la chaîne de connexion, par ex.

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

Je l'ai fait fonctionner en plaçant le ntlmauth.dll fichier sur \jdk\jre\bin. J'utilise Tomcat comme serveur d'applications.

Cependant, j'ai remarqué que cela ne fonctionne que pour une seule application Web déployée à la fois. Si j'ai le même paramètre pour plusieurs applications Web, toutes échouent sauf une. C'est un comportement assez étrange. Une idée de ce qui se passe ici?

0
shirjai