Introducción:
Pues eso... otra forma de saber si la aplicación se está ejecutando como
administrador. En realidad si se está ejecutando con "privilegios" de
administrador.
En esta ocasión el código es solo para Visual Basic 2005, ya
que se usa el
objeto My.User, que en C# se puede simular fácilmente, pero hoy
no me he
entretenido en buscar la equivalencia... je, je
Parte de este código me lo ha proporcionado
Adam Braden (del VB Team), pero solo informaba si el
usuario está en el grupo de administradores y se está ejecutando como
administrador:
Dim esAdmin As Boolean = My.User.IsInRole(ApplicationServices.BuiltInRole.Administrator)
Por ejemplo, si ese código se ejecuta en un Windows XP y el usuario es
administrador, devolverá True. Pero si se ejecuta en un Windows Vista, siempre
devolverá False, aunque la aplicación se ejecute "como administrador".
Bueno, esto último, suponiendo que estamos usando el Windows Vista como "viene
de fábrica", es decir, con el "UAC" conectado, que es la forma normal de Vista.
Y ya puestos... pues me puse a "probar" cosas y al final, añadiendo una línea
más de código, funciona como el código
anterior (el que publiqué ayer).
Por tanto, creando una función como esta, nos avisará si estamos ejecutando
la aplicación como administrador o no, y lo he probado tanto en Windows Vista
como XP y va bien.
Private Function EsAdministrador() As Boolean
My.User.InitializeWithWindowsUser()
Return My.User.IsInRole(ApplicationServices.BuiltInRole.Administrator)
End Function
Que es equivalente a esto otro (por si alguien lo quiere convertir a C#):
Private Function EsAdministrador() As Boolean
System.Threading.Thread.GetDomain().SetPrincipalPolicy(PrincipalPolicy.WindowsPrincipal)
Return My.User.IsInRole(ApplicationServices.BuiltInRole.Administrator)
End Function
Espero que te sea de utilidad.
Nos vemos.
Guillermo
Nota 22/Sep/07:
Aquí tienes la función
EsAdministrador usando código con solo las clases de .NET Framework 2.0.
El código está tanto para Visual Basic como para C#.
Espacios de nombres usados en el código de este artículo:
System.Security.Principal
System.Threading