Los permisos por defecto en cualquier aplicación que uno desarrolla para Windows, toma por defecto el usuario con el que nos hemos autenticado en Windows. Esto ocurre por razones de seguridad. Pero algunas veces necesitamos que nuestra aplicación haga actividades en el PC con permisos administrativos... y generalmente esto genera errores en nuestra aplicación.
El usuario final que tiene en sus manos nuestra aplicación (así recién salida del horno de nuestro cerebro), y con SO Windows 7 o superior, puede darle permisos de ejecución para que se ejecute como administrador. Pero seamos francos... no podemos depender de lo que haga un usuario (así se lo expliquemos con plastilina).
Para crear una aplicación que siempre se ejecute con permisos de administrador, esto es lo que hay que hacer en nuestro código:
1) Crear el archivo de manifiesto. En El sitio de
MSDN hay un tutorial muy claro de cómo generar este archivo (y un poco largo para ser sinceros). Resumiendo: En
Propiedades del proyecto, ingresamos en la pestaña de "
Aplicación" y pulsamos el botón de "
Ver configuración de Windows". Esto generará un archivo automáticamente llamado
app.manifiest
2) Modificando el archivo app.manifiest. Abrimos el archivo recién generado y cambiamos la configuración de
requestedExecutionLevel. Debe quedar con la siguiente sintaxis:
<requestedExecutionLevel level="requireAdministrator" uiAccess="false" />
En el archivo generado, hay varias opciones de ejemplo de lo que podemos hacer en cuanto a seguridad se trata, pero para nuestro objetivo de éste artículo pondremos el recien mencionado.
De esta manera, al ejecutar nuestra aplicación en Windows, sin importar cuál sea el usuario desde el que se está ejecutando la aplicación, tendrá como prioridad la ejecución "como administrador".
Esto es solo la mitad de la solución. Porque el usuario, puede desde modificar sus permisos administrativos sobre cada aplicación y declarar nuestra aplicación como no apta para ser ejecutada con rol administrativo. Entonces es necesario hacer una validación a nivel de código:
En VB.NET:
Imports System.Security.Principal
If myPrincipal.IsInRole(WindowsBuiltInRole.Administrator) = false Then
MsgBox ("Requiere permisos administrativos para ejecutar esta aplicación")
End If
En C#.NET:
using System.Security.Principal;
If (myPrincipal.IsInRole(WindowsBuiltInRole.Administrator) == false) {
MsgBox ("Requiere permisos administrativos para ejecutar esta aplicación");
}