¿Cómo puedo saber si mi proceso se está ejecutando como Administrador?
-
21-08-2019 - |
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?
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".