Dando aplicación elevada UAC

Tengo una aplicación que necesita la elevación UAC.

Tengo el código que me permite dar eso, pero la aplicación se abre dos veces … cuál es el problema …

así que aquí está el código en Form1:

public Form1() { InitializeComponent(); WindowsPrincipal pricipal = new WindowsPrincipal(WindowsIdentity.GetCurrent()); bool hasAdministrativeRight = pricipal.IsInRole(WindowsBuiltInRole.Administrator); if (!hasAdministrativeRight) { ProcessStartInfo startInfo = new ProcessStartInfo(); startInfo.UseShellExecute = true; startInfo.WorkingDirectory = Environment.CurrentDirectory; startInfo.FileName = Application.ExecutablePath; startInfo.Verb = "runas"; try { Process p = Process.Start(startInfo); } catch (System.ComponentModel.Win32Exception ex) { return; } } } 

y este es el código programs.cs

  static void Main() { Application.EnableVisualStyles(); Application.SetCompatibleTextRenderingDefault(false); Application.Run(new Form1()); } 

en la depuración descubro que primero se ejecuta

Proceso p = Process.Start (startInfo);

que abre el cuadro de diálogo de elevación de UAC de la aplicación y luego abre la aplicación

pero luego va a la

Application.Run (nuevo Form1 ());

en main () y abre la aplicación nuevamente.

No quiero que abra la aplicación de nuevo …

Soy nuevo en esto, ¿hay algo que esté haciendo mal y necesito cerrar el UAC una vez que esté abierto?

Gracias

No necesita entrometerse con todo eso para asegurarse de que su aplicación siempre se ejecute con privilegios elevados. Simplemente puede agregar un manifiesto de aplicación que instruya a Windows para que ejecute su aplicación elevada, y aparecerá el aviso de UAC sin que necesite escribir una sola línea de código.

Hay una pregunta relacionada con una respuesta que también describe cómo agregar un manifiesto aquí: ¿Cómo puedo incrustar un manifiesto de aplicación en una aplicación usando VS2008?

Elevar tus privilegios siempre va a comenzar un nuevo proceso. No hay forma de evitar eso, aparte de comenzar con privilegios elevados en primer lugar configurando su aplicación para requerir privilegios administrativos. Lo que puede hacer es finalizar la aplicación justo después de que comience el proceso elevado, de modo que solo tenga una aplicación ejecutándose.

Este escenario se puede utilizar para aplicaciones que solo requieren que ciertas partes de su función sean elevadas, como un instalador automático que se actualiza automáticamente y que necesita acceso a Archivos de progtwig, y ​​no una que requiera acceso administrativo todo el tiempo.

Este es un enfoque mucho mejor cuando se sabe que su aplicación requiere privilegios de administrador desde el principio.

Mueva el código WindowsPrincipal de su Formulario a Program.cs como en el ejemplo siguiente. Esto solicitará al usuario la autorización de UAC antes de iniciar cualquier formulario y solo lanzará el formulario si se ha otorgado la autorización de UAC.

  static void Main() { WindowsPrincipal pricipal = new WindowsPrincipal(WindowsIdentity.GetCurrent()); bool hasAdministrativeRight = pricipal.IsInRole(WindowsBuiltInRole.Administrator); if (!hasAdministrativeRight) { ProcessStartInfo startInfo = new ProcessStartInfo(); startInfo.UseShellExecute = true; startInfo.WorkingDirectory = Environment.CurrentDirectory; startInfo.FileName = Application.ExecutablePath; startInfo.Verb = "runas"; try { Process p = Process.Start(startInfo); Application.Exit(); } catch (System.ComponentModel.Win32Exception ex) { MessageBox.Show("This utility requires elevated priviledges to complete correctly.", "Error: UAC Authorisation Required", MessageBoxButtons.OK); // Debug.Print(ex.Message); return; } } else { Application.EnableVisualStyles(); Application.SetCompatibleTextRenderingDefault(false); Application.Run(new Form1()); } 

Hay un ejemplo de Microsoft que demuestra cómo verificar el nivel de privilegio del proceso actual y cómo elevar automáticamente el proceso dando consentimiento explícito con la IU de consentimiento.

Autolevación UAC (CSUACSelfElevation)