2010-06-26 15 views
8

He leído varias preguntas sobre el UAC y la elevación de privilegios, pero no he encontrado una respuesta satisfactoria/completa.Patrón de solicitud de UAC y elevación

que tienen 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 única si se requiere la elevación de privilegios para completar la tarea. - Sé que en la interfaz de usuario de Windows el escudo siempre se visualiza para "tareas administrativas", incluso si el UAC está desactivado, pero el cliente tenía esta solicitud específica.

tengo proyecto esta condición con el fin de muestran el icono:

  1. el usuario ha 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 elevatio n siempre se requiere independientemente de UAC. El # 2 implica que el usuario tiene derechos administrativos, y cualquier otro valor de TOKEN_ELEVATION_TYPE significa que no se necesita elevación.

¿Es así de simple? Me falta algo? Y, ¿hay un patrón documentado o bien conocido con respecto a este tema?

+1

Esta es una pregunta bien escrita, si he visto una. – badp

+0

@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

Respuesta

3

Tienes razón. La mayoría de las personas simplemente ponen el escudo si el botón se elevará, pero lo correcto es poner el escudo si el botón causará elevación (es decir, suprímalo si ya estás elevado, ya que todo lo que inicies permanecerá elevado) a menos que tenga problemas para iniciar un proceso no elevado y suprímalo si el UAC está desactivado).

La buena noticia es que si alguien del grupo Administradores ejecuta (bajo UAC) una aplicación no elevada, usted ' Volveré a obtener false cuando me pregunte si es administrador o no. Así que creo que estarás bien con solo esa prueba.

+1

Bueno, en realidad hay una razón para poner el escudo incluso si la aplicación ya está elevada (o si el UAC está desactivado): de esta manera, el usuario reconocerá inmediatamente que el botón hace "cosas administrativas". Admito este estilo de interfaz de usuario, pero el cliente no. – Wizard79

+0

Entonces, ¿crees que puedo confiar solo en el cheque número 1? – Wizard79

+0

Creo que deberías codificarlo como "si no eres administrador, ponte el protector" y luego ejecuta todos tus casos de prueba para ver si es suficiente. Mi sospecha es que lo hará. –

2

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.

Cuestiones relacionadas