¿Cuándo necesitamos establecer UseShellExecute en True?


134
//
// Summary:
//     Gets or sets a value indicating whether to use the operating system shell
//     to start the process.
//
// Returns:
//     true to use the shell when starting the process; otherwise, the process is
//     created directly from the executable file. The default is true.
[DefaultValue(true)]
[MonitoringDescription("ProcessUseShellExecute")]
[NotifyParentProperty(true)]
public bool UseShellExecute { get; set; }

Si generamos un nuevo proceso, ¿cuándo necesitamos establecer UseShellExecute en True?

Respuestas:


202

La UseShellExecutepropiedad booleana está relacionada con el uso de la función ShellExecute de Windows frente a la función CreateProcess : la respuesta corta es que si UseShellExecutees verdadero, la Processclase usará la ShellExecutefunción; de lo contrario, la usará CreateProcess.

La respuesta más larga es que la ShellExecutefunción se usa para abrir un programa o archivo específico; es aproximadamente equivalente a escribir el comando que se ejecutará en el cuadro de diálogo de ejecución y hacer clic en Aceptar, lo que significa que se puede usar para (por ejemplo):

  • Abra archivos .html o web utilizando el navegador predeterminado sin necesidad de saber qué es ese navegador,
  • Abra un documento de Word sin necesidad de saber cuál es la ruta de instalación de Word
  • Ejecute cualquier comando en el PATH

Por ejemplo:

Process p = new Process();
p.StartInfo.UseShellExecute = true;
p.StartInfo.FileName = "www.google.co.uk";
p.Start();

Es muy fácil de usar, versátil y potente, sin embargo, tiene algunos inconvenientes:

  • No es posible redirigir los controladores estándar de entrada / salida / error

  • No es posible especificar descriptores de seguridad (u otras cosas interesantes) para el proceso secundario

  • Existe la posibilidad de introducir vulnerabilidades de seguridad si hace suposiciones sobre lo que realmente se ejecutará:

     // If there is an executable called "notepad.exe" somewhere on the path 
     // then this might not do what we expect
     p.StartInfo.FileName = "notepad.exe";
     p.Start();
    

CreateProcesses una forma mucho más precisa de iniciar un proceso: no busca la ruta y le permite redirigir la entrada o salida estándar del proceso secundario (entre otras cosas). CreateProcessSin embargo, la desventaja es que ninguno de los 3 ejemplos que di anteriormente funcionará (pruébelo y vea).

En resumen, debe establecer UseShellExecuteen falso si:

  • Desea redirigir la entrada / salida / error estándar (esta es la razón más común)
  • No desea buscar la ruta del ejecutable (por ejemplo, por razones de seguridad)

Por el contrario, debe mantenerse UseShellExecutefiel si desea abrir documentos, URL o archivos por lotes, etc., en lugar de tener que dar explícitamente la ruta a un ejecutable.


2
Grandes cosas, pero usted escribe que (con ShellExecute), "[usted afirma] no es posible redirigir los controladores estándar de entrada / salida / error" <- Seguramente eso es incorrecto o inexacto. Incluso con useShellExecute establecido en verdadero, aunque de hecho no puede hacerlo processStartInfo.RedirectStandardOutput=true, me parece que aún puede redirigir la salida estándar al hacerlo process.Arguments= "cmd /c dir >c:\\crp\\a.a". Del mismo modo, desde un cuadro de diálogo de ejecución que puede hacercmd /c dir>c:\crp\a.a
barlop

44
también, usted dice que cuando, por UseShellExecute=falseejemplo, CreateProcess, no verificará la ruta, pero veo que incluso cuando hago "UseShellExecute = false", es decir, supuestamente no verifica la ruta, entonces process.FileName = "cmd.exe" funciona así que funciona comprobando c: \ windows \ system32. Y si copio cmd.exe en c: \ windows y lo llamo cmmmd.exe, entonces hago process1.FileName = "cmmmd.exe" que también funciona, por lo que está comprobando c: \ windows, por lo que parece que está comprobando la ruta, o Un montón de directorios.
barlop

2
Los documentos de MSDN están de acuerdo con @barlop: "Cuando UseShellExecute es falso, la propiedad FileName puede ser una ruta de acceso completa al ejecutable o un nombre de ejecutable simple que el sistema intentará encontrar dentro de las carpetas especificadas por la variable de entorno PATH".
Bob

Por el ajuste UseShellExecutea trueque era capaz de compartir una variable de entorno (que sólo se creó en el proceso de llamada). Muy útil
Mitkins

14

Pienso principalmente para los no ejecutables. Por ejemplo, si está intentando abrir un .htmlarchivo, si usted tiene que fijar UseShellExecutea truey que se abra la .htmlen un navegador que se ha configurado como predeterminado por el usuario.


12

De MSDN :

Establecer esta propiedad en falso le permite redirigir los flujos de entrada, salida y error.

UseShellExecute debe ser falso si la propiedad UserName no es nula o una cadena vacía, o se generará una InvalidOperationException cuando se llame al método Process.Start (ProcessStartInfo).

Cuando utiliza el shell del sistema operativo para iniciar procesos, puede iniciar cualquier documento (que es cualquier tipo de archivo registrado asociado con un ejecutable que tenga una acción de apertura predeterminada) y realizar operaciones en el archivo, como la impresión, con el componente Proceso. Cuando UseShellExecute es falso, solo puede iniciar ejecutables con el componente Proceso.

UseShellExecute debe ser verdadero si establece la propiedad ErrorDialog en verdadero.


0

Si queremos ocultar la ventana ejecutable de la aplicación actual, UseShellExecute debe establecerse en verdadero


0

Cuando la ruta contiene un espacio u otros caracteres especiales (es decir, acentuados), CreateProcess (UseShellExecute = false) parece estar usando nombres de archivo cortos (notación "DOS" 8.3), ShellExecute (UseShellExecute = true) usa nombres de archivo largos. Entonces, cuando use UseShellExecute = false, asegúrese de convertir sus nombres de directorio y archivo a nombres 8.3 (google ".net cómo obtener el nombre de archivo 8.3"). (No estoy seguro de qué versiones de Windows y / o sistemas de archivos lo hacen de esta manera, probado en Windows 7, NTFS).


¿Podría ser que solo está cortando el camino en el espacio? Poner comillas alrededor de la "ruta / nombre del programa" resuelve esto.
gbarry
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.