¿Cómo puedo saber si mi proceso se está ejecutando como administrador?

Me gustaría mostrar algunos elementos de UI adicionales cuando el proceso se ejecuta como Administrador en lugar de cuando no lo es, de forma similar a como Visual Studio 2008 muestra ‘Administrador’ en su barra de título cuando se ejecuta como administrador. ¿Cómo puedo decir?

Técnicamente, si quiere ver si el miembro es la cuenta de administrador local, entonces puede obtener el identificador de seguridad (SID) del usuario actual a través de la propiedad del User en la clase WindowsIdentity , de esa manera (el método GetCurrent estático obtiene el Windows actual) usuario):

 WindowsIdentity windowsIdentity = WindowsIdentity.GetCurrent(); string sid = windowsIdentity.User.ToString(); 

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

Luego debería verificar si el SID tiene el siguiente patrón, que indica que es la cuenta de administrador local (que es un conocido SID) :

S-1-5- {otras partes de SID} -500

O bien, si no desea analizar las cadenas, puede usar la clase SecurityIdentifier :

 // 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 realmente desea saber es si el usuario actual es miembro del grupo de administradores de la máquina local. Puede obtener este SID utilizando el BuiltinAdministratorsSid de BuiltinAdministratorsSid :

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

A continuación, puede verificar la propiedad de Groups en 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); 

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); 

Aquí hay un trazador de líneas para hacerlo.

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

Me pareció importante señalar la dificultad que tuve al intentar utilizar WellKnownSidType.BuiltinAdministratorsSid por la respuesta de casperOne anterior. De acuerdo con WellKnownSiDType MSDN , BuiltinAdministratorsSid “Indica un SID que coincide con la cuenta de administrador”. Así que esperaría que el código de CasperOne funcione, y supongo que probablemente sí en algunos entornos. Desafortunadamente, no lo hizo en mi Windows 2003 con .NET 2.0 (código heredado). De hecho, devolvió S-1-5-32-544 que, de acuerdo con este artículo es el Sid para el grupo Administradores. Por lo tanto, la comparación falla para mí. Tendré que hacer mi propia comparación de cadenas para startswith “S-1-5-21” (que kb 243330 indica que el “21” está incluido aunque el blog al que se hace referencia arriba no) y que termine con “500”.