el Guille, la Web del Visual Basic, C#, .NET y más...

Saber si la aplicación se está ejecutando como administrador

 
Publicado el 01/Ago/2007
Actualizado el 22/Sep/2007
Autor: Guillermo 'guille' Som

Aquí tienes otra forma de averiguar si la aplicación se está ejecutando como administrador

22/Sep/07: Y aquí tienes otra forma más, también usando solo clases de .NET, pero más simple


Saber si nuestra aplicación se está ejecutando como administrador, y en caso de Windows Vista saber cuando se ejecute usando 'As Administrator'. Y como de costumbre, con código para VB como para C#.



 

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.

 

El código para Visual Basic 2005:

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

 

El código para Visual C# 2005:

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
 



 


La fecha/hora en el servidor es: 23/12/2024 18:15:54

La fecha actual GMT (UTC) es: 

©Guillermo 'guille' Som, 1996-2024