Ich habe scheinbar ein Problem mit dem Pipe-Zeichen und zwar versuche ich aus einem Java-Programm eine dsquery-Abfrage abzusetzen:
Code:
Process proc = rt.exec("dsquery group forestroot -name " + "\"" + gekuerzt + "\"" + " | dsget group -members");
BufferedReader is = new BufferedReader(new InputStreamReader(proc.getInputStream()));
System.out.println(is.readLine());
Gebe ich den String aus, dann wird dieser auch richtig zusammengebaut:
Code:
dsquery group forestroot -name "sn_gg_tw_lsr-intern" | dsget group -members
Mein Problem ist nun, dass mir der InputStream ständig "null" liefert, obschon die Abfrage definitv ein Resultat liefert. Ich vermute nun, dass das Pipe-Zeichen "|" nicht richtig interpretiert wird. Lasse ich bspw. den Pipe-Teil weg (| dsget group -members), dann funktioniert die Abfrage. An der Syntax für dsquery kann es nicht liegen da ich die Abfrage in einer DOS-Box problemlos manuell absetzen kann.
Ist es möglich, dass es eine Escape-Sequenz für die Pipe gibt? Ich habe schon einige Zeit mit googeln verbracht, bin aber leider nicht fündig geworden.
dsquery ist mir grad nicht geläufig... kann es sein, das innerhalb der dos-box dafür 'ne extra "shell" (z.B. "mysql") gestartet sein muss? Wenn dem nicht so ist, versuch den String in mehrere Kommandos zu splitten (hier 2), und das ODER (pipe-zeichen) in Java umzusetzen.
Ja, das klappt so nicht. Die Pipeline ist ein Feature der Shell. Es gibt Sprachen (ich kenns nur bei Perl, aber gibt sicher noch andere), die unterstützen sowas, aber obs bei Java geht, weiß ich nicht.
Ich habe mal den ErrorStream ausgelesen und es ist tatsächlich so, dass das Pipe-Zeichen das Problem ist:
Code:
dsquery failed:`|' is an unknown parameter.
Den String in mehreren Kommandos abzusetzen funktioniert meines Wissens nicht. Zumindest habe ich bisher keine Variante finden können. Vielleicht noch eine kurze Erklärung was ich damit eigentlich möchte:
Ich lese die Berechtigungsgruppen aus einem Windows-Share aus. Anschliessend will ich die Mitglieder der Berechtigungsgruppe auslesen. Dazu benötige ich dsquery den damit suche ich im Active-Directory-Forest die entsprechende Gruppe. Diese Gruppe wird dann dsget übergeben, womit dann die Gruppenmitglieder ausgelesen werden.
Bisher habe ich keine Variante gefunden, wie ich die Abfragen separat ausführen kann.
Falls jemand von euch eine andere Variante (evtl. mit anderen externen Tools) kennt, dann wäre ich für jeden Tipp dankbar.
Ich hab wohl ein wenig gepennt. Wenn ich die Syntax von dsquery und dsget richtig anwende, dann kann ich sie auch separat ausführen und erhalte die Daten, die ich benötige. Manchmal sieht man den Wald vor lauter Bäumen nicht mehr :bahnhof:
Somit werde ich in Java zuerst dsquery ausführen um die Gruppe im Forest zu suchen. Das Resultat werde ich anschliessend in einem zweiten Process aus Java mit dsget absetzen.
Nichts desto trotz würde es mich interessieren ob es nicht doch eine Variante gibt das Pipe-Zeichen irgendwie durchzuschummeln.
Das hab' ich mir doch fast gedacht...
Nee... solange Java das besagte Zeichen als Parameter interpretiert bekommt man es wohl auch nicht durchgeschummelt. "exec()" lässt sich ja auch mit einem Command-Array ausführen. Das bringt aber nun in sofern nichts, da nur Kommandos ausgeführt werden können, die als Datei existieren (getestet). 'Nen Versuch wärs allerdings wert, einer "cmd.exe" beispielsweise, Kommandos über IO-Streams zu übermitteln (nicht getestet).