Ejecutar aplicación con PHP y Windows

Windows + Apache + PHP
Windows + Apache + PHP

Estos días en la oficina hemos tenido que echar mano de un windows y montarle Apache, PHP y MySQL para un proyecto que estamos desarrollando. Sí no había otra forma o windows o nada, por eso digo lo de «nunca cerrar las puertas a nadie» bueno en este caso a «nada».

Sí Windows tendrás sus cosas malas pero en este caso nos está funcionando a las mil maravillas.

Os cuento hemos desarrollado una aplicación que necesita generar un tipo concreto de ficheros que en Linux se nos hacía bastante complicado generar con la suficiente calidad y no nos quedó otro remedio que echar mano de windows.

Los problemas llegaron cuando desde el código PHP no éramos capaces de lanzar un programa, siempre nos encontrábamos con el error,

«programatal.exe» no se reconoce como un comando interno o externo,
programa o archivo por lotes ejecutable.

Buscando en Internet encontramos que teníamos que modificar en el php.ini la siguientes opciones:

  • safe_mode= off
  • safe_mode_exec_dir= On

También es necesario modificar el servicio del apache para darle permisos para permitir al servicio «interactuar con el escritorio», para ello hacemos click en el botón Inicio->Ejecutar y escribimos «Services.msc» ( sin las comillas ), se nos abrirá el «gestor de servicios» de windows, tendremos que hacer click con el botón derecho en el Apache y click en propiedades. Ahora en la ventana que se nos ha abierto haremos click en «Inicio sesión» y marcaremos la opción «Permitir a los servicios que interactúen con el escritorio».

Con estos pasos ya deberíamos poder ejecutar mediante la shell de windows un php y que éste lanze cualquier aplicación. En nuestro caso fue imposible, sí podíamos lanzar, por ejemplo, la calculadora de windows, el bloc de notas pero no una aplicación externa a windows.

Solución? La única solución que encontramos y que está funcionando perfectamente, es el crear un acceso directo al programa en la carpeta donde está nuestro fichero php.

El motivo por el cual no podíamos lanzar nuestra aplicación aún está por descubrir, la falta de tiempo no nos ha dejado investigar un poco más el por qué, aunque teóricamente es una medida de seguridad el no permitir ejecutar programas externos fuera del directorio del php que se está ejecutando.

22 respuesta a “Ejecutar aplicación con PHP y Windows”

  1. Guaw… Tengo mas de una semana buscando informacion de como poder hacer esto; y todos me daban en la cara un retundo no!!!. Yo tambien necesito ejecutar el microsoft office y servicios de mensajeria instantanea para intranet.. Espero que estos datos me ayuden a logralo!! Muchas Gracias por compartir la información!!

  2. Gran aporte.Pero me gustaria saber dentro del codigo php, que instruccion se utiliza para arrancar los diferentes programas como Microsoft Office, winamp…

    Espero esplicarme y me puedan ayudar.

    Gracias

  3. Hola Juan, para poder ejecutar aplicaciones desde PHP dispone de varios comandos:

    shell_exec();
    system();
    exec();

    Échale un vistazo al manual de PHP.

  4. Buenas noches, si alguien me puede ayudar con un problemita que tengo y no se como resolverlo se lo agradeceria muchisimo, me gustaria saber si es posible desde un enlace hacer el llamado para que una aplicacion se ejecute???

  5. Hola Jenmos, claro que sí. Es muy simple, tan solo debes incluir en tu script la llamada a cualquiera de las funciones de ejecución de comando de sistema, shell_exec, exec, system…

    Échale un vistazo al manual de PHP.

    Salu2

  6. Después de intentarlo con .bat pasandole la ruta del archivo a abrir, con el acceso directo, etc… lo he conseguido, pero con un problema. Y es que php sigue cargando o esperando una respuesta hasta que no cierres la aplicación que has ejecutado. El comando seria muy sencillo:

    – exec('start "office" "C:Program FilesMicrosoft OfficeOffice12winword.exe"',$respuesta);

    print_r($respuesta);

    pero me occure lo que os comentaba. Asique tras horar de buscar, encontré esto:

    http://www.2mdc.com/blogs/administracion-de-siste

    funciona muy bien y rápido, asique para salir del paso está muy bien.

    no me gusta el uso de aplicaciones de terceros, pero por ahora no he encontrado otro remedio.

    Por cierto, todo esto viene a raíz de intentar convertir videos a través de php y lo he conseguido con ffmepg y mencoder (para windows y linux) que permiter convertir videos y audio a través de consola.

    pagina oficial:

    http://www.ffmpeg.org/

    descargar version para windows:

    http://ffmpeg.arrozcru.org/autobuilds/

    un saludo 🙂

  7. Hola.

    En mi caso queria controlar las salidas digitales del puerto paralelo, pero a travez de botones en una web del servidor local (localhost) y funciona!

    En Win7 – 64bit enterprise, Xamp, todo funcina perfectamente, pero no con Exec, pues no hacia lo que yo queria =)

    Por si a alguien le viene bien, con el siguiente codigo y todos los pasos mencionados arriba del todo deveria funcionar !

    //Parte de Php

    //Se puede poner un auto refresco Jscript a la pagina Php

    window.self.location="/?enmodo=Dev";

    //Parte Bach -> Ejemplar.bat

    //Para encender algo:

    ECHO OFF@

    START C:programa_a_arrancar.exe

    EXIT

    //para apagar algo:

    @echo off

    taskkill /s Taller /im nombre_proceso_a_matar.exe

    exit;

    En windows xp pro tambien vale la forma de matar un proceso, pero en windows xp home la cosa cambia.

    En vez de usar TASKKILL usaremos -> TSKILL asi de simple.

    Saludos

  8. Se me olvido quitar las etiquetas de Php =), pues no se ve el codigo en el primer post :()

    $file="archivo.bat";

    $call = $file;

    pclose(popen('start /b '.($call).'', 'r'));

  9. hola, antes que nada gracias a todos por compartir problemas y soluciones. En mi caso es un "problema" lo que quiero hacer es poder abrir la aplicacion que viene por defecto en el escaner, escanear y guardar la imagen todo esto es php.. Gracias de ante mano

  10. Buena explicación me funciono todo bastante bien, con aplicaciones de windows y externas, solamente modifique

    safe_mode_exec_dir=

    Lo deje en blanco y todo perfecto

  11. Hola Alan, me alegro de que te haya funcionado el tema del "safe_mode_exec_dir" a veces es mejor dejarlo en On, pero como se suele decir…"si funciona no toques nada" 😉

  12. Hola.

    Todo funciona bien pero la aplicación corre en background no puedo mostrar la interfaces.. por ejemplo la calculadora o word corren como proceso pero no levantan sus interfaces, como hago para que se vean ?.

    Windows 7

    Wampserver

    php 5.2.11

  13. Hola Daniel, en principio debe abrirte el programa en primer plano por las pruebas que hicimos… estarás ejecutando el exec con un & al final?

  14. queria consultarles dos cosas.

    1) puedo ejecutar el exec desde un servidor y no del localhost?

    2) como determino la ruta siguiente en php:
    C:Archivos de programaWinSCPWinSCP.exe

    quiero decir

    shell_exec ( ‘C:Archivos de programaWinSCPWinSCP.exe’ );

    puedo determinar el directorio automatico de «archivos de programa» ?..y no colocar esa ruta sino que la determina con el anidado del programa WinSCP.exe-

    o sera tambien que tengo que hacer un listado de acceso directo en el escritorio y llamarlos con exec?

    espero de sus aportes

    gracias

    espero alguien me pueda ayudar

  15. Hola Omar,

    El exec lo ejecutas en la máquina local, localhost, date cuenta que todas las máquinas son localhost, espero haberme explicado. Otra cosa es que, por ejemplo, desde tu ordenador lances el ‘exec’ a una máquina remota. La verdad que nunca no lo probé lanzándolo en remoto, pero no deberías tener problema, tendrías que hacer un tubo o similar para permitir la ejecución remota de la función exec. Aunque si no se hace bien es un grave riesgo de seguridad.

    La ruta al ejecutable que quieras la tienes que poner siempre, a no ser que el fichero que quieras ejecutar esté en el PATH, que se puede llamar desde cualquier directorio sin tener que escribir la ruta completa.

    Espero haberte aclarado las dudas.

    Salu2

  16. Buenas tardes, muy bueno el post, lo que quería consultar es si puedo lanzar desde un sitio web el Bloc de Notas de windows.
    El sitio web esta funcionando en remoto… es posible esto?

    Desde ya muchas gracias!

  17. Hola Ignacio,

    En principio no podrás ejecutar una aplicación en tu pc lanzándola desde un sitio remoto, sería un grave problema de seguridad.

    Lo único sería que crearas una relación de confianza entre tu servidor remoto y el equipo donde vas a abrir el bloc de notas.

    Salu2 y gracias por tu comentario

Deja un comentario