Pregunta

He leído varias preguntas relacionadas con el UAC y elevación de privilegios pero no he encontrado una respuesta satisfactoria / integral.

Tengo este escenario: en Windows 6 o superior, cuando el usuario abre una ventana de configuración que tengo para mostrar el escudo (BCM_SETSHIELD) en el botón Aceptar Sólo si se requerirá de elevación de privilegios a completa la tarea. -. Yo sé que en la interfaz de usuario de Windows el escudo siempre se visualiza para "tareas administrativas", incluso si UAC está desactivado, pero el cliente tenía esta solicitud específica

Tengo redactar esta condición con el fin de Mostrar en el icono:

  1. El usuario tiene no derechos administrativos
    o
  2. El proceso actual tiene TOKEN_ELEVATION_TYPE == TokenElevationTypeLimited

La condición # 1 es simple: si el usuario no tiene derechos administrativos elevación es siempre necesaria, independientemente de UAC. El # 2 implica que el usuario tiene derechos administrativos, y cualquier otro valor de los medios TOKEN_ELEVATION_TYPE que no se necesita la elevación.

¿Es realmente así de simple? Me estoy perdiendo algo? Y - hay un patrón documentado o notoriamente conocida en relación con este tema

¿Fue útil?

Solución

Tiene usted razón. La mayoría de la gente sólo hay que poner el escudo de si va a correr elevó el botón, pero lo que hay que hacer es poner el escudo sobre si el botón hará que la elevación (es decir suprimirlo si ya son elevados, ya que todo lo que el lanzamiento se mantendrá elevada a menos que vaya a algunos problemas para poner en marcha un proceso no elevada, y suprimir si UAC está apagado.)

La buena noticia es que si alguien en las carreras grupo de administradores (UAC) en virtud de una solicitud no elevada, que pondremos en contacto false cuando se pregunta si es un administrador o no. Así que creo que podría estar bien con sólo esa prueba.

Otros consejos

veo que hay una gran confusión acerca de este tema y la respuesta de Kate aquí no es correcta e incompleta.

Desde Vista un administrador puede registrar en sus procesos, pero no se ejecutan automáticamente elevado. Un administrador tiene lo que se denomina "Split simbólico". Esto significa que no pueden ser procesos en ejecución para el usuario admin MISMO, y algunos de ellos se ejecutan elevados y otros no se ejecutan elevado. Cuando un administrador ejecuta un proceso no elevado, algunos de los privilegios de su ficha se han eliminado. No es más que en XP donde TODOS los procesos se ejecutan ya sea elevado o no elevado.

Instalar Process Explorer www.sysinternals.com y habilitar la columna "Nivel de integridad". Si usted ve allí "Medio" este proceso no se ejecuta elevado. Si usted ve allí las carreras "Alto" de proceso elevadas. Si se ejecuta el proceso con un nivel de integridad "alta" no UAC se requiere para iniciar otro proceso de elevación.

Cuando UAC está completamente apagado, todos los procesos se ejecutan "alta", por lo que nunca es necesaria ninguna elevación. UAC se puede desactivar en

HKLM\Software\Microsoft\Windows\CurrentVersion\Policies\System

Configuración de la "EnableLUA" llave. Al cambiar esta configuración requiere reiniciar el sistema.

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 de elevación de otro proceso no elevado y NO UAC se mostrará.

Esta configuración se almacena en la misma ruta de registro en la clave "ConsentPromptBehaviorAdmin" para los usuarios de administrador.

Para todos los usuarios que no sean administradores no es la clave "ConsentPromptBehaviorUser", pero esto cambia sólo el bahavior, pero la elevación no se puede apagar. No siempre se llega a los administradores un mensaje de UAC. (Si UAC no está completamente apagado)

¿Cómo sabe si sus elevados ejecuta el proceso: OpenProcess() llamada, entonces OpenProcessToken(), entonces GetTokenInformation(TokenElevation).

Y para conseguir el nivel de integridad de GetTokenInformation(TokenIntegrityLevel) llamada y luego GetSidSubAuthority()

Así que si desea mostrar el icono de la elevación sólo si es realmente necesario debe comprobar si sus ejecuta el proceso elevadas y, además, comprobar estas claves del registro y debe saber si el usuario es un administrador o no. Este entrana varias líneas de código y me plantearía a mostrar este icono siempre que la elevación puede se requerirá que sea sencillo.

Tenga en cuenta que el IsUserAnAdmin() API está en desuso. No debe ser utilizado más ya que Vista. Comprobando si un usuario pertenece al grupo de administradores es mucho más código ahora.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top