Exec() und Apache

Hallo,

ich habe ein kleines großes Problem.
Ich habe einen Apache Server 2.x bei mir laufen sowie ActivePerl in der neusten Version. Das funktioniert auch alles, jetzt versuche ich nur schon länger mit dem Befehl exec() von einem entfernten Rechner auf meinem Apacheserver eine beliebige Datei aufzurufen. Wenn ich dieses Programm nun manuell über die perl.exe starte, funktioniert das, wenn ich es über den Internet Explorer aufrufe dann lädt er ewig und zeigt nichts an.

Quellcode:

#!perl.exe
exec(„c:\windows\system32\notepad.exe“);
print „Geht nicht!“;

Ich habe auch schon relative Pfade wie „cgi-bin\notepad.exe“ ausprobiert, indem ich die Datei dort hin kopiert habe und habe die \ auch schon durch / ersetzt, hilft alles nichts.

Könnt ihr mir vielleicht helfen?

Vielen Dank im Vorraus,
Daniel

Hallo,

ich habe ein kleines großes Problem.
Ich habe einen Apache Server 2.x bei mir laufen sowie
ActivePerl in der neusten Version. Das funktioniert auch
alles, jetzt versuche ich nur schon länger mit dem Befehl
exec() von einem entfernten Rechner auf meinem Apacheserver
eine beliebige Datei aufzurufen.

Was bedeutet „von einem entfernten Rechner auf meinem
Apacheserver eine beliebige Datei aufzurufen.“?
Verstehe ich nicht.

Du willst praktisch an einen Rechner gehen, den
Brausser öffnen und dann soll auf dem entfernten
Rechner plötzlich Notepad auftauchen, welches aber
auf dem Rechner mit dem Webserver läuft?

Das geht nicht. Unter Windows nimmt man dazu
„Remote Desktop“. Das macht genau das.

Grüße

CMБ

Hallo,

Wenn ich dieses Programm nun
manuell über die perl.exe starte, funktioniert das, wenn ich
es über den Internet Explorer aufrufe dann lädt er ewig und
zeigt nichts an.

Und was sagt die error.log?

#!perl.exe
exec(„c:\windows\system32\notepad.exe“);
print „Geht nicht!“;

Wenn es in exec() einen Fehler gab, kannst du den Fehler auch abfragen:

#!perl.exec
my $program = 'C:\\windows\\system32\\notepad.exe';
exec($program);
# nicht vergessen einen Header zu schreiben, sonst beschwert sich der Server:
print "Content-Type: text/plain\n\n";
print "Can't launch : $!";

Zusätzlich gilt das schon gesagte: Notepad versucht eine grafische Oberfläche aufzubauen, auf dem Server => das funktioniert nicht.

Grüße,
Moritz

Nunja, dann muss ich wohl weiter ausholen.

Es geht im Endeffekt nicht darum eine Exe-Datei auszuführen sondern ein VBScript, welches auf dem Server liegt. Diese Scriptdatei ruft nun nacheinander einige Programme auf und gibt anschließend einen Rückgabewert zurück. Diesen Rückgabewert soll das Perl-Script nun entgegennehmen und in einer Variablen speichern.

Am Ende soll das ganze dann so aussehen, dass man auf die Scriptdatei auf dem Apache-Server über z.B. den Internet Explorer eines anderen Computers im Intranet zugreift, ihr einen Namen übergibt, und die Scriptdatei anschließend die entsprechende Scriptdatei auf dem Server aufruft. Diese führt dann Tests durch, anschließend wird zurückgegeben ob alles funktioniert hat. Diesen Rückgabewert vom Typen integer will ich in Perl dann wiederbekommen und in eine Variable speichern.

Wenn ihr mir helfen könntet wäre ich euch sehr dankbar. :smile:

MfG Dani

Auch hallo.

Testsystem: Windows XP, XAMPP 1.6.x, notepad.pl in /xampp/cgi-bin

notepad.pl

#!perl.exe
use strict;
use warnings;

#exec("d:\\windows\\system32\\notepad.exe");
system("d:\\windows\\system32\\notepad.exe");
print "Geht nicht!";

Aufrufen im IE und Firefox mittels http://127.0.0.1/cgi-bin/notepad.pl funktioniert schon mal ohne Probleme. Aber der IE lädt nach während Notepad ausgeführt wird.

mfg M.L.

Als kleiner Nachtrag:

Aufrufen im IE und Firefox mittels
http://127.0.0.1/cgi-bin/notepad.pl funktioniert schon mal
ohne Probleme. Aber der IE lädt nach während Notepad
ausgeführt wird.

Notepad wird dann auf dem Zielrechner (also dem Server) ausgeführt. Auf dem Clientrechner erscheint im Browser eine Fehlermeldung, wenn Notepad abgebrochen wird.

mfg M.L.

Hallo,

Es geht im Endeffekt nicht darum eine Exe-Datei auszuführen
sondern ein VBScript, welches auf dem Server liegt. Diese
Scriptdatei ruft nun nacheinander einige Programme auf und
gibt anschließend einen Rückgabewert zurück. Diesen
Rückgabewert soll das Perl-Script nun entgegennehmen und in
einer Variablen speichern.

OK

Am Ende soll das ganze dann so aussehen, dass man auf die
Scriptdatei auf dem Apache-Server über z.B. den Internet
Explorer eines anderen Computers im Intranet zugreift, ihr
einen Namen übergibt, und die Scriptdatei anschließend die
entsprechende Scriptdatei auf dem Server aufruft. Diese führt
dann Tests durch, anschließend wird zurückgegeben ob alles
funktioniert hat. Diesen Rückgabewert vom Typen integer will
ich in Perl dann wiederbekommen und in eine Variable
speichern.

Aha. Das sollte problemlos innerhalb eines CGI-Skriptes zu
machen sein, wenn das Perl-Skript a) in einem CGI-Verzeichnis
liegt (damit Apache es ausführt und nicht anzeigt) und
wenn das Skript in diesem Verzeichnis ausführbare Programme
des Servers überhaupt starten darf (Konfiguration CGI-BIN
in httpd.conf).

Ich hab mal testweise auf einer WinXP-Maschine ein
„Programm“ C:Temp\runme.bat "geschrieben, welches
wie folgt aussieht:

DIR C:\GIBTSNICHT 
@ECHO %ERRORLEVEL%

Das rufe ich über ein
perl-Skript in cgi-bin auf, welches so aussieht:

#!perl
 use strict;
 use warnings;
 use IPC::Run3;
 use CGI qw':common';

 my $q = new CGI;
 print $q-\>header, $q-\>start\_html;

 my ($in, $out, $err);
 my @prg = ( 'c:/temp/runme.bat', 'arg1', 'arg2' );
 my $s = run3( \@prg, \$in, \$out, \$err );

 print $q-\>h1('status'), $q-\>p($s);
 print $q-\>h1('stdout'), $q-\>p($out);
 print $q-\>h1('stderr'), $q-\>p($err);

 print $q-\>end\_html;

Und das zeigt auch brav
alles an was es soll. Vielleicht kannst Du das
als Startpunkt nutzen?

Grüße

CMБ

Ok, ich bin bei meinem Problem ein wenig weiter, ich weiß nun wie ich eine exe-Datei auf dem Server aufrufe, jedoch ist das Problem, dass diese als Benutzer SYSTEM ausgeführt wird, wodurch kein Desktop vorhanden ist, somit kann ich wohl auch keine Mausklicks simulieren und keinen Bereich des Bildschirmes speichern. Nun ist aber gerade das die Aufgabe meines Programms. Ich würde versuchen es als Administrator ausführen zu lassen indem ich eine EXE-Datei schreibe, welche eben dies tut, das funktioniert jedoch nicht, da die Passwortabfrage irgendwie überwunden werden muss. Da ich die cmd.exe nicht sehe, weil sie als SYSTEM-User ausgeführt wird, weiß ich nicht wie ich das Passwort übergeben soll, und ob das überhaupt funktioniert.

Könntet ihr mir sagen wie ich über den Weg eine Datei als Administrator bzw als Benutzer mit Desktop?

mfg Daniel