La elevación de privilegios no funciona con UseShellExecute=false

Quiero iniciar un proceso hijo (de hecho, el mismo, la aplicación de consola) con privilegios elevados pero con ventana oculta.

Debo hacer:

var info = new ProcessStartInfo(Assembly.GetEntryAssembly().Location)
{
    UseShellExecute = true, //!
    Verb = "runas", 
};

var process = new Process
{
    StartInfo = info
};

process.Start();

y esto funciona:

var identity = new WindowsPrincipal(WindowsIdentity.GetCurrent());
identity.IsInRole(WindowsBuiltInRole.Administrator); //returns true

Pero UseShellExecute = true crea una nueva ventana y yo también puedo redirigir la salida.

Así que cuando lo hago lo siguiente:

var info = new ProcessStartInfo(Assembly.GetEntryAssembly().Location)
{
    RedirectStandardError = true,
    RedirectStandardOutput = true,
    UseShellExecute = false, //!
    Verb = "runas"
};

var process = new Process
{
    EnableRaisingEvents = true,
    StartInfo = info
};

DataReceivedEventHandler actionWrite = (sender, e) =>
{
    Console.WriteLine(e.Data);
};

process.ErrorDataReceived += actionWrite;
process.OutputDataReceived += actionWrite;

process.Start();
process.BeginOutputReadLine();
process.BeginErrorReadLine();
process.WaitForExit();

Esto no elevar privilegios y código anterior devuelve false. Por qué??

Por CIERTO, puede escribir DataReceivedEventHandler actionWrite = ... y process.ErrorDataReceived += actionWrite.
Puedes probar usando UseShellExecute = true, Verb = «runas», y ErrorDataReceived eventos como @SLaks comentario ?

OriginalEl autor abatishchev | 2010-08-29

3 Kommentare

  1. 16

    ProcessStartInfo.Verbo sólo tendrá efecto si el proceso es iniciado por ShellExecuteEx(). Que requiere UseShellExecute = true. Reorientación de e/S y la ocultación de la ventana sólo puede funcionar si el proceso es iniciado por CreateProcess(). Que requiere UseShellExecute = false.

    Bien, por eso no funciona. No estoy seguro de si prohibir a iniciar un proceso oculto que no pasa UAC fue intencional. Probablemente. Muy probablemente.

    De verificación Q esta+A para el manifiesto usted necesita para mostrar la petición de UAC.

    Muchas gracias por WinAPI detrás de la descripción de la escena. ¿Cómo crees que es posible obtener privilegios elevados en demanda de un proceso con ventana oculta? O esto es mutuamente exclusiva cosas?
    Y es posible activar/desactivar el uso de manifestar? I. e. cuando inicio mi aplicación por primera vez (de forma manual) – no utilice un manifiesto, al segundo (en programación) – fuerza a utilizar.
    El inicio de un proceso con privilegios elevados sin que el usuario lo sepa no es posible. Usted necesita una por separado .exe para que tenga su propio manifiesto. Básicamente, usted sólo necesita el método Main ().
    No quiero ocultar proceso de lanzamiento de usuario, aún necesito UAC confirmar de él, sólo quiero ocultar proceso de inicio de la ventana. Creo que esto no es posible, ¿no?
    Hmm… esto es bastante frustrante.

    OriginalEl autor Hans Passant

  2. 5

    En mi caso, fue aceptar para obtener las salidas una vez que la elevada proceso hijo se hace. Aquí está la solución que se me ocurrió. Utiliza un archivo temporal :

    var output = Path.GetTempFileName();
    var process = Process.Start(new ProcessStartInfo
    {
        FileName = "cmd",
        Arguments = "/c echo I'm an admin > " + output, //redirect to temp file
        Verb = "runas", //UAC prompt
        UseShellExecute = true,
    });
    process.WaitForExit();
    string res = File.ReadAllText(output);
    //do something with the output
    File.Delete(output);
    esta realidad parece estar trabajando para mí. complicado detalles de windows 10, F#) – gist en gist.github.com/ImaginaryDevelopment/…
    El aceptó respuesta es una explicación, es una solución.. +1

    OriginalEl autor tpol

  3. 0

    De verificación esta respuesta.

    Esto parece proporcionar una solución. Pero yo recomiendo intentar otros métodos como la Canalizaciones Con Nombre cuando se tiene acceso al código fuente del proceso hijo.

    Yo no he probado la UAC artículo de enfoque, a pesar de que contiene una muestra por sí mismo. Pero si te refieres a una muestra de Canalizaciones con Nombre, usted puede encontrar fácilmente muchos de ellos (como este o este) con un poco de búsqueda. El punto es que, como redirecciones de e/S, puede utilizar secuencias textuales con Canalizaciones con Nombre demasiado, para enviar y recibir datos (incluso si los dos procesos residen en diferentes máquinas). Por supuesto, usted tiene que lidiar con algunos matices para conseguir un pleno funcionamiento de la aplicación.
    En mi humilde opinión, el mejor uso de Trace para Archivo, no redirigir la salida, verbo = runas. Las Canalizaciones es mucho más complejo y complejo a la depuración de fácil.

    OriginalEl autor Massood Khaari

Kommentieren Sie den Artikel

Bitte geben Sie Ihren Kommentar ein!
Bitte geben Sie hier Ihren Namen ein

Pruebas en línea