Introducción:
Aquí te pongo el código de una función para saber si el usuario actual es
administrador o del grupo de administradores, algo que en Windows Vista es muy
importante, sobre todo si nuestra aplicación debe ejecutarse con esos
privilegios para que haga ciertas tareas.
Nota:
Este código me lo ha pasado Jared Parsons de Microsoft y
también lo tiene publicado en su blog.
El "customer" al que se refiere en su artículo, seguramente seré yo,
ya que la fecha de publicación es "justo" dos minutos después de haberme enviado
la respuesta, je, je (aunque la hora es PST, -9 con respecto a la de España), y
el "tool" en el que utilizo esta comprobación es una pequeña aplicación para
asignar los
valores de configuración de las conexiones de red local, pero esa utilidad aún
no la publicaré hasta que "los Belmontes" den el visto bueno.
El código usado en este ejemplo solo sirve para el .NET Framework 2.0 o
superior, ya que usa funciones y tipos que no existen en las versiones
anteriores.
Imports System.Security.Principal
Module Module1
Sub Main()
Dim esAdmin As Boolean = IsRunningAsLocalAdmin()
Console.WriteLine("Se está ejecutando como administrador: {0}", esAdmin)
Console.ReadKey()
End Sub
''' <summary>
''' Averiguar si se ejecuta como administrador
''' </summary>
''' <returns>
''' Verdadero o falso según se ejecute como administrador o no
''' </returns>
''' <remarks>
''' Código de Jared Parsons (MS)
''' </remarks>
Public Function IsRunningAsLocalAdmin() As Boolean
Dim cur As WindowsIdentity = WindowsIdentity.GetCurrent()
For Each role As IdentityReference In cur.Groups
If role.IsValidTargetType(GetType(SecurityIdentifier)) Then
Dim sid As SecurityIdentifier = _
TryCast(role.Translate(GetType(SecurityIdentifier)), _
SecurityIdentifier)
If sid.IsWellKnown(WellKnownSidType.AccountAdministratorSid) _
OrElse sid.IsWellKnown(WellKnownSidType.BuiltinAdministratorsSid) Then
Return True
End If
End If
Next
Return False
End Function
End Module
using System;
using System.Security.Principal;
class Program
{
static void Main(string[] args)
{
bool esAdmin = IsRunningAsLocalAdmin();
Console.WriteLine("Se está ejecutando como administrador: {0}", esAdmin);
Console.ReadKey();
}
/// <summary>
/// Averiguar si se ejecuta como administrador
/// </summary>
/// <returns>
/// Verdadero o falso según se ejecute como administrador o no
/// </returns>
/// <remarks>
/// Código original de VB de Jared Parsons (MS)
/// </remarks>
public static bool IsRunningAsLocalAdmin()
{
WindowsIdentity cur = WindowsIdentity.GetCurrent();
foreach(IdentityReference role in cur.Groups)
{
if(role.IsValidTargetType(typeof(SecurityIdentifier)))
{
SecurityIdentifier sid =
((SecurityIdentifier)role.Translate(typeof(SecurityIdentifier)));
if(sid.IsWellKnown(WellKnownSidType.AccountAdministratorSid) ||
sid.IsWellKnown(WellKnownSidType.BuiltinAdministratorsSid))
{
return true;
}
}
}
return false;
}
}
Espero que te sea de utilidad, a mi me lo ha sido.
Nos vemos.
Guillermo
Espacios de nombres usados en el código de este artículo:
System.Security.Principal