2009-02-03 19 views
31

Me gustaría mostrar algunos elementos de IU 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?¿Cómo puedo saber si mi proceso se está ejecutando como administrador?

+0

respuesta a esto es la misma: http://stackoverflow.com/questions/95912/how-can-i-detect-if-my-process-is-running-uac-elevated-or- no – DSO

+0

También eche un vistazo aquí http://www.blackwasp.co.uk/CheckAdmin.aspx –

Respuesta

33

Técnicamente, si usted quiere ver si el miembro es el local de cuenta de administrador , entonces se puede obtener la security identifier (SID) del usuario actual a través de la User property en el WindowsIdentity class, al igual que (la estática GetCurrent method obtiene el usuario actual de Windows):

WindowsIdentity windowsIdentity = WindowsIdentity.GetCurrent(); 

string sid = windowsIdentity.User.ToString(); 

la propiedad User devuelve el SID del usuario que has a number of predefined values for various groups and users.

allí tendría que comprobar para ver si the SID has the following pattern, indicating it is the local administrator account (which is a well-known SID):

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

O, si usted no quiere analizar cadenas, puede utilizar 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); 

Howeve r, sospecho que lo que realmente quiere saber es si el usuario actual es un miembro de los administradores grupo para la máquina local. Usted puede obtener este SID utilizando el WellKnownSidType de BuiltinAdministratorsSid:

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

A continuación, se puede comprobar la Groups property en el WindowsIdentity del usuario para ver si ese usuario es miembro del grupo de administrador local, así:

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

¿Esto comprueba si el usuario actual es un administrador o el proceso se está ejecutando como administrador?Un usuario que no es administrador todavía puede ejecutar un proceso como administrador haciendo clic derecho en el proceso y seleccionando "Ejecutar como administrador". –

+1

@JanTacci Si el usuario hace clic derecho y elige ejecutar como administrador, el proceso se ejecuta como el usuario en el grupo de administradores que se seleccionó del cuadro de diálogo UAC que se muestra, el proceso no se ejecuta bajo el usuario conectado en ese punto . – casperOne

+2

ser un administrador y ejecutar la aplicación como administrador son dos cosas diferentes. Incluso si soy administrador, aún puedo ejecutar la aplicación sin privilegios, lo que en mi situación me causa problemas. –

19

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

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 el 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). En realidad, devolvió S-1-5-32-544 que, de acuerdo con this article es el sid para los administradores grupo. 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".

2

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

using System.Security.Principal; 

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