Pregunta

Me gustaría mostrar algunos elementos adicionales de la interfaz de usuario cuando el proceso se ejecuta como administrador en lugar de cuando no, de forma similar a cómo Visual Studio 2008 muestra "Administrador" en su barra de título cuando se ejecuta como administrador.¿Cómo puedo decir?

¿Fue útil?

Solución

Técnicamente, si quieres ver si el miembro es el administrador local cuenta, entonces puedes obtener el identificador de seguridad (SID) del usuario actual a través del User propiedad sobre el WindowsIdentity clase, así (la estática GetCurrent método obtiene el usuario actual de Windows):

WindowsIdentity windowsIdentity = WindowsIdentity.GetCurrent();

string sid = windowsIdentity.User.ToString();

El User La propiedad devuelve el SID del usuario que tiene una serie de valores predefinidos para varios grupos y usuarios.

Entonces comprobarías si el SID tiene el siguiente patrón, lo que indica que es la cuenta de administrador local (que es un SID bien conocido):

T-1-5-{otras partes SID}-500

O, si no desea analizar cadenas, puede utilizar el SecurityIdentifier clase:

// Get the built-in administrator account.
var sid = new SecurityIdentifier(WellKnownSidType.BuiltinAdministratorsSid, 
    null);

// Compare to the current user.
bool isBuiltInAdmin = (windowsIdentity.User == sid);

Sin embargo, sospecho que lo que usted en realidad Lo que quiero saber es si el usuario actual es miembro de los administradores. grupo para la máquina local.Puede obtener este SID usando el WellKnownSidType de BuiltinAdministratorsSid:

// Get the SID of the admin group on the local machine.
var localAdminGroupSid = new SecurityIdentifier(
    WellKnownSidType.BuiltinAdministratorsSid, null);

Entonces puedes comprobar el Groups propiedad sobre el WindowsIdentity del usuario para ver si ese usuario es miembro del grupo de administración local, así:

bool isLocalAdmin = windowsIdentity.Groups.
    Select(g => (SecurityIdentifier) g.Translate(typeof(SecurityIdentifier))).
    Any(s => s == localAdminGroupSid);

Otros consejos

Creo que este es un buen mecanismo simple.

using System.Security.Principal;

WindowsIdentity identity = WindowsIdentity.GetCurrent();
WindowsPrincipal principal = new WindowsPrincipal(identity);
bool isAdmin = principal.IsInRole(WindowsBuiltInRole.Administrator);

He aquí un chiste para hacerlo.

using System.Security.Principal;

static bool IsElevated => new WindowsPrincipal(WindowsIdentity.GetCurrent()).IsInRole(WindowsBuiltInRole.Administrator);

Lo sentí importante tener en cuenta la dificultad que tenía con intentar utilizar WellKnownSidType.BuiltinAdministratorsSid por la respuesta de casperOne anteriormente. De acuerdo con la WellKnownSiDType MSDN , BuiltinAdministratorsSid "Indica un SID que coincide con la cuenta de administrador." Por lo que se puede esperar de código casperOne funcione, y supongo que es probable que lo hace en algunos entornos. Por desgracia, no fue así en mi Windows 2003 con .NET 2.0 (código heredado). En realidad volvió S-1-5-32-544 que, según este artículo es el sid los administradores de los grupo . Por lo tanto, la comparación falla para mí. Voy a tener que hacer mi propia comparación de cadenas para startswith "S-1-5-21" (que indica el KB 243330 "21" se incluye a pesar de que el blog hace referencia más arriba no lo hace) y endswith "500".

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top