none
Ejecutar comandos de programa de consola externo "Diskcriptor" RRS feed

  • Pregunta

  • Hola buenas noches, actualmente me encuentro desarrollando una aplicacion de consola de c# que entre sus funciones esta encriptar una unidad de almacenamiento, Disco duro o pendrive, el programa en cuestion es el siguiente:

    https://diskcryptor.net/wiki/Console

    este programa tiene su GUI donde puedo hacer esos procesos de encriptacion y desenriptacion, pero mi objetivo es llamarlo desde mi aplicacion de c# ya que el diskcryptor ofrece un archivo .exe dccon que realiza las funciones de la herramienta grafica, pero ese archivo se aloja en la siguiente ruta:

    C:\Program Files\dcrypt

    mi pregunta es como puedo llamar a ese .exe que se encuentra en esa ruta desde mi aplicacion, esta seria mi funcion que intenta llamar al dccon pero me genera error, esta es mi fucion, recibe un parametro que seria la unidad que deseo encryptar:

     public void Encryptar( string strUnidad)
            {
                Process p = new Process();
                p.StartInfo.UseShellExecute = false;
                p.StartInfo.RedirectStandardOutput = true;


                //string fullimagepath = System.IO.Path.Combine(AppDomain.CurrentDomain.BaseDirectory + "dcrypt_setup.exe");
                p.StartInfo.FileName = @"C:\Windows\System32\cmd.exe";
                p.StartInfo.RedirectStandardInput = true;
                p.Start();
                p.StandardInput.WriteLine("dccon  -encrypt " + strUnidad + " -kf");
                string output = p.StandardOutput.ReadToEnd();
                p.WaitForExit();
                Console.WriteLine("Unidad Encryptada");
            }

    Espero me puedan apoyar. Gracias

    viernes, 9 de febrero de 2018 3:45

Respuestas

  • El problema es que estás abriendo un cmd que se inicia en otra carpeta, y cuando le dices que ejecute dcon no sabe en donde encontrarlo.

    La solución más sencilla es pasarle la ruta completa:

    p.StandardInput.WriteLine(@"C:\Program Files\dcrypt\dccon  -encrypt " + strUnidad + " -kf");

    Pero hay una forma más "limpia" de lograr lo que quieres: Olvídate del cmd.exe. En el Process.StartInfo, dile que inicie el dcon.exe (con su ruta) en lugar del cmd.exe. Y luego, para los parámetros, pásaselos en la propiedad Parameters del StartInfo. Con eso ya no necesitas redirigir el StandardInput.

    viernes, 9 de febrero de 2018 7:11
    Moderador
  • Viene un ejemplo bastante bueno al final de la documentación de los Arguments del StartInfo en la documentación de .Net:

    https://msdn.microsoft.com/en-us/library/system.diagnostics.processstartinfo.arguments(v=vs.110).aspx

    Fíjate en el segundo ejemplo que viene. Ahí lanza un programa varias veces con distintos argumentos.

    viernes, 9 de febrero de 2018 18:52
    Moderador
  • Tienes que pasarle el nombre del archivo entre comillas, para que no se haga un lío con el espacio en blanco. Esas comillas tienen que llegarle al programa, es decir son otras comillas adicionales además de las que usas para decirle al compilador que estás escribiendo un String:

    .... " -keygen \"C:\\Program Files\\dcrypt\\" + strLlave + "\"");

    Ojo, tenías un espacio superfluo detrés de dcryp\\

    Y ojo también a la ruta por debajo de C:\Program Files: Esta ruta es normalmente de solo-lectura para los usuarios normales, por lo que dará un error al salvar ahí el archivo a no ser que ejecutes el programa con privilegios administrativos (¡recuerda el UAC!).

    lunes, 12 de febrero de 2018 7:13
    Moderador

Todas las respuestas

  • El problema es que estás abriendo un cmd que se inicia en otra carpeta, y cuando le dices que ejecute dcon no sabe en donde encontrarlo.

    La solución más sencilla es pasarle la ruta completa:

    p.StandardInput.WriteLine(@"C:\Program Files\dcrypt\dccon  -encrypt " + strUnidad + " -kf");

    Pero hay una forma más "limpia" de lograr lo que quieres: Olvídate del cmd.exe. En el Process.StartInfo, dile que inicie el dcon.exe (con su ruta) en lugar del cmd.exe. Y luego, para los parámetros, pásaselos en la propiedad Parameters del StartInfo. Con eso ya no necesitas redirigir el StandardInput.

    viernes, 9 de febrero de 2018 7:11
    Moderador
  • Me puedes colocar un ejemplo mas amplio del uso del Process.StarInfo  por favor, gracias
    viernes, 9 de febrero de 2018 13:42
  • Viene un ejemplo bastante bueno al final de la documentación de los Arguments del StartInfo en la documentación de .Net:

    https://msdn.microsoft.com/en-us/library/system.diagnostics.processstartinfo.arguments(v=vs.110).aspx

    Fíjate en el segundo ejemplo que viene. Ahí lanza un programa varias veces con distintos argumentos.

    viernes, 9 de febrero de 2018 18:52
    Moderador
  • Hola Alberto gracias, me ha servido bastante la informacion, pero ahora me sucede esto, los comandos del archivo de dccon que deseo correr generan archivos, pero cuando ejecuto los comando, me sucede que no crea el archivo con el nombre que quiero y en la ruta que deseo, te coloco la programación:

    public void CrearKeyFile(string strLlave)
            {
                try
                {
                    Process.Start("C:\\Program Files\\dcrypt\\dccon.exe ", " -keygen C:\\Program Files\\dcrypt\\ " + strLlave);
                }
                catch (System.IO.IOException e)
                {
                    Console.WriteLine(e.Message.ToString());
                }
            }

    Se supone que este comando me crearia un archivo en la ruta C:\\Program Files\\dcrypt\\ pero termina creando un archivo de nombre Program en C:, osea C:\Program haciendo me entender que al haber un espacio en blanco en la ruta el comando toma como nombre del archivo parte de la ruta, como evito esto? cuando creo una carpeta en c: sin espacio el blanco, y decigo guardar en esa carpeta si crea el archivo con el no mombre que deseo, pero yo quiero poder guardar en la ruta que decida asi el nombre de la carpeta tengo espacios, gracias!

    lunes, 12 de febrero de 2018 6:17
  • Tienes que pasarle el nombre del archivo entre comillas, para que no se haga un lío con el espacio en blanco. Esas comillas tienen que llegarle al programa, es decir son otras comillas adicionales además de las que usas para decirle al compilador que estás escribiendo un String:

    .... " -keygen \"C:\\Program Files\\dcrypt\\" + strLlave + "\"");

    Ojo, tenías un espacio superfluo detrés de dcryp\\

    Y ojo también a la ruta por debajo de C:\Program Files: Esta ruta es normalmente de solo-lectura para los usuarios normales, por lo que dará un error al salvar ahí el archivo a no ser que ejecutes el programa con privilegios administrativos (¡recuerda el UAC!).

    lunes, 12 de febrero de 2018 7:13
    Moderador
  • Muchas gracias, por la respuesta saludos!
    lunes, 12 de febrero de 2018 23:00