Pregunta

Para mi aplicación C#, no quiero solicitar siempre la elevación al iniciar la aplicación, pero si eligen una ruta de salida que esté protegida por UAC, entonces debo solicitar la elevación.

Entonces, ¿cómo verifico si una ruta está protegida por UAC y luego cómo solicito una elevación a mitad de ejecución?

¿Fue útil?

Solución

La mejor manera de detectar si son incapaces de realizar una acción es intentarla y atraparla. UnauthorizedAccessException.

Sin embargo, como @DannyPitufo señala correctamente solo puede elevar un objeto COM o un proceso separado.

Hay una aplicación de demostración dentro de los ejemplos de tecnología cruzada del SDK de Windows llamada Demostración de la UAC.Esta aplicación de demostración muestra un método para ejecutar acciones con un proceso elevado.También demuestra cómo saber si un usuario es actualmente administrador.

Otros consejos

Solicitar elevación a mitad de ejecución requiere que usted:

  1. Utilice un control COM elevado, que mostrará un mensaje
  2. Inicie un segundo proceso que sea elevado desde el inicio.

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

La única forma que se me ocurre de comprobar si una ruta tiene UAC elevado es intentar escribir algo trivial en ella mientras estás en un estado no elevado, detectar la excepción, elevarla e intentarlo de nuevo.

No estoy seguro de si te será de ayuda, pero puedes echar un vistazo a esta publicación de blog:

http://haishibai.blogspot.com/2010/01/tiy-try-out-windows-7-uac-using-c-part_26.html

Es posible que desee notificar al usuario que la ruta está protegida y pedirle que envíe el archivo a un área "más segura".De esta manera tu aplicación no necesitará elevación.Estoy seguro de que depende de sus usuarios y de lo que esté intentando hacer, sin embargo, no creo que sea demasiado hacerle saber al usuario que no se siente bien descargando xyz en la carpeta Windows/System32.

Si su unidad secundaria tiene sus propios permisos de archivos, digamos que tiene otra copia de Windows instalada.Le 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 una vista previa de archivos que muestra el contenido...Hay algunas otras rarezas, pero generalmente se le solicita permiso para el archivo si el archivo está en uso o es un directorio confidencial.

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

Nota:Apesta, no hay forma .net de pedir permiso, ¿tal vez p/invocar la API de Win32...?

UAC puede elevar objetos según su GUID, esto (en teoría) significaría que cualquier clase con un GUID puede elevarse. La UACDemo también debería mostrar cómo hacer esto.

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