Problem mit dem OutputStream eines Prozesses

Status
Nicht offen für weitere Antworten.
Hi Leute,

ich versuche grad mittels runas einen CMD befehl auszuführen. Leider funktioniert das Schreiben in den OutputStream nicht wie gewünscht. Wenn ich mir den Output des Programms mittels des InputStreams des Prozesses anschaue komm ich immerhin schonmal bis zur Passwort abfrage. Aber irgendwie klappt das mit dem reinschreiben des Passworts nicht so ganz.

[HIGHLIGHT="Java"]
public void herunterFahren(String adminaccount, String adminpass) throws RemoteException {
ProcessBuilder builder = new ProcessBuilder("cmd", "/c", "runas /user:" + adminaccount + " \"shutdown -s -t 0 -f\"");
try {
Process process = builder.start();
PrintWriter writer = new PrintWriter(process.getOutputStream());
writer.println(adminpass);
writer.flush();
}
catch(IOException e) {
e.printStackTrace();
}
}
[/HIGHLIGHT]

Danke schonmal für die Hilfe..
 
Vollkommen geraten (kenn mich damit nicht aus): Solltest du nicht writer.write() nutzen?
 
"writer.println()" sollte eigentlich schon passen, da ja der cmd Befehl "runas" ein Passwort erwartet und man dies dann mit Enter bestätigen muss. Und println() macht ja genau das, es schreibt das Passwort hinein und fügt dann das Steuerzeichen für Enter hinzu.
 
Ich versuchs auch mal...
1. Möglicherweise System.out als OutputStream wegen Konsole?
2. Sicherheitsbarrieren auf account seitens Betriebssystem und / oder Java?

@Edit:
3. Eine Sicherheitsbarriere könnte sein, das "shutdown" direkt die Tastatur abfragt, und deswegen nur von dort Eingaben entgegen nimmt. -> wäre dann wohl nicht zu knacken (bzw. zu lösen).
 
Zuletzt bearbeitet von einem Moderator:
Hmm 1tens kanns nicht sein, da System.out die Konsole meines Java Programms anspricht und nicht die Konsole des fremden Prozesses.

Ich hoffe nur, dass es keine solche Sicherheitsbarriere gibt. Vielleicht kann das jemand bestätigen?
 
Tja... mit System.out hast du gewonnen...
Ich hab das mal nachvollzogen. Das erste was hätte sein können: "adminaccount" noch mal in Doublequotes wie bei "shutdown".
Das Problem ist jedoch 3. (obwohl natürlich zu keiner Zeit "shutdown" gemeint war, sondern "cmd"). Es sieht wirklich so aus, als ob "runas" eine "spezielle" Konsole öffnet, die ausschliesslich die Tastatur als Eingabegerät zulässt. Mein Versuch zeigt auch, das es "write()" mit abschliessendem CR\LF bzw. nur LF auch nicht bringt.
Code:
public void herunterfahren(String account, String pass)
{
  ProcessBuilder pb = new ProcessBuilder("cmd", "/c", "runas /user:\"" + account + "\" \"calc.exe\"");
  try {
    Process p = pb.start();
    PrintWriter pw = new PrintWriter(p.getOutputStream());
    InputStream in = p.getInputStream();
    int i;
    while((i = in.read()) != -1) System.out.write(i); // gibt die Aufforderung zur PW eingabe aus.
//  System.out.println(pass) // hätt ja sein können...
//  pw.println(pass); // keine Funktion
    pw.write(pass + "\r\n"); // pw.write(pass + "\n"); will auch nicht
    pw.flush(); // mit und ohne probiert
    pw.close(); // mit und ohne probiert
    while((i = in.read()) != -1) System.out.write(i); // keine weitere Ausgabe
  } catch(IOException e) {
    System.currentTimeMillis(); // für einen Breakpoint. Wird nicht angesprungen
  }
}
 
Zuletzt bearbeitet von einem Moderator:
Würde es funktionieren wenn ich mit einem C++ Programm die entsprechende WinAPI Funktion aufrufen würde und dieses C++ Programm wiederum über JNI aufrufe?

Ich bin mir jedoch nicht sicher ob es solch eine WinAPI Funktion gibt und falls ja, wie diese heißt.


EDIT: CreateProcessWithLogonW klingt ganz gut, könnte es mit der funktionieren?
 
Zuletzt bearbeitet:
Ich denke es sollte funktionieren, kenne mich damit aber nicht wirklich aus. Google ist recht freundlich gewesen und hat mit "winapi runas" als ersten treffer das da gefunden. 😉

Ebenius
 
Wozu denn noch selber basteln? Der link von Ebenius war doch recht hilfreich... deas Tool "lsrunas" ist im Prinzip das gleiche wie das Windows "runas" (ok fast... domain und user müssen getrennt übergeben werden, und das Passwort als Parameter). Das kostenpflichtige "lsrunase" unterstützt zusätzlich noch encryptete Passwörter. Da mich so etwas vor einiger Zeit auch mal interessierte hab' ich mal folgendes erfolgreich getestet:
Code:
public void herunterfahren(String domain, String user, String pass)
{
  ProcessBuilder pb = new ProcessBuilder("cmd", "/c", "lsrunas /user:\"" + user + "\" /password:\"" + pass +
                             "\" /domain:\"" + domain + "\" /runpath:\"C:\\\" /command:\"shutdown -s -t 0 -f\"");
  try {
    Process p = pb.start();
    InputStream in = p.getInputStream();
    int i;
    while((i = in.read()) != -1) System.out.write(i); // gibt die Aufforderung zur PW eingabe aus.
  } catch(IOException e) {
  }
}
 
Status
Nicht offen für weitere Antworten.

Zurück
Oben