# Runtime.exec unter win vista?



## JosefAlten (24. Nov 2008)

ich möchte mit java cmd öffnen:


```
public static void main(String[] args) {
		Runtime rtm ;
		Process proc;
		int returnWert=1;

		try {
			rtm = Runtime.getRuntime();
			proc = rtm.exec("cmd");
			proc.waitFor();
			returnWert = proc.exitValue();
			System.out.println(returnWert);
		} catch (Exception e) {

			e.printStackTrace();
		}
		System.out.println(returnWert);
	}

}
```

leider passiert nichts, weder eine exception, noch öffnet sich cmd oder ich bekomme eine ausgabe.
woran kanns liegen?


----------



## Ice-Tea (24. Nov 2008)

Ich stand vor kurzem vor einem änlichem Problem.

Leider konnte ich es mit JAVA nicht lösen.

Aber da sie Plattformunabhängigkeit beim aufruf von "cmd" sowieso dahin ist ( außer man fragt vorher das System nach seinem Namen) kannst du es auch mit C lösen.

da reicht schon ein Befehl:

```
#include "windows.h"

using namespace deinNamesraus;

int main(array<System::String ^> ^args)
{
	return WinExec("cmd", SW_SHOW);
}
```


Ich hatte das ganze übrigens benutzt um meinem Java-Programm eine start.exe zu spendieren.


----------



## Gast (24. Nov 2008)

probiert doch beide mal 

cmd /k


----------



## Ice-Tea (24. Nov 2008)

Habs grad mal versucht -  geht nicht.
Außerdem wird ja kein Befehlt an die konsole übergeben, sondern die konsole selber wird aufgerufen

/k ist sowei wie ich weiß dazu gedacht, der konsole zu sagen sie soll sich selbst nach dem übergebenem befehl nicht schließen.

Da aber kein befehl übergeben wird sollte sich die konsole sowieso nicht schließen.

Aber nochmal zur Info: Die Konsole geht gar nicht erst auf 

Ich hab es auch schon mit einer eigenen policy und permission-all versucht - kein erfolg
Ich denke es liegt an dem neuem Rechtesystem von Windows Vista.

Um das genze zu umgehen könnte man auch eine dll erstellen, die dann über einen JAVA Wrapper (JNI) aufgerufen wird.
Solange das mit dem Rechtesystem noch probleme macht, würde ich das so lösen.

Wenn jemand den consolenbefehl für "starte als admin" unter vista kenn, könnte man diesen mit in die exe/dll packen und entsprechend sogar "admin-only" programme öffnen.

Ich hab grad mal versucht regedit.exe (ein admin-only programm) mit dem o.g. C programm zu öffnen -  geht nicht.
Das C-Programm muss explizit mit "recte Maustaste -> als Admin starten" gestartet werden, außer man setzt den haken unter eigenschaften "immer als admin öffnen"

Möglicherweise hilft hier die C funktion ShellExecute(). Die funktion an sich ist recht neu und stellt einen ersatz für WinExec dar.
Möglicherweise "weiß" diese funktion schon vorher ob es sich um ein admin-only programm handelt, ich hab jedefalls noch nicht versucht.
Denn wenn ich den befehl (regedit) in der vistaconsole eingebe, wird automatisch nach adminrechten gefragt - in meinem C-Prgogramm nicht.


----------



## FArt (25. Nov 2008)

JosefAlten hat gesagt.:
			
		

> ich möchte mit java cmd öffnen:
> 
> 
> ```
> ...



Was ist der Returnwert, oder blockiert waitFor noch?
Der Prozess gibt evtl. was auf Stdout oder Stderr aus (z.B. eine Fehlermeldung). Werte das mal aus.


----------



## SlaterB (25. Nov 2008)

unter WinXP funktioniert

proc = rtm.exec("cmd /c");

sowie

proc = rtm.exec("cmd /c regedit");

eine Konsole geht aber bei beiden nicht auf, nur das Programm bzw. Rückgabewert 0


----------



## Guest (25. Nov 2008)

zur ausgabe:

im beispielcode bekomme ich keine ausgabe, weil das programm nie beendet wird.....

mit


```
proc = rtm.exec("cmd /c");
```

öffnet sich kein programm und ich bekomme als ausgabewert 0

kann das an den sicherheitsbestimmungen von vista liegen?

Mein eigentliches Ziel ist, den Pc herunterzufahren ( shutdown.exe), das ist doch mit jedem normalen Installationsprogramm möglich, wieso nicht mit Java??


----------



## SlaterB (25. Nov 2008)

immer dieses Gemecker ohne Testen,
klingt ja fast wie eine intelligente Form von 'ich weiß von nix, bitte Lösung für alles hinschreiben',
bei dem interessanten Thema spiele ich aber mit,

shutdown.exe also, was es nicht alles gibt,
wenn man das (unter XP) in die Konsole eintippt, dann fährt der PC auch nicht runter,
dann gibts nur ne Textausgabe, genau die kommt auch bei Java
und solange man die nicht aus dem InputStream liest, gehts nicht weiter (waitFor() bleibt wieder hängen)


```
public class Test {

	public static void main(String[] args) throws Exception {
		Runtime rtm;
		Process proc;
		int returnWert = 1;

		try {
			rtm = Runtime.getRuntime();
			System.out.println("a1");
			proc = rtm.exec("cmd /c shutdown");
			System.out.println("a2");

			Thread.sleep(100);
			BufferedReader in = new BufferedReader(new InputStreamReader(proc
					.getInputStream()));
			String line = null;
			while ((line = in.readLine()) != null) {
				System.out.println("line: " + line);

			}
			proc.waitFor();
			System.out.println("a3");
			returnWert = proc.exitValue();
			System.out.println("a4");
			System.out.println(returnWert);
		} catch (Exception e) {

			e.printStackTrace();
		}
		System.out.println(returnWert);
	}

}

Ausgabe:

a1
a2
line: Syntax: shutdown [-l | -s | -r | -a] [-f] [-m \\Computer] [-t xx]
line:                  [-c "Kommentar"] [-d up:xx:yy]
line: 
line:   Keine Argumente Zeigt diese Meldung an (wie -?).
line:   -i		  Zeigt eine grafische Benutzeroberfl„che an (muss die erste
line: 		  Option sein).
line:   -l		  Abmelden (kann nicht mit der Option -m verwendet werden).
line:   -s		  F„hrt den Computer herunter.
line:   -r		  F„hrt den Computer herunter und startet ihn neu.
line:   -a		  Bricht das Herunterfahren des Systems ab.
line:   -m \\Computer   Remotecomputer zum Herunterfahren/Neustarten/Abbrechen.
line:   -t xx		  Zeitlimit f?r das Herunterfahren, in xx Sekunden.
line:   -c "Kommentar"  Kommentar f?r das Herunterfahren (maximal 127 Zeichen).
line:   -f		  Erzwingt das Schlieáen ausgef?hrter Anwendungen ohne Warnung.
line:   -d [u][p]:xx:yy Grund (Code) f?r das Herunterfahren:
line: 		  u = Benutzercode
line: 		  p = Code f?r geplantes Herunterfahren
line: 		  xx = Hauptgrund (positive ganze Zahl kleiner als 256)
line: 		  yy = Weiterer Grund (positive ganze Zahl kleiner als 65536)
a3
a4
0
0
```

cmd /c shutdown -s
führt bei mir zu einem Neustart nach einem 30 Sekunden-Countdown,
nicht gerade sicher, aber so ist eben Windows

------

falls du übrigens einfach nur ein Konsolenfenster öffnen willst, das geht ab Java 1.6 mit

Desktop.getDesktop().open(new File("C:/WINDOWS/system32/cmd.exe"));
bzw. ähnlich

------

mit 
proc = rtm.exec("cmd /c cmd");

hat man quasi eine offene Konsole ohne Fenster, die initiale Ausgabe ist bei obigen Programm


```
a1
a2
line: Microsoft Windows XP [Version 5.1.2600]
line: (C) Copyright 1985-2001 Microsoft Corp.
line:
```

und dann hängt 
proc.waitFor();
weil die Konsole natürlich nicht von selber zu geht, dann müsste man in proc.getOutputstream() nun Befehle wie 'shutdown' eintippen,


----------



## Ice-Tea (25. Nov 2008)

Wahhhnsinn!!


Ich bin begeistert! (und das kommt selten vor)



```
Desktop.getDesktop().open(new File("C:/WINDOWS/regedit.exe"));
```

fragt sogar nach Adminrechten!

Danke für diese sehr nützliche Info :toll:


----------



## thE_29 (26. Nov 2008)

Oho!
Na da werde ich meine WinRegistry mal anpassen und gucken wenn Java 1.6 Version, dann probier es so öffnen!

Muss ich gleich daheim heute testen.


----------



## HoaX (27. Nov 2008)

das Desktop von java6 stammt iirc von jdic ab, welches man auch unter java5 verwenden kann: https://jdic.dev.java.net


----------

