c# asp.net winforms uac

c# - Dando aplicación elevada UAC



asp.net winforms (4)

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


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 programa, y ​​no una que requiera acceso administrativo todo el tiempo.



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


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?