Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Elevating privileges doesn't work with UseShellExecute=false

Tags:

I want to start a child process (indeed the same, console app) with elevated privileges but with hidden window.

I do next:

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

and this works:

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

But UseShellExecute = true creates a new window and I also I can't redirect output.

So when I do next:

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(); 

This doesn't elevate privileges and code above returns false. Why??

like image 498
abatishchev Avatar asked Aug 29 '10 19:08

abatishchev


1 Answers

ProcessStartInfo.Verb will only have an effect if the process is started by ShellExecuteEx(). Which requires UseShellExecute = true. Redirecting I/O and hiding the window can only work if the process is started by CreateProcess(). Which requires UseShellExecute = false.

Well, that's why it doesn't work. Not sure if forbidding to start a hidden process that bypasses UAC was intentional. Probably. Very probably.

Check this Q+A for the manifest you need to display the UAC elevation prompt.

like image 191
Hans Passant Avatar answered Oct 07 '22 18:10

Hans Passant