AtNotes Übersicht Willkommen Gast. Bitte einloggen oder registrieren.
25.01.22 - 17:57:38
Übersicht Hilfe Regeln Glossar Suche Einloggen Registrieren
News:
Schnellsuche:
+  Das Notes Forum
|-+  Lotus Notes / Domino Sonstiges
| |-+  Java und .NET mit Notes/Domino (Moderatoren: Axel, m3)
| | |-+  Windows-Authentizierung mit jTDS läuft nur ein Mal
« vorheriges nächstes »
Seiten: [1] Nach unten Drucken
Autor Thema: Windows-Authentizierung mit jTDS läuft nur ein Mal  (Gelesen 3834 mal)
Mark³
Senior Mitglied
****
Offline Offline

Geschlecht: Männlich
Beiträge: 386


Nordisch by Nature


WWW
« am: 23.02.06 - 09:21:32 »

Ich importiere mit einem Java-Agenten Daten aus einer MS SQL 2000-Datenbank in eine Notes-DB. Der Notes-Server läuft unter einem Windows-User, der Zugriff auf die SQL-DB hat. Als Treiber nutze ich die aktuelle Version von jTDS. Dort ist die Windows-Authentizierung mittels der Datei ntlmauth.dll enthalten. Der Pfad zu dieser Datei (c:\winnt\system32) ist in der PATH-Variablen drin.
Wenn ich den Agenten nun auf dem Server laufen lasse funktioniert beim ersten Lauf alles. Alle weiteren Läufe bringen folgende Fehlermeldung:
Zitat
java.sql.SQLException: I/O Error: SSO Failed: Native SSPI library not loaded. Check the java.library.path system property.

Ursache dafür ist eigentlich, dass die dll nicht gefunden wird. Auf meinem Client habe ich das gleiche Problem, beim ersten Mal läuft das, alle weiteren Male nicht. Ich habe versucht, die dll mit regsvr32 zu registrieren, dabei kommt aber eine Fehlermeldung (siehe Bild).

Wie kann ich die dll registrieren ohne Fehler? Oder liegt die Ursache noch woanders, da es ja einmal läuft? PView habe ich nicht, habe aber den ProcessExplorer genommen, die dll ist nicht im Zugriff.
Gespeichert

sagt Mark.



slowfood.de
flaite
Gold Platin u.s.w. member:)
*****
Offline Offline

Beiträge: 2966


WWW
« Antworten #1 am: 23.02.06 - 09:51:59 »

Kannst du bitte mal den Source Code posten, mit dem du den JDBC Treiber initialisierst.
Es könnte ganz einfach daran liegen.
Diese Art funktioniert afaik:
Code:
Driver drv = (Driver) Class.forName("postgresql.Driver").newInstance();
Oft wird der JDBC Treiber in Beispielcode anders initialisiert.
Code:
Class.forName("postgresql.Driver");
wenn mich nicht alles täuscht.
Lange kein low level JDBC mehr benutzt.

Jedoch gibt es in einem posgres-Forum eine ähnliche Meldung, die mich überrascht:
http://archives.postgresql.org/pgsql-jdbc/2001-11/msg00225.php


Gespeichert

Ich stimm nicht mit allen überein, aber mit vielen und sowieso unterhaltsam -> https://www.youtube.com/channel/UCr9qCdqXLm2SU0BIs6d_68Q

---

Aquí no se respeta ni la ley de la selva.
(Hier respektiert man nicht einmal das Gesetz des Dschungels)

Nicanor Parra, San Fabian, Región del Bio Bio, República de Chile
qojote
Aktives Mitglied
***
Offline Offline

Beiträge: 229


I love YaBB 1G - SP1!


« Antworten #2 am: 23.02.06 - 09:55:20 »

Hi,

läuft der Agent sauber durch ?
Ich hatte vor kurzem ein ähnliches Problem wo ich mir Laufwerke über jcifs gemappt habe.
Da hatte ich das Problem das der agent immer am ende ein Problem beim beenden der Threads hatte Error cleaning up Agent Threads und dann ging das auch immer nur genau einmal.

Gruß
Qojote
Gespeichert
Mark³
Senior Mitglied
****
Offline Offline

Geschlecht: Männlich
Beiträge: 386


Nordisch by Nature


WWW
« Antworten #3 am: 23.02.06 - 09:58:58 »

das ist zwar ein gutes Forum hier, aber solch spezielle Sachen sucht man natürlich besser im zugehörigen Forum. Aber einige Java-Freaks finden das ja vielleicht interessant. Es scheint eingrundsätzliches Problem mit dem Laden von DLLs zu geben:

http://sourceforge.net/forum/message.php?msg_id=3321709

Das ist wohl auch der Grund dafür dass Microsoft seinen neuesten Treiber nun doch ohne Windows Authentizierung rausgebracht hat (obwohl es vorher angekündigt war dass es drin ist). Die dll wird einmalig geladen als Singleton und kann scheinbar nicht wieder entladen werden, ausser bei Neustart der VM. Dies ist bei Notes-Agenten natürlich nicht so günstig, ich muss glaube ich den Notes-Server neu starten damit die VM neu startet. Ich könnte natürlich für meine Importe einen Java Servertask nehmen der bei Serverstart startet und immer läuft, das erscheint mir aber doch irgendwie unelegant. Also doch wieder Export / Import von csv mit Agenten (oder vielleicht ein ADODB Objekt in Lotusscript, hab ich auch mal benutzt aber die Programmierung davon im Notes Designer ist sehr umständlich). Schade, in Java ging das alles so schön leicht  Cry
Für LEI und sowas benötigt man doch eine Lizenz, oder? Sonst wäre das natürlich die ideale Anwendung dafür, aber Kosten darf das alles nix
Gespeichert

sagt Mark.



slowfood.de
Mark³
Senior Mitglied
****
Offline Offline

Geschlecht: Männlich
Beiträge: 386


Nordisch by Nature


WWW
« Antworten #4 am: 23.02.06 - 10:00:56 »

trotzdem nochmal der Sourcecode:

Code:
public class ImportSQL extends AgentBase {
private OpenLogItem oli;

private Session session;

private Database db;

private Statement qryStatement;

private Connection con;

public void NotesMain() {
oli = new OpenLogItem();
// oli.logEvent("Starting SQL import", OpenLogItem.SEVERITY_LOW, null);
session = getSession();

try {
AgentContext agentContext = session.getAgentContext();
Agent agent = agentContext.getCurrentAgent();
db = agentContext.getCurrentDatabase();
Document doc = db.getDocumentByID(agent.getParameterDocID());
if (doc != null) {
String dbServer = doc.getItemValueString("DBSERVER");
String dbName = doc.getItemValueString("DBNAME");
String query = doc.getItemValueString("QUERY");
String debug = doc.getItemValueString("DEBUG");
String connectionString = "jdbc:jtds:sqlserver://" + dbServer
+ ":1433/" + dbName;
if (debug.equalsIgnoreCase("true"))
oli.logEvent("Connection string = " + connectionString,
OpenLogItem.SEVERITY_LOW, null);
Class.forName("net.sourceforge.jtds.jdbc.Driver");
con = DriverManager.getConnection(connectionString);

createStatement();
ResultSet rs = getRows(query);

ResultSetMetaData rsmd = rs.getMetaData();
int i, n = rsmd.getColumnCount();

while (rs.next()) {
Document docCur = db.createDocument();
docCur.appendItemValue("Form", "SQLImport");
docCur.appendItemValue("Table", rsmd.getTableName(1));

for (i = 1; i <= n; i++) {

// Attention: first column with 1 instead of 0
docCur.appendItemValue(rsmd.getColumnName(i), rs
.getString(i));

}
docCur.save();
}
con.close();
doc.remove(true);
}
} catch (Exception e) {
oli.logError(e);
} finally {
con = null;
oli.recycle();
try {
session.recycle();
} catch (NotesException e) {
e.printStackTrace();
}
}

}

private void createStatement() {
try {
qryStatement = con.createStatement(
ResultSet.TYPE_SCROLL_INSENSITIVE,
ResultSet.CONCUR_READ_ONLY);
// qryStatement.setFetchSize(100);
} catch (SQLException e) {
oli.logError(e);
}

}

private ResultSet getRows(String sqlStatement) {
ResultSet rs = null;

try {
rs = qryStatement.executeQuery(sqlStatement);

} catch (SQLException e) {
oli.logError(e);
}
return rs;

}
}

Ja, die Error cleaning up agent threads bekomme ich auch oft (hier allerdings nicht  Grin)
Gespeichert

sagt Mark.



slowfood.de
qojote
Aktives Mitglied
***
Offline Offline

Beiträge: 229


I love YaBB 1G - SP1!


« Antworten #5 am: 23.02.06 - 10:39:38 »

Hi,

Frage für was brauchst du denn die DLL ?
Ich mach sowas auch öfter aber gegen eine DB2 bei Ms Sql hab ich keine Ahnung daher die Frage.
Bei einer DB2 gibst du einfach die Anmeldung im Code beim Connect zur Datenbank mit geht das bei MS SQL nicht ?
Eine Möglichkeit wäre auch nocht das du auf dem Server eine ODBC Verbindung zur Datenabkank einzurichtest
und dann über die ODBC JDBC Brigde darauf zugreifts.

Gruß
Qojote
Gespeichert
Mark³
Senior Mitglied
****
Offline Offline

Geschlecht: Männlich
Beiträge: 386


Nordisch by Nature


WWW
« Antworten #6 am: 23.02.06 - 10:53:25 »

Die dll benötige ich für die Authentizierung (auch Authentifizierung genannt) am SQL-Server. Wenn der SQL-Server im Mixed-Mode läuft kann man sich sowohl über User+Passwort als auch über SSPI anmelden (Integrated Security, also die Anmelderechte des momentan angemeldeten Windows-Users).
Unser SQL-Server läuft aber im Windows-Mode, soll heißen man kann sich nicht über die Kombination User+Passwort anmelden sondern man muss die 'Integrated Security' nehmen. Das ist eigentlich sehr praktisch nur leider scheint die Technik auf dem Java-Sektor dazu nicht ganz ausgereift zu sein wenn nicht einmal Microsoft das fertigbekommt  Evil
Gespeichert

sagt Mark.



slowfood.de
Mark³
Senior Mitglied
****
Offline Offline

Geschlecht: Männlich
Beiträge: 386


Nordisch by Nature


WWW
« Antworten #7 am: 23.02.06 - 11:02:38 »

übrigens habe ich die ntlmauth.dll nun doch im Prozessexplorer (von Sysinternals) gefunden. Notes startet eine JVM, diese hält dann einen Handle auf die dll und gibt ihn nicht wieder her...

Gespeichert

sagt Mark.



slowfood.de
Mark³
Senior Mitglied
****
Offline Offline

Geschlecht: Männlich
Beiträge: 386


Nordisch by Nature


WWW
« Antworten #8 am: 23.02.06 - 12:14:56 »

habs nun doch mit OLEDB gemacht, ist langsamer als mit Java, aber für meine Zwecke auch sehr übersichtlich:

Code:
Function getSQL( ) As Boolean
'Liefert True wenn eine Person gefunden wird auf die ein Gerät mit Hostname läuft
'sonst False
On Error Goto ProcessError
Dim RecordSet As Variant
Dim strQry As String
Dim con As Variant
Dim intCount As Integer
Dim lngCount As Long
Dim strTemp As String
Dim arrValues() As String
Dim doc As NotesDocument
Dim strCon As String

Set con=createobject("ADODB.Connection")
strCon = "Provider=SQLOLEDB;" & _
"Data Source=" & DBSERVER & ";" & _
"Initial Catalog=" & DBNAME & ";" & _
"Integrated Security=SSPI"

Call LogEvent(strCon + ": " + QUERY, TYPE_EVENT,Nothing)
con.Open strCon

Set RecordSet = CreateObject("ADODB.Recordset")
RecordSet.Open QUERY,con,2,1
RecordSet.MoveFirst

Do While Not RecordSet.EOF
Set doc = db.CreateDocument
Call doc.AppendItemValue("Form", "SQLImport")
Call doc.AppendItemValue("Table", "PERSON")
Call doc.AppendItemValue("EMPLOYEE_NUMBER", RecordSet.Fields(0).Value)
Call doc.AppendItemValue("FIRST_NAME", RecordSet.Fields(1).Value)
Call doc.AppendItemValue("MIDDLE_NAME", RecordSet.Fields(2).Value)
Call doc.AppendItemValue("LAST_NAME", RecordSet.Fields(3).Value)
Call doc.AppendItemValue("NOTES_MAIL", RecordSet.Fields(4).Value)
Call doc.AppendItemValue("COSTCENTRE", RecordSet.Fields(5).Value)
Call doc.AppendItemValue("CC_NAME", RecordSet.Fields(6).Value)
Call doc.AppendItemValue("LOCATION", RecordSet.Fields(7).Value)
Call doc.AppendItemValue("PHONE", RecordSet.Fields(8).Value)
Call doc.Save(True, False)
RecordSet.MoveNext
Loop

RecordSet.close
con.close

GetSQL = True
Exit Function
ProcessError:
Msgbox LogError()
getSQL = False
Exit Function
End Function
Gespeichert

sagt Mark.



slowfood.de
Seiten: [1] Nach oben Drucken 
« vorheriges nächstes »
Gehe zu:  


Einloggen mit Benutzername, Passwort und Sitzungslänge

Powered by MySQL Powered by PHP Powered by SMF 1.1.21 | SMF © 2006, Simple Machines Prüfe XHTML 1.0 Prüfe CSS
Impressum Atnotes.de - Powered by Syslords Solutions - Datenschutz | Partner: