Ejecutar el proceso como administrador desde una aplicación que no es de administrador

Desde una aplicación que no se ejecuta como administrador, tengo el siguiente código:

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

Cuando llamo a Process.Start (proc), no aparece una ventana emergente solicitando permiso para ejecutar como administrador y el exe no se ejecuta como administrador.

Intenté agregar un app.manifest al ejecutable encontrado en myExePath, y actualicé el requiredExecutionLevel a

  

Con el app.manifest actualizado, en la llamada Process.Start (proc), recibo una excepción, “La operación solicitada requiere elevación”.

¿Por qué la acción .Verb no configura los privilegios de administrador?

Estoy probando en Windows Server 2008 R2 Standard.

Debe usar ShellExecute . ShellExecute es la única API que sabe cómo iniciar Consent.exe para poder elevarlo.

Código fuente de ejemplo (.NET)

En C #, la forma de llamar a ShellExecute es usar Process.Start junto con UseShellExecute = true :

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

Si quieres ser un buen desarrollador, puedes capturar cuando el usuario hace clic en No :

 private void button1_Click(object sender, EventArgs e) { 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; } } 

Observación de bonificación

  • UAC – ¿Qué? Cómo. Por qué. . La architecture de UAC explica que CreateProcess no puede hacer elevación, solo crea un proceso. ShellExecute es quien sabe cómo ejecutar Consent.exe, y Consent.exe es quien verifica las opciones de política de grupo.

Nota : Cualquier código lanzado al dominio público. No se requiere atribución.