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?
Respuesta
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);
¿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". –
@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
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. –
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);
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".
Aquí hay un trazador de líneas para hacerlo.
using System.Security.Principal;
static bool IsElevated => new WindowsPrincipal(WindowsIdentity.GetCurrent()).IsInRole(WindowsBuiltInRole.Administrator);
- 1. ¿Cómo puedo saber si un proceso se está ejecutando?
- 2. ¿Cómo puedo detectar si mi proceso se está ejecutando UAC elevado o no?
- 3. ¿Cómo puede saber mi programa si Delphi se está ejecutando?
- 4. Comprobar si el proceso se está ejecutando
- 5. ¿Cómo puedo saber si un proceso ya se está ejecutando usando C#?
- 6. ¿Cómo puedo saber si un proceso se está ejecutando en C?
- 7. Dentro de un archivo por lotes, ¿cómo puedo saber si se está ejecutando un proceso?
- 8. ¿Cómo puedo probar si R se está ejecutando como Rscript?
- 9. ¿Cómo puedo determinar si mi proceso se está ejecutando de forma interactiva?
- 10. ¿Cómo puedo saber si mi aplicación se está ejecutando en una sesión de RDP
- 11. ¿Cómo puedo saber si mi script de Perl se está ejecutando en Windows?
- 12. ¿Cómo puedo saber si mi kernel OpenCL se está ejecutando en una GPU?
- 13. ¿Cómo saber si se está ejecutando un temporizador?
- 14. ¿Cómo puedo saber si mi aplicación se está ejecutando como una aplicación de 32 bits o de 64 bits?
- 15. Cómo saber si el servidor de emacs se está ejecutando
- 16. ¿Cómo saber si la actualización MATERIALIZED VIEW se está ejecutando?
- 17. ¿Cómo verificar si un proceso se está ejecutando con Delphi?
- 18. Comprobando si mi aplicación de Windows se está ejecutando
- 19. ¿Cómo puedo saber si mi aplicación para iPhone se está ejecutando cuando se recibe una notificación push?
- 20. ¿Cómo puedo saber en qué dispositivos/versiones de sistema operativo se está ejecutando mi aplicación iOS?
- 21. ¿Cómo puedo saber bajo qué versión de IIS se está ejecutando mi aplicación Asp.Net?
- 22. ¿Cómo puedo saber si un script Perl se está ejecutando en contexto CGI?
- 23. Comprobando si el proceso aún se está ejecutando?
- 24. ¿Cómo puedo saber en qué directorio se está ejecutando mi aplicación de consola con C#?
- 25. ¿Puedo saber, en node.js, si mi script se está ejecutando directamente o está siendo cargado por otro script?
- 26. ¿Cómo saber si mi componente Java está en un Applet?
- 27. Powershell: si un proceso no se está ejecutando, inícielo
- 28. ¿Cómo saber en qué cuenta se está ejecutando mi código ASP.NET?
- 29. ¿Cómo puedo saber si el código de Rails se está ejecutando mediante rake o script/generate?
- 30. ¿Cómo puedo saber si Autovacuum se está ejecutando en Windows Server 2003 para mi base de datos PGSQL?
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
También eche un vistazo aquí http://www.blackwasp.co.uk/CheckAdmin.aspx –