Ir al contenido principal

.NET ClickOnce y Privilegios de Administrador

Estaba revisando que no publicábamos nada desde Julio de 2017 y pues ya pasó algo de tiempo, podemos decir que afortunadamente hemos tenido un poco de trabajo que no nos ha permitido retomar este asunto de los posts.

Una Pequeña Introducción

Uno de nuestros proyectos más importantes dentro de Nivisix es el Sistema de Punto de Venta, puesto que de primera instancia lo vendemos a nuestros clientes y posteriormente nos solicitan personalizaciones del mismo de acuerdo a sus necesidades.

Nivisix Punto de Venta

Y las liberaciones a veces se tornan un tanto complicadas por que en un inicio eran en sitio y posteriormente usando herramientas como Team Viewer y si en su momento compraban el servicio de implementación de VPN pues que mejor.

Lo anterior está muy bien, ¿pero porqué no hacer uso de lo que Microsoft desde hace algunos años nos ofrece y que puede solucionar este problema de actualización? Hablo específicamente del uso de ClickOnce como herramienta de liberación y actualización de aplicaciones.

Para quienes no conozcan esta herramienta, por acá les dejo un link: ClickOnce

La Problemática

Una vez que comenzamos a distribuir la aplicación y las actualizaciones por internet nos encontramos con un pequeño inconveniente: ClickOnce está definido para ejecutarse bajo una metodología de privilegios bajos, ya que se instala bajo el perfil del usuario que ha iniciado sesión y éste no tiene privilegios elevados, ni tiene la posibilidad de ejecutar la aplicación como administrador. Intenten y verán. Incluso en Windows 10 aparece la opción para poder ejecutarse como administrador, pero símplemente la aplicación no inicia.

Ejecución como administrador

Buscando Una Solución

Buscando por internet nos encontramos con varias alternativas, entre ellas la de crear un bat que pudieramos ejecutar como administrador que a su vez llamara a nuestra aplicación una vez que los privilegios habían sido elevados.

Otra fue la de validar que la aplicación haya iniciado como administrador y si no era el caso, volver a ejecutarla solicitando la elevación de permisos, todo esto usando código fuente.

Nuestro caso era sólo que para ciertas operaciones era necesaria la elevación de permisos y que no se ejecutan de manera recurrente por el usuario, así que decidimos escribir el código necesario para validar si la operación necesaria requería de elevación de permisos, si era el caso, reiniciamos la aplicación solicitando la elevación necesaria.

Solución Encontrada

Como de costumbre, veremos un video de la solución implementada.


Clase Utilitaria AdministratorPrivileges.cs

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
/// <summary>
/// Clase utilitaria para elevación concensuada de permisos de administrador
/// </summary>
internal static class AdministratorPrivileges
{
    #region Métodos

    /// <summary>
    /// Valida si el usuario es administradores, si no reinicia con solicitud de elevación de privilegios
    /// </summary>
    /// <returns>True si el usuario es administrador, false en caso contrario</returns>
    internal static bool EjecutarComoAdministrador()
    {
        try
        {
            WindowsIdentity wi = WindowsIdentity.GetCurrent();
            WindowsPrincipal wp = new WindowsPrincipal(wi);
            if (wp.IsInRole(WindowsBuiltInRole.Administrator))
            {
                return true;
            }
            else
            {
                ProcessStartInfo processInfo = new ProcessStartInfo(Assembly.GetExecutingAssembly().CodeBase);
                processInfo.UseShellExecute = true;
                processInfo.Verb = "runas";
                Process.Start(processInfo);
                return false;
            }
       }
       catch
       {
           return false;
       }
    }

    #endregion
}

Descarga de Código Fuente

La descarga incluye la solución que presentamos en el video

Puedes descargar la versión Community de Visual Studio para que lleves a cabo tus pruebas desde este link: VSCommunity2017

Comentarios

Entradas más populares de este blog

Publicación de WCF en Net.TCP

Una de las grandes características de WCF es la forma en como éstos pueden ser expuestos a nuestros clientes, por ejemplo los siguientes protocolos, de manera muy recurrente: Http TCP Net Pipe ¿Sabes en que casos usar cada uno? Http cuando el servicio y el cliente se encuentran en redes diferentes TCP cuando el servicio y el cliente se encuentran en la misma red, pero en equipos diferentes Net Pipe cuando el servicio y el cliente se encuentran alojados en el mismo equipo ¿Por qué razón? Por cuestiones de redimiento y seguridad de la información Si una petición http toma un tiempo de 200 ms, por poner un ejemplo Una petición tcp tomará aproximadamente el 20% menos que la petición http (40 ms aproximadamente) Y una petición Net Pipe , tomará aproximadamente el 80% del tiempo que toma el hacer una petición tcp (32 ms aproximadamente) Para mayor entendimiento, chequen este post que alguna vez consultamos para entender un poco más acerca de éstos conceptos: https://j...

Validación de Fechas con jQuery Validator

Al validar fechas con jQuery Validate nos encontramos con el problema de que dicha validación se hace en formato: MM/DD/YYYY, esto es correcto, pero no tanto para formato de fechas de México al menos que es más común para nosotros hacerlo de manera que dicho formato sea: DD/MM/YYYY. Para poder solucionar este problema haremos algunas modificaciones en las librerías: jquery.validate.js jquery.validate.min.js Veamos el siguiente video para la implementación de dicha solución: jquery.validate.js Se deja comentado el cómo se hace la validación original y se adiciona el código personalizado que permite validar el formato de fecha del tipo: DD/MM/YYYY 1 2 3 4 5 6 7 8 9 10 11 // http://jqueryvalidation.org/date-method/ // Nivisix Soluciones: personalización para formato de fechas DD/MM/YYYY date : function ( value, element ) { //return this.optional( element ) || !/Invalid|NaN/.test( new Date( value ).toString() ); var com...

SQLServer Stored Procedure Para Ordenar Columnas Ascendente / Descendente

Pues este es nuestro primer post referente a SQLServer ... En primera instancia les queremos platicar qué es lo que buscamos:  Mediante un stored procedure obtener un listado ordenado por alguna de las columnas devueltas de manera ascendente o descendente, dependiendo de los parámetros de entrada del mismo. Muchas de las ocasiones cuando nos ha tocado buscar información acerca de cómo hacer este proceso, solemos encontrar recomendaciones de hacerlo usando un query que se contruye en tiempo de ejecución usando una variable de tipo VARCHAR(MAX) y después hacer uso de la función EXEC para ejecutarlo. Al final, se resuelve el problema, pero la intención es mejorar el procedimiento sin afectar el rendimiento y evitando problemas de seguridad como el SQL Injection . Veamos un video con una propuesta diferente de resolución de este requerimiento: Creación de la Base de Datos Usando el siguiente query que pueden ejecutar en el cliente base de datos SQL Server creare...