2008-08-20 11 views

Respuesta

25

La mejor manera de detectar si no pueden realizar una acción es intentarlo y atrapar el UnauthorizedAccessException.

Sin embargo, como @DannySmurfcorrectly points out solo puede elevar un objeto COM o separar el proceso.

Hay una aplicación de demostración dentro de las muestras de tecnología cruzada de Windows SDK llamada UAC Demo. Esta aplicación de demostración muestra un método de ejecución de acciones con un proceso elevado. También demuestra cómo averiguar si un usuario es actualmente un administrador.

+0

Buena referencia de la demo de UAC, exactamente lo que necesitaba. Muchas gracias. ¡Ojalá pudiera dar más representantes a veces! – Ryan

+0

@Ryan De nada. Estoy un poco frustrado de lo difícil que parece ser el UAC en un entorno administrado. ¡Siéntete libre de navegar mi perfil de usuario y votar mis otras preguntas! :) –

+0

BTW, el nombre de la excepción es UnauthorizedAccessException con z en No autorizado. Solo eso ;) –

16

Solicitud de elevación mediados de ejecución requiere que o bien:

  1. utilizar un control COM que está elevado, lo que ejercerá una pronta
  2. iniciar un segundo proceso que se eleva desde el principio.

En .NET, actualmente no hay forma de elevar un proceso en ejecución; tienes que hacer una de las cosas de hackers anteriores, pero todo lo que hace es darle al usuario la apariencia de que el proceso actual se está elevando.

La única manera en que puedo pensar para verificar si una ruta es elevada es intentar escribir algo trivial mientras estás en un estado no elevado, capturar la excepción, elevar e intentar de nuevo.

+7

Tenga en cuenta que esto no es una limitación .NET - es una limitación general del sistema de control de cuentas de usuario. –

+4

Tenga en cuenta que no es una limitación de UAC: es una limitación general del modelo de seguridad en Windows NT (un proceso en ejecución no puede cambiar su token de seguridad). –

+1

Tenga en cuenta que es algo bueno: de lo contrario, un atacante malintencionado podría inyectar código en el proceso de pre-elevación, y este código se elevaría junto con este proceso. – ghord

1

Es posible que desee notificar al usuario que la ruta de acceso está protegida y solicitarle que muestre el archivo en un área "más segura". De esta forma, su aplicación no necesitará elevación. Estoy seguro de que depende de sus usuarios y de lo que intenta hacer, sin embargo, no creo que sea demasiado para dejar que el usuario sepa que no se siente bien descargando xyz en la carpeta Windows/System32.

-1

Si su unidad secundaria tiene sus propios permisos de archivos, por ejemplo, si tiene instalada otra copia de Windows. Indicará.

También le preguntará si los archivos están en uso, lo que a veces ocurre si tiene el explorador de Windows abierto en el mismo directorio y el archivo seleccionado con un visualizador de archivos que muestra los contenidos ... hay otras rarezas, pero generalmente se le pide permiso de archivo si el archivo está en uso o es un directorio sensible.

Si realiza un bucle en el FolderBrowserDialog, asegúrese de notificar al usuario por qué, para que no se enoje con su aplicación.

Nota: apesta no hay forma de .net de pedir permiso, tal vez p/invocar la api win32 ...?

+0

P/Invocar no cambiaría nada; las reglas para UAC son las mismas ya sea que seas administrador o nativo. Es COM, proceso externo o fracaso. –

-1

UAC puede elevar objetos en función de su GUID, esto sería (en teoría) significaría que cualquier clase con un GUID puede ser elevado, La UACDemo también debe mostrar cómo hacer esto

Cuestiones relacionadas