Autor Thema: Windows-Authentizierung mit jTDS läuft nur ein Mal  (Gelesen 4362 mal)

Offline Mark³

  • Senior Mitglied
  • ****
  • Beiträge: 386
  • Geschlecht: Männlich
  • Nordisch by Nature
    • Das Leben aus der Sicht eines Menschen
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.
sagt Mark.



slowfood.de

Offline flaite

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 2.966
    • mein del.icio.us
Re: Windows-Authentizierung mit jTDS läuft nur ein Mal
« Antwort #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


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

Offline qojote

  • Aktives Mitglied
  • ***
  • Beiträge: 229
  • I love YaBB 1G - SP1!
Re: Windows-Authentizierung mit jTDS läuft nur ein Mal
« Antwort #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

Offline Mark³

  • Senior Mitglied
  • ****
  • Beiträge: 386
  • Geschlecht: Männlich
  • Nordisch by Nature
    • Das Leben aus der Sicht eines Menschen
Re: Windows-Authentizierung mit jTDS läuft nur ein Mal
« Antwort #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  :'(
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
sagt Mark.



slowfood.de

Offline Mark³

  • Senior Mitglied
  • ****
  • Beiträge: 386
  • Geschlecht: Männlich
  • Nordisch by Nature
    • Das Leben aus der Sicht eines Menschen
Re: Windows-Authentizierung mit jTDS läuft nur ein Mal
« Antwort #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  ;D)
sagt Mark.



slowfood.de

Offline qojote

  • Aktives Mitglied
  • ***
  • Beiträge: 229
  • I love YaBB 1G - SP1!
Re: Windows-Authentizierung mit jTDS läuft nur ein Mal
« Antwort #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

Offline Mark³

  • Senior Mitglied
  • ****
  • Beiträge: 386
  • Geschlecht: Männlich
  • Nordisch by Nature
    • Das Leben aus der Sicht eines Menschen
Re: Windows-Authentizierung mit jTDS läuft nur ein Mal
« Antwort #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  >:D
sagt Mark.



slowfood.de

Offline Mark³

  • Senior Mitglied
  • ****
  • Beiträge: 386
  • Geschlecht: Männlich
  • Nordisch by Nature
    • Das Leben aus der Sicht eines Menschen
Re: Windows-Authentizierung mit jTDS läuft nur ein Mal
« Antwort #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...

sagt Mark.



slowfood.de

Offline Mark³

  • Senior Mitglied
  • ****
  • Beiträge: 386
  • Geschlecht: Männlich
  • Nordisch by Nature
    • Das Leben aus der Sicht eines Menschen
Re: Windows-Authentizierung mit jTDS läuft nur ein Mal
« Antwort #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
sagt Mark.



slowfood.de

 

Impressum Atnotes.de  -  Powered by Syslords Solutions  -  Datenschutz