¿Solicitar elevación de Windows Vista UAC si la ruta está protegida?

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

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

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

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

Hay una aplicación de demostración dentro de las muestras de la tecnología cruzada de Windows SDK llamada demo de UAC . 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.

Solicitar la mitad de la ejecución requiere que:

  1. Use un control COM que sea elevado, lo que colocará un aviso
  2. Comience un segundo proceso que sea elevado desde el comienzo.

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 forma en que puedo pensar para verificar si una ruta es elevada es intentar escribir algo trivial mientras estás en un estado no elevado, atrapar la excepción, elevar e intentar de nuevo.

No estoy seguro si es de alguna ayuda para usted, pero puede echar un vistazo a esta publicación en el 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 pedirles que muestren 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.

Si su disco secundario tiene sus propios permisos de archivo, 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 una vista previa de archivos que muestra los contenidos … hay otras rarezas, pero generalmente se le pide un archivo permiso 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 …?

UAC puede elevar el objeto en función de su GUID, esto (en teoría) significa que cualquier clase con un GUID puede ser elevada. El UACDemo también debería mostrar cómo hacerlo.