Veo que hay mucha confusión sobre este tema y la respuesta de Kate aquí no es correcta ni está incompleta.
Dado que Vista an Admin puede haber iniciado sesión pero sus procesos no se ejecutan automáticamente. Un administrador tiene un llamado "Split Token". Esto significa que puede haber procesos en ejecución para el MISMO usuario administrador, y algunos de ellos se ejecutan elevados y otros NO se ejecutan elevados. Cuando un administrador ejecuta un proceso no elevado, se han eliminado algunos de los privilegios de su token. Ya no es como en XP donde TODOS los procesos se ejecutan elevados o no elevados.
Instale Process Explorer en www.sysinternals.com y habilite la columna "Nivel de integridad". Si ves allí "Medio" este proceso no se ejecuta elevado. Si ves allí "Alto" el proceso se ejecuta elevado. Si el proceso se ejecuta con el nivel de Integridad "Alto", no se requiere un aviso de UAC para iniciar otro proceso elevado.
Cuando el UAC está completamente desactivado, TODOS los procesos se ejecutan en "Alto", por lo que nunca se requiere elevación. UAC se puede desactivar bajo
HKLM\Software\Microsoft\Windows\CurrentVersion\Policies\System
estableciendo la clave "EnableLUA
". Cambiar esta configuración requiere reinicio.
Pero hay otro punto que aún no se ha mencionado aquí. En el panel de control, es posible configurar "Elevar sin preguntar". Y en este caso, un usuario administrador puede iniciar un proceso elevado desde otro proceso no elevado y no aparecerá ningún mensaje de aviso de UAC.
Esta configuración se almacena en la misma ruta de registro en la clave "ConsentPromptBehaviorAdmin
" para usuarios de administrador.
Para todos los usuarios que no sean administradores, existe la clave "ConsentPromptBehaviorUser
", pero esto solo cambia el comportamiento, pero la elevación no se puede desactivar. Los que no son administradores siempre recibirán un aviso de UAC. (UAC si no está completamente apagado)
¿Cómo saber si su proceso se ejecuta elevado: llamada OpenProcess()
, entonces OpenProcessToken()
, entonces GetTokenInformation(TokenElevation)
.
Y para conseguir la llamada Nivel de Integridad de GetTokenInformation(TokenIntegrityLevel)
y luego GetSidSubAuthority()
lo tanto, si desea mostrar el icono sólo si la elevación es realmente necesario se debe comprobar si el proceso se ejecuta elevada y, además, comprobar estas claves del registro y que debe saber si el usuario es administrador o no Esto implica varias líneas de código y consideraría mostrar este ícono siempre cuando se requiera una elevación de para mantenerlo simple.
Tenga en cuenta que la API IsUserAnAdmin()
está en desuso. No debe usarse más desde Vista. Verifica si un usuario pertenece al grupo de administradores es mucho más código ahora.
Esta es una pregunta bien escrita, si he visto una. – badp
@badp: Lo he pensado un poco y lo he investigado un poco, pero todavía me desconcierta, ya que parece demasiado fácil ... quizás no haya tenido en cuenta algunas condiciones de contorno. – Wizard79