Buenas,
la respuesta a la pregunta:
¿Es posible lanzar una aplicación desplegada con ClickOnce con permisos de administrador?
tiene una respuesta muy simple:
NO
La solución viene dos párrafos después, así que te podes ahorrar el siguiente texto. La forma correcta de definir que una aplicación requiera ciertos permisos es a través de un manifiesto. En el mismo, se puede indicar TODO lo que requiere una aplicación al momento de ejecutarse. El paso a paso, está en MSDN y se describe en:
- Step 6: Create and Embed an Application Manifest (UAC)
http://msdn.microsoft.com/en-us/library/bb756929.aspxhttp://msdn.microsoft.com/en-us/library/bb756929.aspx
El problema es que si tenemos una aplicación que luego desplegaremos con ClickOnce, aplicamos este cambio en el manifiesto y luego intentamos compilar nos encontramos con un hermoso
Error 1 ClickOnce does not support the request execution level ‘requireAdministrator’.
Y ahora? pues una de las soluciones viene de la mano de este post, donde lo que se hace es básicamente verificar si la aplicación se lanza con permisos de ADMIN y en caso contrario, lanzar la aplicación nuevamente con los permisos adecuados.
He creado una pequeña clase que además de aplicar este proceso, muestra un mensaje avisando que se lanzará nuevamente la aplicación.
1: public class RunAsAdministrator
2: {
3: public bool IsRunAsAdministrator()
4: {
5: var windowsIdentity = WindowsIdentity.GetCurrent();
6: var windowsPrincipal = new WindowsPrincipal(windowsIdentity);
7: return windowsPrincipal.IsInRole(WindowsBuiltInRole.Administrator);
8: }
9:
10: public static void ValidateAdministratorModeAndRestart(bool displayMessage)
11: {
12:
13: var runAsAdministrator = new RunAsAdministrator();
14: if (runAsAdministrator.IsRunAsAdministrator()) return;
15:
16:
17: if (displayMessage)
18: {
19: var fi = FileVersionInfo.GetVersionInfo(Assembly.GetExecutingAssembly().Location);
20: string productName = fi.FileDescription;
21: MessageBox.Show(string.Format("{0} will launch itself with admin privileges", productName));
22: }
23:
24: var processInfo = new ProcessStartInfo(Assembly.GetExecutingAssembly().CodeBase)
25: {
26: UseShellExecute = true,
27: Verb = "runas"
28: };
29: try
30: {
31: Process.Start(processInfo);
32: }
33: catch (Exception)
34: {
35: MessageBox.Show("Sorry, this application must be run as Administrator.");
36: }
37: Application.Current.Shutdown();
38: }
39: }
En mi caso ha bastado y salvo algunas excepciones que se me ocurren de memoria, creo que puede bastar ![]()
Source: http://antscode.blogspot.com.es/2011/02/running-clickonce-application-as.html
Saludos @ Home
El Bruno

Leave a comment