Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Run process as administrator from a non-admin application

From an application that is not being run as administrator, I have the following code:

ProcessStartInfo proc = new ProcessStartInfo(); proc.WindowStyle = ProcessWindowStyle.Normal; proc.FileName = myExePath; proc.CreateNoWindow = false; proc.UseShellExecute = false; proc.Verb = "runas"; 

When I call Process.Start(proc), I do not get a pop up asking for permission to run as administrator, and the exe is not run as administrator.

I tried adding an app.manifest to the executable found at myExePath, and updated the requestedExecutionLevel to

<requestedExecutionLevel level="requireAdministrator" uiAccess="false" /> 

With the updated app.manifest, on the Process.Start(proc) call, I get an exception, "The requested operation requires elevation."

Why isn't the .Verb action not setting administrator privileges?

I am testing on Windows Server 2008 R2 Standard.

like image 368
jkh Avatar asked Jun 04 '13 19:06

jkh


People also ask

How do I run something as administrator if option isn't given?

To do this, search for netplwiz in the taskbar search box and open the result. After that, select your user account and click the Properties button. Next, go to Group Membership tab > select Administrator > click Apply and OK buttons to save the change.

How do I force an app to run as administrator?

Again, right-click on the app's name. Click on Properties and select the Shortcut tab. Select Advanced. Finally, mark the checkbox next to Run as administrator.


1 Answers

You must use ShellExecute. ShellExecute is the only API that knows how to launch Consent.exe in order to elevate.

Sample (.NET) Source Code

In C#, the way you call ShellExecute is to use Process.Start along with UseShellExecute = true:

private void button1_Click(object sender, EventArgs e) {    //Public domain; no attribution required.    ProcessStartInfo info = new ProcessStartInfo(@"C:\Windows\Notepad.exe");    info.UseShellExecute = true;    info.Verb = "runas";    Process.Start(info); } 

If you want to be a good developer, you can catch when the user clicked No:

private void button1_Click(object sender, EventArgs e) {    //Public domain; no attribution required.    const int ERROR_CANCELLED = 1223; //The operation was canceled by the user.     ProcessStartInfo info = new ProcessStartInfo(@"C:\Windows\Notepad.exe");    info.UseShellExecute = true;    info.Verb = "runas";    try    {       Process.Start(info);    }    catch (Win32Exception ex)    {       if (ex.NativeErrorCode == ERROR_CANCELLED)          MessageBox.Show("Why you no select Yes?");       else          throw;    } } 

Bonus Watching

  • UAC - What. How. Why.. The architecture of UAC, explaining that CreateProcess cannot do elevation, only create a process. ShellExecute is the one who knows how to launch Consent.exe, and Consent.exe is the one who checks group policy options.
like image 126
Ian Boyd Avatar answered Sep 24 '22 13:09

Ian Boyd