c# - Elevar privilegios no funciona con UseShellExecute=falso
uac processstartinfo (3)
Comprueba esta respuesta .
Esto parece proporcionar una solución. Pero recomiendo probar otros métodos como Named Pipes cuando tenga acceso al código fuente del proceso hijo.
Quiero iniciar un proceso secundario (de hecho, la misma aplicación de consola) con privilegios elevados pero con ventana oculta.
Hago lo siguiente
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 tampoco puedo redirigir la salida.
Entonces, cuando 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 eleva los privilegios y el código anterior devuelve falso. ¿¿Por qué??
En mi caso, estaba bien obtener los resultados una vez que se realiza el proceso secundario elevado. 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);
ProcessStartInfo.Verb solo tendrá efecto si ShellExecuteEx () inicia el proceso. Lo que requiere UseShellExecute = true. La redirección de E / S y la ocultación de la ventana solo pueden funcionar si CreateProcess () inicia el proceso. Lo que requiere UseShellExecute = falso.
Bueno, por eso no funciona. No estoy seguro de que prohibir el inicio de un proceso oculto que omita UAC fue intencional. Probablemente. Muy probablemente
Marque este Q + A para el manifiesto que necesita para mostrar el indicador de elevación de UAC.