none
Elegir una aplicación RRS feed

  • Pregunta

  • Buenas, he heredado una aplicación escrita en php, en estos momentos no cuestiono si está bien o mal, funciona.
    Resulta que nos hemos visto con la necesidad de cambiar el servidor. Antes usaban un pc con Windows 10, ahora un servidor con Windows Server 2016 Essentials.

    Todo funciona excepto la impresión. Para imprimir la aplicación php hace una llamada un programa escrito en Visual Studio que además de imprimir realiza otras funciones. Pues con el antiguo servidor lo imprime todo bien, con el nuevo hace todo el proceso bien, porqué he puesto mensajes a cada linia, manda la orden de imprimir pero el servidor no sabe con qué aplicación imprimir. Lo he probado con ficheros pdf, de momento.
    El servidor tiene asignado Adobe Reader como programa predeterminado para los pdf's.
    Para cada fichero a imprimir se genera una tarea en el administrador de tareas esperando la aplicación:

    El código del programa externo es este. Recibe un parámetro y usando un código php recibe todos los nombres de ficheros a imprimir, y los va imprimiendo uno a uno. Alguien sabe porqué se quedan las tareas pendientes? Muchas gracias

    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Linq;
    using System.Text;
    using System.Windows.Forms;

    using System.Diagnostics;
    using System.Drawing.Printing;
    using System.IO;
    using System.Net;



    namespace servidorDeImpresion
    {


        public partial class Form1 : Form
        {
            public Form1()
            {
                InitializeComponent();
            }


            string respuesta = "";
            string conjunto = "";
            string elPost = "";
            string laRuta = "";


            private void Form1_Load(object sender, EventArgs e)
            {
                conjunto = Program.losDatos;
                textBox1.Text = conjunto;
                Program.Logger(conjunto);
                elPost = "jQueryPost=cargarPlanosConjunto&conjunto=" + conjunto;
                Encoding enc = System.Text.Encoding.GetEncoding("ISO-8859-1");
                WebRequest request = WebRequest.Create("http://172.26.1.10:8080/elycad/php/taller.php");
                request.Method = "POST";
                byte[] byteArray = enc.GetBytes(elPost);
                request.ContentType = "application/x-www-form-urlencoded";
                request.ContentLength = byteArray.Length;
                Stream dataStream = request.GetRequestStream();
                dataStream.Write(byteArray, 0, byteArray.Length);
                dataStream.Close();
                // Recibir datos
                Program.Logger("Recibir datos"); 
                WebResponse response = request.GetResponse();
                dataStream = response.GetResponseStream();
                StreamReader reader = new StreamReader(dataStream, enc);
                string responseFromServer = reader.ReadToEnd();
                respuesta = responseFromServer;
                // Limpiar streams.
                Program.Logger("limpiar datos2");
                reader.Close();
                dataStream.Close();
                response.Close();

                PrintDialog pd = new PrintDialog();
                pd.PrinterSettings = new System.Drawing.Printing.PrinterSettings();
                pd.PrinterSettings.PrinterName = "RICOH";
                Process printjob = new Process();
                
                printjob.StartInfo.Arguments = pd.PrinterSettings.PrinterName;
                printjob.StartInfo.UseShellExecute = true;
                printjob.StartInfo.CreateNoWindow = true;
                printjob.StartInfo.WindowStyle = ProcessWindowStyle.Hidden;
                printjob.StartInfo.Verb = "PrintTo";
                Program.Logger("print");
                char[] delimiterChars = { '|' };
                string[] words = respuesta.Split(delimiterChars);
                
                foreach (string s in words)
                {
                    listBox1.Items.Add(s);
                    try
                    {
                     
                        if (s.Length == 13) laRuta = @"c:\xampp\htdocs\elycad\pdf\"; else laRuta = @"c:\xampp\htdocs\elycad\pdf2d\";
                        Program.Logger(laRuta); 
                        printjob.StartInfo.FileName = laRuta + s + ".pdf";
                        Program.Logger(laRuta + s + ".pdf");
                        printjob.Start();
                        Program.Logger("start");   
                    }
                    catch(Exception ex){
                        Program.Logger (ex.Message );
                    }
                        
                        
                      
                }
                Program.Logger("Exit");
               Application.Exit();
            }
        }
    }



    mblascog

    domingo, 15 de abril de 2018 7:31

Respuestas

  •  si yo accedo a la aplicación mediante una url, cómo sé el usuario para poderle dar permisos o asignar el Adobe?

    No, te estás confundiendo de usuario.

    No estamos hablando del usuario que introduce la url en su navegador y navega a la aplicación, sino la cuenta de sistema que ejecuta el código en el lado servidor cuando alguien navega a esa URL.

    Si estás depurando la aplicación en modo local en tu propio PC, típicamente el usuario que ejecuta el código servidor eres tú mismo, y lógicamente tienes todo adecuadamente configurado con los permisos necesarios y con las aplicaciones asignadas.

    Pero cuando la publicas en IIS, la cuenta que ejecuta la aplicación es la que está asignada al pool de aplicaciones en IIS, que se asigna desde las Propiedades Avanzadas del Pool en la herramienta de configuración de IIS. Obviamente esto se refiere a una aplicación "hosteada" en IIS ya que la pregunta la has puesto en el foro de Visual Studio. Si tu aplicación PHP está hosteada en Apache u otro tipo de servidor, entonces tendrás que consultar la documentación que le corresponda, o preguntar en el foro oportuno, para ver cómo se determinan las credenciales de sistema bajo las que se ejecuta.

    domingo, 15 de abril de 2018 15:37

Todas las respuestas

  • Creo que el problema puede estar aquí:

    El servidor tiene asignado Adobe Reader como programa predeterminado para los pdf's

    Recuerda que el servidor no puede tener asignado un programa predeterminado. El programa predeterminado se asigna por cada usuario del servidor. Mi sospecha es que la aplicación debe estar rodando bajo una cuenta de sistema (tal como por ejemplo el IIS_IUSRS, dependiendo de cómo la tengas configurada en IIS) y esa cuenta no tenga asignado el programa predeterminado para los PDFs.
    domingo, 15 de abril de 2018 12:30
  • Gracias Alberto, si yo accedo a la aplicación mediante una url, cómo sé el usuario para poderle dar permisos o asignar el Adobe?

    Llevo muchísimas horas peleándome con el tema. Me he dado cuenta que si ejecuto en el servidor el siguiente script en php:

    system("calc.exe") 

    pasan dos cosas:
    - si la carpeta tiene a Todos con control total, no visualiza la calculadora, pero aparece en el administrador de tareas
    - si la carpeta no tiene Todos, he puesto IIS_IUSRS, da acceso prohibido

    En cambio, el mismo script en mi pc, Windows 10 Pro, visualiza la calculadora, con Todos
    Voy a mirar en directivas de grup, a veure si por allí ...



    mblascog


    domingo, 15 de abril de 2018 15:09
  •  si yo accedo a la aplicación mediante una url, cómo sé el usuario para poderle dar permisos o asignar el Adobe?

    No, te estás confundiendo de usuario.

    No estamos hablando del usuario que introduce la url en su navegador y navega a la aplicación, sino la cuenta de sistema que ejecuta el código en el lado servidor cuando alguien navega a esa URL.

    Si estás depurando la aplicación en modo local en tu propio PC, típicamente el usuario que ejecuta el código servidor eres tú mismo, y lógicamente tienes todo adecuadamente configurado con los permisos necesarios y con las aplicaciones asignadas.

    Pero cuando la publicas en IIS, la cuenta que ejecuta la aplicación es la que está asignada al pool de aplicaciones en IIS, que se asigna desde las Propiedades Avanzadas del Pool en la herramienta de configuración de IIS. Obviamente esto se refiere a una aplicación "hosteada" en IIS ya que la pregunta la has puesto en el foro de Visual Studio. Si tu aplicación PHP está hosteada en Apache u otro tipo de servidor, entonces tendrás que consultar la documentación que le corresponda, o preguntar en el foro oportuno, para ver cómo se determinan las credenciales de sistema bajo las que se ejecuta.

    domingo, 15 de abril de 2018 15:37
  • Gracias Alberto, no domino demasiado el tema. Pero si en Windows 10 con el usuario Todos visualiza la calculadora, y en Windows Server, con el mismo usuario no, entiendo que es cuestión de restricción del server, más que de privilegios del usuario. 

    Pensaba mirar si existe alguna directiva de restricción de software para permitir ejecutar este programa. No sé si voy bien o mal encaminada, pero tengo que ir buscando.

    Muchas gracias


    mblascog

    domingo, 15 de abril de 2018 19:44
  • Esa pregunta sobre la calculadora me da a entender que sigues sin entender la importantísima diferencia que hay entre la aplicación web ejecutándose en un PC en entorno de desarrollo, y la forma en la que se ejecuta en un servidor.

    En el servidor, la aplicación web rueda como servicio (no te confundas con el navegador que la invoca, que sí que rueda en el escritorio pero no tiene nada que ver a la hora de ejecutar el código servidor). En un Windows Server moderno, los servicios no tienen acceso al escritorio. La calculadora es una aplicación de escritorio. Por lo tanto, es imposible que en un servidor una aplicación web pueda ejecutar la calculadora (bueno, sí, podría lanzar en memoria el ejecutable, pero en cualquier caso nunca se vería en pantalla la calculadora).

    Lo mismo digo en cuanto a lo de que "en Windows 10 con el usuario Todos visualiza la calculadora, y en Windows Server, con el mismo usuario no". Insisto en que el usuario que teclea la url en el navegador no tiene nada que ver con el usuario que ejecuta la aplicación en el servidor (que es una cuenta de servicio). Por lo tanto, no es el mismo usuario, como tú dices.

    domingo, 15 de abril de 2018 20:53
  • Gracias Alberto, seguro que se me escapan muchas cosas, pero yo creo que el tema va por la restricción de Windows Server más que por privilegios de usuario.
    Buscaré el usuario php lo que para IIS es IIS_USRS

    Gracias


    mblascog

    lunes, 16 de abril de 2018 8:50