Supportnet / Forum / Anwendungen(Java,C++...)
JAVA: Anwendung aus Applet starten?
Frage
Hallo Java Z ich es leider bisher nicht anders realisieren konnte, eine *.EXE Anwendung mit mehreren Parametern aus einer Webanwendung heraus zu starten, dachte ich dass es mit einem Applett soch sicher gehen müsste.
Was ich will ist folgenden Programmaufruf starten:
z.B.
c:\remote.exe 2 139.139.100.1
Per Browser geht das mit den Parametern leider nicht.
Kann man es per Java Applet? Wenn nicht, weiß jemand wie es sonst klappen könnte?
Danke & Gruß, Markus
Antwort 1 von semi
Du tust es sicherlich wie folgt:
Die Sicherheitseinstellungen des Browsers erlauben es leider nicht, Programme auszuführen.
Dies funktioniert nur mit signierten Applets, die auch ein gültiges Zertifikat und entsprechende policy-Einstellungen haben.
Was für "böse" Absichten hast Du mit remote.exe vor? :-)
Gruß,
Michael
try {
Runtime.getRuntime().exec("c:\remote.exe 2 139.139.100.1");
}
catch(SecurityException e) {
System.err.print(e.getMessage());
e.printStackTrace();
}
catch(IOException e) {
System.err.print(e.getMessage());
e.printStackTrace();
}
Die Sicherheitseinstellungen des Browsers erlauben es leider nicht, Programme auszuführen.
Dies funktioniert nur mit signierten Applets, die auch ein gültiges Zertifikat und entsprechende policy-Einstellungen haben.
Was für "böse" Absichten hast Du mit remote.exe vor? :-)
Gruß,
Michael
Antwort 2 von markusp
Gar keine.
Es geht darum das Remote Control von MS-SMS Server direkt aus der Seite im Browser zu starten, die ein Problem eines hausinternen Users an einen Mitarbeiter meldet. Sich per Maus in die MMC zu klicken, den Rechner (unter 3000) rauszusuchen und dann endlich irgendwann das Remote Tool zu starten ist so umständlich, dass ich es über den direkten Aufruf gleich aus der Seite starten will.
Klartext: Es handelt sich um eine INTRANETseite - dort kann man die Sicherheitseinstellung ruhig etwas senken... Kann ich den geposteten Teil nun benutzen?
Danke & Gruß, Markus
Es geht darum das Remote Control von MS-SMS Server direkt aus der Seite im Browser zu starten, die ein Problem eines hausinternen Users an einen Mitarbeiter meldet. Sich per Maus in die MMC zu klicken, den Rechner (unter 3000) rauszusuchen und dann endlich irgendwann das Remote Tool zu starten ist so umständlich, dass ich es über den direkten Aufruf gleich aus der Seite starten will.
Klartext: Es handelt sich um eine INTRANETseite - dort kann man die Sicherheitseinstellung ruhig etwas senken... Kann ich den geposteten Teil nun benutzen?
Danke & Gruß, Markus
Antwort 3 von markusp
Und noch eine Frage:
Das Verzeichnis c:\irgendwas\remote.exe
wird es auf dem Webserver oder am Client gesucht??
Das Verzeichnis c:\irgendwas\remote.exe
wird es auf dem Webserver oder am Client gesucht??
Antwort 4 von MixMax
das würde da ausgeführt wo was applet läuft also am client.
Antwort 5 von semi
Das Verzeichnis wird auf dem Client-Rechner gesucht.
Ich würde es an Deiner Stelle lieber als kleine Socket-Anwendung machen, die an einem bestimmten Port lauscht und bei Bedarf die benötigten Programme startet.
Du könntest es dann so flexibel machen, dass Du ganze Batch-Jobs im Hintergrund ausführen könntest.
Aber egal.
So wie es oben steht, kannst Du es im Applet verwenden. Damit es auch funktioniert, mussen auf dem Client die Sicherheitseinstellungen angepasst werden. Es reicht nicht im Browser "minimale Sicherheit", oder wie auch immer es bei IE heisst, zu setzen.
Es sollte im Verzeichnis des JRE erfolgen, dass im Browser verwendet wird.
Es ist die Datei
....jre\lib\security\java.policy
Ich würde es an Deiner Stelle lieber als kleine Socket-Anwendung machen, die an einem bestimmten Port lauscht und bei Bedarf die benötigten Programme startet.
Du könntest es dann so flexibel machen, dass Du ganze Batch-Jobs im Hintergrund ausführen könntest.
Aber egal.
So wie es oben steht, kannst Du es im Applet verwenden. Damit es auch funktioniert, mussen auf dem Client die Sicherheitseinstellungen angepasst werden. Es reicht nicht im Browser "minimale Sicherheit", oder wie auch immer es bei IE heisst, zu setzen.
Es sollte im Verzeichnis des JRE erfolgen, dass im Browser verwendet wird.
Es ist die Datei
....jre\lib\security\java.policy
Antwort 6 von semi
Mit der folgenden Einstellung solltest Du alle Rechte auf dem Client-Rechner bekommen.
Gruß,
Michael
grant codeBase "http://www.deinedomain.de/*"; {
permission java.security.AllPermission;
};
Gruß,
Michael
Antwort 7 von markusp
Vielen Dank !! Ich werde es gleich morgen mal ausprobieren, wenn ich an einen compiler rankomme ... !
Antwort 8 von semi
Ich habe mich vertippt.
Mach das Semikolon am Ende der ersten Zeile, vor { weg.
Mach das Semikolon am Ende der ersten Zeile, vor { weg.
Antwort 9 von markusp
Also das ist mir jetzt alles etwas zu hoch.
Ich habe mir j2sdk-1_4_0_01-windows-i586.exe. gesaugt und installiert.
Dann den PATH auf die JAVAC.exe gesetzt.
Dann den von Dir geposteten Quellcode unter Berücksichtigung Deiner Korrektur in eine Textdatei gehauen und als *.class gespeichert. Soweit ich mich erinnere macht man das so.
Nun habe ich javac.exe xy.class aufgerufen.
Es erscheint ein Programmfehler bei javac.exe und win2000 schießt den Task ab.
Was das mein Fehler??
Ich habe mir j2sdk-1_4_0_01-windows-i586.exe. gesaugt und installiert.
Dann den PATH auf die JAVAC.exe gesetzt.
Dann den von Dir geposteten Quellcode unter Berücksichtigung Deiner Korrektur in eine Textdatei gehauen und als *.class gespeichert. Soweit ich mich erinnere macht man das so.
Nun habe ich javac.exe xy.class aufgerufen.
Es erscheint ein Programmfehler bei javac.exe und win2000 schießt den Task ab.
Was das mein Fehler??
Antwort 10 von semi
:-) S-hit happens.
Warte etwas, ich schreibe ein kleines Beispiel.
Warte etwas, ich schreibe ein kleines Beispiel.
Antwort 11 von markusp
Das wäre super... das ich zuletzt was mit JAVA gemacht habe ist lange her... da gab es noch kein Windows 2000 und wirklich selber programmiert hab ich das damals auch nicht :-)
Antwort 12 von semi
OK. Habe lange überlegt, was ich zur Demo aufrufen soll. format c: :-)
Hier die Java-Klasse des Applets:
Übersetzen mit: javac ExecTest.java
Jetzt die Seite des Applets (ExecTest.html):
An der fett markierten Stelle kannst du Deinen Befehl setzen.
Dann in c:\Programme\Java\JRE###\lib\security\java.policy folgendes Eintragen:
Webserver starten.
Im IE
http://localhost/ExecTest.html
Gruß,
Michael
Hier die Java-Klasse des Applets:
public class ExecTest extends java.applet.Applet {
public ExecTest() {
super();
}
public void init() {
try {
Runtime.getRuntime().exec(getParameter("command"));
}
catch(Exception e) {
System.err.print(e.getMessage());
e.printStackTrace();
}
}
}
...als ExecTest.java speichern.Übersetzen mit: javac ExecTest.java
Jetzt die Seite des Applets (ExecTest.html):
<html>
<body>
<applet codebase="." code="ExecTest" style="display:none">
<param name="command" value="c:\winnt\system32\notepad.exe c:\winnt\win.ini">
</applet>
</body>
</html>
An der fett markierten Stelle kannst du Deinen Befehl setzen.
Dann in c:\Programme\Java\JRE###\lib\security\java.policy folgendes Eintragen:
grant codeBase "http://localhost/-" {
permission java.security.AllPermission;
};
Webserver starten.
Im IE
http://localhost/ExecTest.html
Gruß,
Michael
Antwort 13 von semi
Alternativ, wenn Du es nicht über den lokalen Server laufen läßt, kannst Du in java.policy direkt ein Verzeichnis angeben. z.B:
Gruß,
Michael
grant codeBase "file://c:/temp/exectest/*" {
permission java.security.AllPermission;
};
Das bedeutet für das Java-Plugin, alles, was in "c:/temp/exectest/" steht, hat vollen Zugriff auf das System.Gruß,
Michael
Antwort 14 von markusp
Danke erstmal für die Mühe!
Soweit alles nachvollziehbar. Leider hab ich noch ein Problem: Wenn ich die HTML Seite aufrufe, dann erscheint "Installation bei Bedarf" - Fenster, dass anbietet die Java Virtual Machine runterzuladen. Das funktioniert aber nicht, Fehlermldg: "Die Komponente die Sie installieren möchten ist durch Systemkomponente geschützt oder kann nur mit neuerer Version des Betriebssystems oder Service Packs aktualisiert werden." Habe Win2000 SP2. Was nu?
Soweit alles nachvollziehbar. Leider hab ich noch ein Problem: Wenn ich die HTML Seite aufrufe, dann erscheint "Installation bei Bedarf" - Fenster, dass anbietet die Java Virtual Machine runterzuladen. Das funktioniert aber nicht, Fehlermldg: "Die Komponente die Sie installieren möchten ist durch Systemkomponente geschützt oder kann nur mit neuerer Version des Betriebssystems oder Service Packs aktualisiert werden." Habe Win2000 SP2. Was nu?
Antwort 15 von semi
Antwort 16 von markusp
Hab noch ein Rechte Problem:
Die Dateien liegen auf einem webserver (ein zweites Gerät). "wwwroot/SMS"
Meldung:
access denied (java.io.FilePermission C:\WINNT\notepad.exe execute)java.security.AccessControlException: access denied (java.io.FilePermission C:\WINNT\notepad.exe execute)
at java.security.AccessControlContext.checkPermission(Unknown Source)
at java.security.AccessController.checkPermission(Unknown Source)
at java.lang.SecurityManager.checkPermission(Unknown Source)
at java.lang.SecurityManager.checkExec(Unknown Source)
at java.lang.Runtime.exec(Unknown Source)
at java.lang.Runtime.exec(Unknown Source)
at java.lang.Runtime.exec(Unknown Source)
at java.lang.Runtime.exec(Unknown Source)
at exectest.init(exectest.java:7)
at sun.applet.AppletPanel.run(Unknown Source)
at java.lang.Thread.run(Unknown Source)
**********************
die policy beinhaltet:
grant codeBase "http://ktkrw1029/*" {
permission java.security.AllPermission;
};
grant codeBase "file://C:/test/*" {
permission java.security.AllPermission;
};
In Deinem Code steht einmal http://localhost/-" mit "-" und einmal domain.de/* mit "*" - welches stimmt? Beide gehen nicht.
Ne Idee was noch nicht stimmt?
Die Dateien liegen auf einem webserver (ein zweites Gerät). "wwwroot/SMS"
Meldung:
access denied (java.io.FilePermission C:\WINNT\notepad.exe execute)java.security.AccessControlException: access denied (java.io.FilePermission C:\WINNT\notepad.exe execute)
at java.security.AccessControlContext.checkPermission(Unknown Source)
at java.security.AccessController.checkPermission(Unknown Source)
at java.lang.SecurityManager.checkPermission(Unknown Source)
at java.lang.SecurityManager.checkExec(Unknown Source)
at java.lang.Runtime.exec(Unknown Source)
at java.lang.Runtime.exec(Unknown Source)
at java.lang.Runtime.exec(Unknown Source)
at java.lang.Runtime.exec(Unknown Source)
at exectest.init(exectest.java:7)
at sun.applet.AppletPanel.run(Unknown Source)
at java.lang.Thread.run(Unknown Source)
**********************
die policy beinhaltet:
grant codeBase "http://ktkrw1029/*" {
permission java.security.AllPermission;
};
grant codeBase "file://C:/test/*" {
permission java.security.AllPermission;
};
In Deinem Code steht einmal http://localhost/-" mit "-" und einmal domain.de/* mit "*" - welches stimmt? Beide gehen nicht.
Ne Idee was noch nicht stimmt?
Antwort 17 von semi
Versuche es mal mit
Ich gehe davon aus, dass Dein Java-Plugin installiert ist und auf das JRE (auf dem Client-Rechner) in c:\Programme\Java\JRE.... zugreift und Du auch die entsprechende policy-Datei in diesem Verzeichnis meinst.
(Siehe Systemsteuerung->Java-Plugin-Erweitert)
Außerdem sieht der Aufruf im IE, in etwa, wie folgt aus:
http://ktkrw1029/exectest.html
grant codeBase "http://ktkrw1029/-" {
permission java.security.AllPermission;
};
Ich gehe davon aus, dass Dein Java-Plugin installiert ist und auf das JRE (auf dem Client-Rechner) in c:\Programme\Java\JRE.... zugreift und Du auch die entsprechende policy-Datei in diesem Verzeichnis meinst.
(Siehe Systemsteuerung->Java-Plugin-Erweitert)
Außerdem sieht der Aufruf im IE, in etwa, wie folgt aus:
http://ktkrw1029/exectest.html
Antwort 18 von markusp
Super es funktioniert tatsächlich! Danke!!!!!!!!
Aber leider gehts nur auf dem Testserver (1029).
Das Produktivsystem will nicht.
Es ist ein Webserver mit eigenem DNS-Eintrag im Netzwerk, nennen wir ihn mal "PETER".
Nach Änderung der Sicherheitseinstellung möchte
"http://peter/exectest.htm"
aber eine Authentifizierung, und zwar im Stil des Java Plugin (es ist auch eine Tasse im Fenster abgebildet), und er zeigt:
Firewall: peter/IP von Peter
Bereich: peter
Schema: digest
Benutzername [ ]
passwort: [ ]
Ne Idee woher dies nun wieder kommen kann? Die Sicherheitseinstellungen vom Web können es doch nicht sein oder? Ich habe domänen Admin Rechte.
Gruß, Markus
Aber leider gehts nur auf dem Testserver (1029).
Das Produktivsystem will nicht.
Es ist ein Webserver mit eigenem DNS-Eintrag im Netzwerk, nennen wir ihn mal "PETER".
Nach Änderung der Sicherheitseinstellung möchte
"http://peter/exectest.htm"
aber eine Authentifizierung, und zwar im Stil des Java Plugin (es ist auch eine Tasse im Fenster abgebildet), und er zeigt:
Firewall: peter/IP von Peter
Bereich: peter
Schema: digest
Benutzername [ ]
passwort: [ ]
Ne Idee woher dies nun wieder kommen kann? Die Sicherheitseinstellungen vom Web können es doch nicht sein oder? Ich habe domänen Admin Rechte.
Gruß, Markus
Antwort 19 von semi
Versuche es mit verschiedenen Einstellungen. Du kannst auch mehrere grant ... Einträge in die Policy-Datei schreiben.
codeBase "http://*.domain.de:*/*"
codeBase "http://*.123.456.3.11.de:*/*"
usw.
codeBase "http://*.domain.de:*/*"
codeBase "http://*.123.456.3.11.de:*/*"
usw.
Antwort 20 von MarkusP
So, nun hab ich es endlich. Am IIS war "Anonym" deaktiviert, darum kam diese Netzwerk-Kenwort Kacke.
Eine letzte Frage hab ich aber noch: Wenn ich nun möchte, dass das der Dir gepostete Programmteil (also das Ausführen von z.B. notepad.exe) erst dann passiert, wenn ich in das Applet reinklicke?
Du hast bei mir was gut !!!
Eine letzte Frage hab ich aber noch: Wenn ich nun möchte, dass das der Dir gepostete Programmteil (also das Ausführen von z.B. notepad.exe) erst dann passiert, wenn ich in das Applet reinklicke?
Du hast bei mir was gut !!!
Antwort 21 von semi
AppLauncher.java
So kannst Du es mit Javascript bei Bedarf aufrufen.
Beachte aber, dass dieses mayscript im Applet-Tag vorhanden ist und dass Verzeichnisspfade mit \\ geschrieben werden.
Gruß,
Michael
public class AppLauncher extends java.applet.Applet {
public AppLauncher() {
super();
}
public void exec(String cmd) {
try {
Runtime.getRuntime().exec(cmd);
}
catch(Exception e) {
System.err.print(e.getMessage());
e.printStackTrace();
}
}
}
AppLauncher.html
<html>
<body>
<applet mayscript codebase="." code="AppLauncher" width=0 height=0 style="display:none">
</applet>
<form>
<input type=button value="Notepad"
onClick="Javascript:document.applets[0].exec('c:\\winnt\\system32\\notepad.exe')">
<input type=button value="Calc"
onClick="Javascript:document.applets[0].exec('c:\\winnt\\system32\\calc.exe')">
</form>
<a href="Javascript:document.applets[0].exec('c:\\winnt\\system32\\mspaint.exe')">
MS Paint</a>
</body>
</html>
So kannst Du es mit Javascript bei Bedarf aufrufen.
Beachte aber, dass dieses mayscript im Applet-Tag vorhanden ist und dass Verzeichnisspfade mit \\ geschrieben werden.
Gruß,
Michael
Antwort 22 von semi
Vielleicht noch eine Bemerkung.
Ursprünglich wolltest Du die Sicherheitseinstellunge nur für Deinen Rechner etwas lockern.
Erlaube in der Policy-Datei nicht zu viel und beschränke es auf Adressen aus dem Intranet, da sonst alle Applets ziemlich viel Spielraum bekommen.
Was man alles ausführen könnte, kannst Du Dir sicherlich vorstellen.
Es ist dann so, als ob man jedem den vollen Zugriff auf den Rechner geben würde.
Ursprünglich wolltest Du die Sicherheitseinstellunge nur für Deinen Rechner etwas lockern.
Erlaube in der Policy-Datei nicht zu viel und beschränke es auf Adressen aus dem Intranet, da sonst alle Applets ziemlich viel Spielraum bekommen.
Was man alles ausführen könnte, kannst Du Dir sicherlich vorstellen.
Es ist dann so, als ob man jedem den vollen Zugriff auf den Rechner geben würde.