Merius: exec() Zugriff verweigert!

Ich möchte mittels einem PHP Script ein Programm ausführen (Windows Vista!) und bekomme folgende Meldung:

Fatal error: Uncaught exception 'com_exception' with message '<b>Source:</b> WshShell.Exec<br/><b>Description:</b> Zugriff verweigert ' in W:\htdocs\ocr\cmd_test.php:7 Stack trace: #0 W:\htdocs\ocr\cmd_test.php(7): com->Exec('W:\TopOCR?opocr...') #1 {main} thrown in W:\htdocs\ocr\cmd_test.php on line 7

W:\TopOCR\topocr
Ist der Ort der exe die ich ausführen will.

W:\htdocs\ocr\test1.txt
Ist das Server-Verzeichnis in dem ich dem das Skript liegt und der Output abgespeichert werden soll

Der Code sieht so aus:

$runCommand = "W:\TopOCR\topocr W:\TopOCR\test.jpg -LANGUAGE GRM W:\htdocs\ocr\test1.txt";  
$WshShell = new COM("WScript.Shell");  
$output = $WshShell->Exec($runCommand)->StdOut->ReadAll;

Der Aufruf von "W:\TopOCR\topocr W:\TopOCR\test.jpg -LANGUAGE GRM W:\htdocs\ocr\test1.txt" in der cmd Konsole des Servers liefert die erwünschte Ausgabe, führe ich das selbe aber über den PHP Code aus scheine ich keine Zugriffsrechte zu haben.

Ich könnte mir vorstellen, dass es daran liegt dass der Apache Server sich mit einem Anonymen Benutzer anmeldet wenn er mit Exec das Kommando ausführen will und dadurch keine Rechte dazu hat.

Würde mich freuen wenn mir jemand sagen könnte ob ich damit richtig liege und wenn ja wie ich es umgehen kann.

Ich bin mir des Sicherheitsrisikos durchaus bewusst, da das Skript aber nie online gehen wird und immer auf meinem lokalen Server bleibt ist das Risiko relativ gering!

  1. Habe durch googlen jetzt folgendes gefunden:

    $command = system('call W:\TopOCR\topocr W:\TopOCR\test.jpg -LANGUAGE GRM W:\htdocs\ocr\test1.txt')

    Dieser Befehl wird ausgeführt, warum ist mir allerdings schleierhaft.
    Hat jemand eine gute Idee? :)

    1. Hellihello

      und was ist zB. mit shell_exec(calc.exe);?

      Dank und Gruß,

      frankx

      --
      tryin to multitain  - Globus = Planet != Welt
      1. Mahlzeit,

        und was ist zB. mit shell_exec(calc.exe);?

        Macht das Sinn, shell_exec() und zusätzliche Backticks?
        Da würde doch die Ausgabe von Cals.exe als Shellbefehl ausgeführt, oder seh ich das falsch. Nach nur 2 Stunden schlaf kann ich das nicht ausschliessen ;)

        1. Hellihello

          auch wenn ich Cals.exe nicht kenne, hast du wohl recht:

          "Beschreibung
          string shell_exec ( string $cmd )

          Diese Funktion ist identisch zum Backtick-Operator."

          Also entweder, oder ...;

          Dank und Gruß,

          frankx

          --
          tryin to multitain  - Globus = Planet != Welt
          1. Hellihello Petra,

            Hellihello

            auch wenn ich Cals.exe nicht kenne, hast du wohl recht:

            "Beschreibung
            string shell_exec ( string $cmd )

            Diese Funktion ist identisch zum Backtick-Operator."

            Also entweder, oder ...;

            Obwohl es bei mir "funzte", also Calc öffnete sich.

            Dank und Gruß,

            frankx

            --
            tryin to multitain  - Globus = Planet != Welt
            1. Mahlzeit,

              Obwohl es bei mir "funzte", also Calc öffnete sich.

              Ja, davon gehe ich ja aus, da erstmal calc.exe ausgeführt wird und dann die Rückgabe durch shell_exec() gefagt wird.
              Wenn keine Rückgabe von calc.exe kommt, wird natürlich auch nichts ausgeführt. Und das dürfte hier vermutlich zutreffen.
              Somit mascht es von der Funktion keinen Unterschied, ausser dass sich die Ausführungszeit erhöht.

              So ein Konstrukt kann ja durchaus "richtig" funktionieren.

              shell_exec(start.bat);

              wenn jetzt start.bat z.B. den String "calc.exe" zurückgibt, müsste dann dur das shell_exec("calc.exe") ebenfalls der Taschenrechner gestartet werden.
              Müsste man mal testen, wenn der Inhalt von start.bat z.B.

              echo "calc.exe"

              lauten würde. Ob das sinnvoll ist, darüber lässt sich sicher streiten, aber nicht alles, was möglich ist, muss sinnvoll sein ;)
              Wieso soll es nur unter Perl solche undurchsichten Konstrukte geben *g*

    2. Moin allerseits,

      Habe durch googlen jetzt folgendes gefunden:

      $command = system('call W:\TopOCR\topocr W:\TopOCR\test.jpg -LANGUAGE GRM W:\htdocs\ocr\test1.txt')

      Dieser Befehl wird ausgeführt, warum ist mir allerdings schleierhaft.
      Hat jemand eine gute Idee? :)

      Bei mir hat es auch immer geklappt mit
      exec("start ".$pfad);
      Warum weiß ich auch nicht genau.
      Kann einer sagen, was exec() für ein Befehl ist, bzw. was sich im Hintergrund tut?

      Grüße, JN

      --
      ie:{ fl:( br:^ va:| ls:[ fo:| rl:? n4:? ss:| de:] js:| ch:? sh:( mo:| zu:)
      http://www.johny7.de
      1. Mahlzeit,

        Kann einer sagen, was exec() für ein Befehl ist, bzw. was sich im Hintergrund tut?

        Ja, die Dokumentaion des Befehls kann dir das sagen. Was im Hintergrund exakt passiert ist abhängig vom Betriebssystem.

  2. Würde mich freuen wenn mir jemand sagen könnte ob ich damit richtig liege und wenn ja wie ich es umgehen kann.

    Kannst du einfach selbst testen: wenn du volle Rechet auf Everyone/Jeder setzt und es dann klappt, ist es ein Rechteproblem. Wenns dann auch nicht funktioniert, hast du ein anderes Problem :)

  3. Hi,

    schau Dir mal genau die Farbliche Syntax da oben an.
    Dein Pfad enthält Tabs.
    Zurück zu den Anfängen und schau Dir die PHP-Syntax an.

    MfG