# Passwortabfrage bei Zugriff auf Zielrechner



## Airwolf89 (30. Apr 2009)

Hi Leute,

mein erster Beitrag, hoffentlich mach ich mich nit unbeliebt..


Also, ich weiß nit ob es das richtige Forum dafür ist, aber es geht um folgendes:

Bin gerade dabei mir nen Programm zu schreiben. Ist ne normale Desktopapplication, welche lediglich auf files auf nem anderen Rechner zugreifen soll. Habe jetzt erstmal die Abfrage eingerichtet damit er weiß auf welchen Pfad er zugreifen soll. Klappt auch erstmal ganz gut (mit nem JFileChooser). Wenn ih allerdings auf freigegebene Ordner auf nem anderen rechner im Netzwerk zugreifen will, dann komme ich nit auf den Zielrechner. Grund: Wenn ich im Windows Explorer auf selben Rechner zugreifen will kriege ich erstmal ne Passwortabfrage, also Benutzer und dessen Passwort von dem System. Sobald ich mich einmal eingeloggt habe auf dem anderen rechner gehts natürlich auch über mein Programm. 

Wie kann ich es jetzt einrichten dass er mich nach dem passwort und dem Benutzer des Zielrechners fragt wenn ich drauf zugreifen will? Muss ja irgendwie gehen, kann mir nit vorstellen dass das nit gehen soll. Zur Info, meine beiden Testrechner sind einer mit Windows XP Home und der andere mit Ubuntu 8.10. Das soll aber eigentlich vollkommen egal sein da es auf jedem rechner laufen soll und auf jedes OS zugreifen können soll. Natürlich handelt es sich nicht immer um den selben rechner und um den selben Ordner, muss daher direkt bei der auswahl des Ordners ablaufen. Habe zumindest noch nit gehört dass java die Gedanken vom User lesen kann, von daher.... 

Wie kann ich sowas realisieren?

Danke im voraus.


----------



## sparrow (30. Apr 2009)

Der JFileChooser greift ja auf das Deteisystem zu, dieses wird durch das Betriebssystem zur Verfügung gestellt.
Du musst also entweder das entsprechende Netwerkprotokoll einbauen/ansprechen oder das entfernte Dateisystem entsprechend in das Dateisystem bringen. Linux: Netzwerkfreigabe mounten; Windows: Netzlaufwerk verbinden.

Gruß
Sparrow


----------



## Airwolf89 (1. Mai 2009)

Hmm, okay, Netzwerkprotokoll einbauen, kannste mir da nen paar Stichpunkte geben wonach ich gezielt suchen kann? Also außer "java Netzwerkprotokoll einbinden"?

Danke im voraus.


----------



## sparrow (1. Mai 2009)

Wenn du mir sagst auf was genau du zugreifen möchtest?

Falls das Windows-Freigaben sind, das Protokoll schimpft sich Server Message Block ? Wikipedia .

Aber wie gesagt, eigentlich ist es Aufgabe des Betriebssystems dir das Netzwerk zur Verfügung zu stellen.


----------



## Airwolf89 (1. Mai 2009)

Naja, Ziel ist es eine Ordnersynchronisation zu programmieren. Also dass ich das Programm starte den Source-Ordner auswähle, das Ziel angebe, aufs Knöpfchen drücke und dann der Inhalt synchronisiert wird. Soll halt von Linux aus klappen und auch von Windows Seite, sprich, komplett OS-unabhängig. Das ist das Ziel.


----------



## sparrow (1. Mai 2009)

Nun, da sehe ich 2 Möglichkeiten:

1) Du programmierst ein Tool dem du entsprechende Ordner angibst. Du sorgst dich also nur darum zu synchronisieren (zeit, letzte Änderung der Datei, etc.) und überlässt den Netzwerkkram dem Betriebssystem.
Vorteil: Dein Programm würde auch Ordner synchronisieren können die auf ein und demselben System laufen. Zum Beispiel ein Verzeichnis der Festplatte mit einem Ordner auf einem USB-Stick, denn es gibt dank der Transparenz der eingehängten Dateisysteme keinen Unterschied ob es ein lokales oder entferntes Dateisystem ist.

2) Du schreibst ein Programm das speziell darauf ausgerichtet ist über das Netzwerk zu synchronisieren. In diesem Fall würde ich so vorgehen, dass du auf jedem Programm ein eigenes Programm laufen lässt und beide miteinander kommunizieren ohne das SMB-Protokoll (oder vergleichbares) zu verwenden.


Zwanghaft einen Zugriff auf Netzwerkfreigaben programmieren zu wollen macht, meiner Ansicht nach, keinen Sinn.

Gruß
Sparrow


----------



## Airwolf89 (1. Mai 2009)

Zu Punkt 1:

Das ist ja gerade das Problem: Ich möchte dem Programm, also meinem Tool die Ordner angeben welche synchronisiert werden sollen. Aber das geht ja nit weil ich wegen der Passwortabfrage nit auf den Ordner auf dem Zielrechner komme. Dem Programm hargecodet im Quelltext zu sagen um welche Ordner es sich wo handelt ist für mich zu unflexibel.

Zu Punkt 2:

Verstehe ich das jetzt richtig dass dieser Vorschlag vorsieht auf jedem der Rechner das Programm, also mein Tool dauerhaft läuft und das eine dann jeweils auf Antwort des anderen wartet? Kannst du mir in dem Fall Stichworte nennen wonach ich suchen kann um die beide miteinander kommunizieren zu lassen?

Danke im voraus.


----------



## sparrow (1. Mai 2009)

Punkt 1:
Die Abfrage dürfte aber nicht mehr kommen wenn die Verbindung vom Betriebssystem hergestellt ist, also unter Linux: das Programm ist gemounted, unter Windows: das Netzlaufwerk ist verbunden.
Vielleicht versteh ich das mit dem Passwort auch falsch, in diesem Fall: Bitte einen Screenshot von dem was das Java-Programm macht (auch die Fehlermeldung die ein Exception.printStackTrace() ausgibt) und wie der Windows Explorer nach einen Passwort fragt.

Punkt 2:
Genau das meine ich.
www.javabuch.de - Das Handbuch der Java-Programmierung , da gibts eine kostenlose HTML-Version von dem Buch. Dort gibt es, neben einer gründlichen Einführung in die Sprache, aus Kapitel über "Sockets" und "Netzwerkkommunikation". Vielleicht ist auch RMI interessant.


Gruß
Sparrow


----------



## Airwolf89 (1. Mai 2009)

OK, also wenn ich auf windows über Netzwerkumgebung gehe, dann über das Netzwerk selbst, in die Arbeitsumgebung reingehe und meinen Rechner auswähle, dann werden mir gar keine Ordner angezeigt. Wenn ich direkt in der Netzwerkumgebung gucke dann sehe ich zwar die Ordner aber wenn ich sie auswähle kommt folgende Meldung:







Wenn ich über den Explorer gehe kommt diese Meldung:






Ja....

Wenn ich mich dann angemeldet habe dann komme ich auch ohne Pobleme über mein Programm auf die freigegebenen Ordner.

Das andere werde ich mir mal angucken, hoffentlich versteh ich das ^^


----------



## sparrow (1. Mai 2009)

Das ist die Abfrage um eine Verbindung überhaupt herstellen zu dürfen.
Wie gesagt, das kann dir das Betriebssystem abnehmen: Häng die Freigabe einfach als Netzlaufwerk ein (Explorer -> Extras -> Netzlaufwerk verbinden   glaub ich), dann hat die Freigabe einen eigenen Laufwerksbuchstaben und kein Programm (egal ob Java oder sonst etwas) ein Problem damit zu kommunizieren. Vorteil wie bereits gesagt: das Programm könnte dann auch prima Wechselmedien wie USB-Sticks oder Backup-Fesplatten synchronisieren.


----------



## Airwolf89 (1. Mai 2009)

Klar, Netzlaufwerk wäre ja kein Problem. Allerdings will ich es dem User überlassen welcher Ordner das sein soll. Wäre halt nicht wirklich komfortabel nen Netzlaufwerk einzurichten. Dann könnte ich mir die Programmierung sparen und könnte dann den Inhalt mit Copy und Paste hin und herschieben. 

Man könnte es ja vllt. so machen dass ich den User nur den Zielrechner erstmal auswählen lasse und dann mir die Passwortabfrage ausgespuckt wird. Danach kann er dann ja ohne Probleme den Ordner auswählen. Wie würde sich das realisieren lassen?


----------



## sparrow (1. Mai 2009)

Wie gesagt, das Protokoll welches Windows für Freigaben von Druckern und Verzeichnissen verwendet schimpft sich SMB.
Vielleicht hilft dir das beim googeln. Zumindest der JFileChooser wird dir aber nicht weiter helfen, denn der ist nur für das Arbeiten mit Dateisystemen gedacht, da wirst du dann entsprechend selbst tätig werden müssen. Ich glaube nicht, dass die Java Standard-Bibliothek Klassen für das ansprechen von SMB-Freigaben mit bringt.


----------



## Airwolf89 (1. Mai 2009)

Du meinst ne eigene Klasse erstellen, bzw. eine suchen, die so ziemlich das gleiche macht wie der JFileChooser aber mit den Passwortabfragen zurechtkommt?


----------



## sparrow (1. Mai 2009)

Genau.
Es ist aber nicht nur die Passwortabfrage. Anschließend müssen ja die entsprechenden Freigaben am Server angefragt werden, dieser Antwortet, etc.
Also die ganze Kommunikation.

Ich würde ja meine Variante 2 vorziehen, ich hab nämlich keine Ahnung ob es da schon was für Java gibt bzw. wie gut das SMB-Protokoll dokumentiert ist.


----------



## Airwolf89 (1. Mai 2009)

OK, danke dir. Ich werde mich mal gründlich in das Handbuch einlesen und mal schauen ob ich damit zurechtkomme. Bin erst Anfänger in Java und muss noch verdammt viel lernen. Aber ich glaube mit meinen beiden Programmen die ich gerade versuche zu schreiben habe ich schon mal zwei Bereiche in denen ich viel lernen kann und das evtl. auch auf andere Programme anwenden kann.

Aber erstmal vielen Dank für deine Hilfe. Wenns weitere Probleme gibt wende ich mich an dich und den Rest der Community. Danke.


----------



## tuxedo (4. Mai 2009)

Bei Linux heisst es SMB, bei Windows CIFS. Gemeint ist das gleiche (glaub ich). Für Java gibt es eine Library namens "JCIFS". Die kann das "Dateifreigabeprotokoll" von Windows (und Linux).

Allerdings versteh ich den Sinn nicht:

Ein Tool zum synchronisiren von Verzeichnissen.. Macht Sinn. Aber wenn es "zu viel verlangt ist" ein Netzlaufwerk zu verbinden, und, wie du sagst, man dann gleich selbst den Ordner kopieren kann und man dann solch ein Tool nicht braucht:

Wo liegt dann der Sinn des synchronisierens?

Dein Vorhaben, ohne Netzlaufwerk verbinden, zwei Ordner rechnerübergreifend zu synchronisieren ist quatsch. Selbst wenn du JCIFS hinzuziehst. 

Denn JCIFS macht nix anderes als WIndows bei der "Netzlaufwerk verbinden" aktion, bzw unter Linux beim mounten des SMB-Shares.

Also wozu das Rad neu erfinden?

Gruß
Alex


----------



## Airwolf89 (4. Mai 2009)

Naja, ich will mich jetzt nicht darauf versteifen da unbedingt nen Netzlaufwerk einzurichten. Mir geht es noch nichtmal da drum nen Programm zu erstellen das Sinn macht und man verkaufen könnte. Mir gehts nur da rum was über Java und die Techniken und Technologien zu lernen. Nebenbei kann man das ein oder andere ja vllt. auch mal gebrauchen, aber darum gehts mir nit.

Aber mal angenommen man möchte zwei Ordner synchronisieren, und die enthalten massig Daten. Wenn man in den Ordner geht, Copy Paste und kopiert alles rüber hat man viel Traffic (egal) und es dauert ewig, ich hatte mir dann gedacht dass ich es noch so einbaue dass das Programm auf das Änderungsdatum schaut und nur die bearbeiteten Dateien dann rüberschiebt. Ist ja auch viel komfortabler das Prog zu starten, die beiden Ordner auszuwählen und aufn Knöpfchen zu drücken, als per Copy Paste den ordner rüberzuschieben. Außerdem, mal angenommen es wurde in beiden Ordnern Dateien hinzugefügt, dann würden die platt gemacht werden. (Wobei das problem aufkommt was man macht wenn ein und dieselbe Datei mal auf beiden Seiten geändert wurde, aber das sind feinheiten) Also würde schon sagen dass es nen Sinn hat.

Kann man denn nicht irgendwie die aktuelle Auswahl des FileChoosers (Das was ich gerade angeklickt hab) auslesen und durch ne Abfrage jage, und dann bei Bedarf, also wenn auf nen fremden Rechner zugegriffen werden soll, dass dann sowas wie nen temporäres Netzlaufwerk erstellt wird, also dass nur während der Auswahl des Ordners der User nach dem Passwort gefragt wird um die Zugriffsberechtigung zu kriegen. Wäre das irgendwie möglich, quasi dass jede Auswahl im Dialog vom FileChooser an dieses JCIFS geschickt wird, der guckt isses nen fremder Rechner, wenn ja wird nach dem PW gefragt, wenn nit is gut? Wäre für mich erstmal nen logischer Ansatz, ist die Frage ob sich das alles miteinander verträgt und ob das so zu realisieren ist.


----------



## tuxedo (4. Mai 2009)

Zum ersten Absatz:

Lernen ist immer ein guter Ansatz. Man muss nur abwägen ob es sinnvoll ist ein bist Dato perfekt rundes Rad neu zu erfinden, mit dem Ergebnis dass es nicht perfekt rund ist.

Zum zweiten Absatz:

Genau das sollte ein Sync-Tool machen. Schauen welche File geholt/kopiert werden muss und welche nicht. Ansätze gibt es hier viele. Dateidatum ist einer davon.

Zum dritten Absatz:

Das ist wieder relativ zum ersten Absatz: Der JFileChooser hat keine Kenntniss über das Dateisystem (zumindest nicht wirklich) oder den Netzwerksettings, bzw. irgendwelchen Dateifreigaben im Netzwerk. Er verlässt sich hier auf das, was ihm das Betriebssystem mitteilt. 
Der Zugriff auf eine Freigabe im UNC-Pfad Stil (also das \\meinrechner\meinefreigabe\meinordner) erfolg via Betriebssystem. D.h. der JFileChooser teilt dem OS den Pfad mit. 
Da das ganze im Windows Explorer ein bisschen "besser" integriert ist, bekommst du hier die Benutzername/Passwort abfrage. An der JVM geht dies aber offensichtlich "vorbei". Es kommt zu keiner solchen Abfrage.

Mit JCifs kannst du das ganze selbst bauen, ich weiß nur nicht ob sich das dann noch mit dem JFileChooser verträgt. Im Endeffekt müsstest du das, was der JFileChooser dir an Ordner zurückliefert parsen und auf UNC-Pfad checken. 
Damit das Tool auch unter Linux funktioniert, müsstest du vllt. noch zusätzlich zwischen C:\MeinVerzeichnis (Windows) und /MeinVerzeichnis (Linux) unterscheiden können um den UNC Pfad davon zu unterscheiden.

Im Endeffekt: Ja, mit JCifs dürfte das Möglich sein. Allerdings steht der Aufwand dahinter nicht in keiner Relation zur Betriebssystemeigenen "Netzlaufwerkverbinden" / "SMB Share mounten" Funktion. 

Ich denke zum "lernen von Techniken etc" gibt es bessere Möglichkeiten als dieses Beispiel hier. Aber du darfst es natürlich gerne versuchen.

- Alex


----------

