locked
Ejecutar un archivo remoto RRS feed

  • Pregunta

  • Amigos! tengo un requerimiento para el cual no tengo idea de como solucionarlo, espero puedan ayudarme.

    Necesito ejecutar un archivo EXE, desde mi aplicación Windows Form, pero el EXE está en una PC remota. Y cuando digo ejecutarlo no me refiero a que se abra en la PC remota, sino en la PC desde donde estoy poniendo el código para ejecutar el archivo de la PC remota. Se entiende?

    Es como cuando se comparte una carpeta que está en un servidor y se accede mediante el explorador de windows, cuando se ejecuta un archivo de esa carpeta, el archivo se abre en la PC local, no en el servidor.

    Tengo la IP de la PC remota, y necesito ejecutar un archivo por ejemplo en C:\archivo.exe

    Como se podría hacer? y debo darle permiso desde la PC remota a la PC que va a contener mi programa?

    Yo para ejecutar un archivo siempre use el siguiente código:

    System.Diagnostics.Process.Start("C:\archivo.exe");

    Intenté probando con la IP:

    System.Diagnostics.Process.Start("190.1.1.1\\c:\\archivo.exe");

    Pero no funcionó.

    Espero puedan darme una mano.

    Desde ya mil gracias!


    • Editado programinca miércoles, 22 de mayo de 2013 5:21
    miércoles, 22 de mayo de 2013 5:17

Respuestas

  • Lamentablemente no anduvo. Decidí encarar por otro lado, encontré una clase que me permite conectarme a una unidad de red y luego desconectarme:

    http://www.codeproject.com/Articles/6847/Map-Network-Drive-API

    Apliqué esa funcionalidad y funciona de maravilla. Me conecto a la carpeta compartida, ejecuto el archivo y luego desconecto la unidad de red.

    Muchas gracias a todos por la ayuda, me vino bárbaro para explorar otras opciones!

    viernes, 24 de mayo de 2013 12:41

Todas las respuestas

  • Otra cosa, vale aclarar que tengo usuario y password de la PC remota junto con la IP.
    miércoles, 22 de mayo de 2013 5:21
  • hola

    pero ese .exe es una aplciacion .net ?

    porque si es asi no se puede lograr lo que buscas, las aplicacion .net requieren de un contexto para funcionar, puntualmente la maquina virtual dependen del framework y esto solo ejecuta localmente

    de forma remota en una carpeta compartida una aplicacion .net no funciona

    ahora si la aplicacion es vb6 o desarrollado con algun otro lengueje entonces si podrias realizarlo

    saludos


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina


    miércoles, 22 de mayo de 2013 5:40
  • El archivo debería estar en una carpeta compartida y tienes que usar una ruta UNC como por ejemplo:

    \\190.1.1.1\CarpetaCompartida\archivo.exe

    miércoles, 22 de mayo de 2013 7:38
  • gracias por responder! El archivo exe si es un programa en .net. El tema es que cuando pongo "conectar a una unidad de red" para que la carpeta remota se me vea en el explorador de windows como una unidad (D: por ejemplo) ahí si puedo ejecutarlo con la línea:

    System.Diagnostics.Process.Start("D:\\archivo.exe");

    Pero de esa manera tengo que compartir muchas unidades de red, son como 10 las que necesito configurar, mas otras 6 o 7 compartidas por otro motivo, mas las que tiene la pc de manera local. Se me hace mucho.

    Entonces de ahí la idea de hacer un programa que solo sea como un acceso directo, apretando un botón me abra el .exe de la PC remota. Este programa que necesito abrir genera algunos txt en la ruta donde está el exe, así que esos archivos tendrían que generarse en la remota a pesar de yo estar trabajando en la PC local.

    Es muy rebuscado, algo asi se podrá hacer? o sino me pueden recomendar algo como para lograr esto?

    Miles de graciasss!

    miércoles, 22 de mayo de 2013 12:52
  • System.Diagnostics.Process.Start(@"\\190.1.1.1\C$\archivo.exe");

    o si tienes una carpeta compartida

    System.Diagnostics.Process.Start(@"\\190.1.1.1\CARPETA_COMP\archivo.exe");
    Revisa que el usuario que ejecute la aplicación tenga permisos para c$


    Si se solucionó tu consulta no olvides marcar la respuesta. Si te ayudó vótala como útil. Saludos




    miércoles, 22 de mayo de 2013 13:52
    Moderador
  • No utilices conectar a unidad de red simplemente utiliza la ruta UNC. Repito que el ejecutable debería estar en una carpeta compartida porque si no tendría que accederse por C$ y para eso se reguieren permisos administrativos.
    miércoles, 22 de mayo de 2013 14:54
  • si por eso lo indiqué. Si lo quiere hacer con permisos administrativos es una opción. por eso puse los dos ejemplos....

    un saludo


    Si se solucionó tu consulta no olvides marcar la respuesta. Si te ayudó vótala como útil. Saludos

    miércoles, 22 de mayo de 2013 15:04
    Moderador
  • Gracias a todos por responder! La máquina remota tiene usuario y password para acceder, también debería especificarlo en esas líneas de código?

    System.Diagnostics.Process.Start(@"\\190.1.1.1\C$\archivo.exe");

    o si tienes una carpeta compartida

    System.Diagnostics.Process.Start(@"\\190.1.1.1\CARPETA_COMP\archivo.exe");

    Revisa que el usuario que ejecute la aplicación tenga permisos para c$


    Si se solucionó tu consulta no olvides marcar la respuesta. Si te ayudó vótala como útil. Saludos




    Me decías que la aplicación debe tener permisos para c$, es posible poner en el código el user y pass? así no tengo que darle esos permisos a la persona que va a usar el programa.

    jueves, 23 de mayo de 2013 12:59
  • puedes usar este constructor

    public static Process Start(
    	string fileName,
    	string userName,
    	SecureString password,
    	string domain
    )

    un ejemplo de MSDN

    // This sample requires a text.txt file and a HelloWorld.exe file in the 
    // My Documents folder to successfully execute.
    using System;
    using System.Diagnostics;
    using System.Security;
    using System.ComponentModel;
    
    namespace StartDemo
    {
        class Program
        {
            static void Main(string[] args)
            {
                Console.WriteLine("Enter your domain.");
                string domain = Console.ReadLine();
                Console.WriteLine("Enter you user name.");
                string uname = Console.ReadLine();
                Console.WriteLine("Enter your password (Caution, password won't be hidden).");
                SecureString password = new SecureString();
                foreach (char c in Console.ReadLine())
                    password.AppendChar(c);
                string path = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments) + "\\";
                Process.Start(path + "HelloWorld.exe", uname, password, domain);
                try
                {
                    // The following call to Start succeeds.
                    Process.Start(path + "Text.txt");
                    // Attempting to start in a shell using this Start overload fails.
                    // The following call to Start results in the following error:
                    // The specified executable is not a valid Win32 application.
                    Process.Start(path + "Text.txt", uname, password, domain);
                }
                catch (Win32Exception ex)
                {
                    Console.WriteLine(ex.Message);
                }
            }
         }
    }
    


    Si se solucionó tu consulta no olvides marcar la respuesta. Si te ayudó vótala como útil. Saludos


    jueves, 23 de mayo de 2013 13:03
    Moderador
  • Muchas gracias Sergio.

    Usé este código:

                SecureString pass = new SecureString();
                pass.AppendChar('p');
                pass.AppendChar('a');
                pass.AppendChar('s');
                pass.AppendChar('s');
                System.Diagnostics.Process.Start("e:\\prueba.txt", "miusuario", pass, "Dominio-S04");

    Obviamente los datos que puse ahí son distintos, los reales son privados. Pero me está tirando error de usuario desconocido o password. Dice: "Error de inicio de sesión: nombre de usuario desconocido o contraseña incorrecta".  Verifiqué bien el usuario y el pass, y está todo bien. Alguna idea de porqué puede suceder este error mas allá de que el user o el pass estén mal escritos (que no es el caso)?
    jueves, 23 de mayo de 2013 14:59
  • Hola programinca

    Porque no intentas utilizar PsExec

    http://technet.microsoft.com/es-mx/sysinternals/bb897553.aspx

    Saludos


    Recuerda proponer o marcar toda respuesta que haya solucionado tu consulta, votar como útil o agradecer
    al usuario que te proporciono la mejor opción para asi apoyar a nuestra comunidad y esta siga creciendo.


    Omar Ortiz Suárez
    Microsoft Contingent Staff
    Mexico City

    jueves, 23 de mayo de 2013 15:13
  • Ya se que lo has dicho pero has verificado que contenido tiene la variable pass en             System.Diagnostics.Process.Start("e:\\prueba.txt", "miusuario", pass, "Dominio-S04");  ???

    Si se solucionó tu consulta no olvides marcar la respuesta. Si te ayudó vótala como útil. Saludos

    jueves, 23 de mayo de 2013 16:28
    Moderador
  • Sergio, traté de convertir la variable pass a string para mostrarla en un messagebox pero no me deja. Lo que me muestra como resultado es "System.Security.SecureString", y no la password.

    jueves, 23 de mayo de 2013 17:28
  •  pass.ToString()


    Si se solucionó tu consulta no olvides marcar la respuesta. Si te ayudó vótala como útil. Saludos

    jueves, 23 de mayo de 2013 17:38
    Moderador
  • Perdona!! Que es un securestring...

    Si se solucionó tu consulta no olvides marcar la respuesta. Si te ayudó vótala como útil. Saludos

    jueves, 23 de mayo de 2013 17:41
    Moderador
  • Hola! si es un securestring, cuando le pongo pass.tostring() me da el mismo resultado:

    "System.Security.SecureString"

    Podrá ser eso? que la password esté mal?

    viernes, 24 de mayo de 2013 4:07
  • Has probado si en vez de usar un SecureString utilizas un string normal te funciona??


    Si se solucionó tu consulta no olvides marcar la respuesta. Si te ayudó vótala como útil. Saludos

    viernes, 24 de mayo de 2013 9:30
    Moderador
  • Lamentablemente no anduvo. Decidí encarar por otro lado, encontré una clase que me permite conectarme a una unidad de red y luego desconectarme:

    http://www.codeproject.com/Articles/6847/Map-Network-Drive-API

    Apliqué esa funcionalidad y funciona de maravilla. Me conecto a la carpeta compartida, ejecuto el archivo y luego desconecto la unidad de red.

    Muchas gracias a todos por la ayuda, me vino bárbaro para explorar otras opciones!

    viernes, 24 de mayo de 2013 12:41