Pregunta

Antecedentes: Soy de ninguna manera un ventanas permisos de seguridad / usuario experto. Tengo una aplicación (escrito en C #), que tiene que ser capaz de escribir / borrar archivos y carpetas en el directorio raíz, escribir / borrar archivos en otro lugar en el disco, escribir / modificar los valores de registro del sistema (equipo local) y Start & detención de otras aplicaciones y servicios. Calculo que necesito privilegios de administrador para al menos algunas de esas acciones.

He intentado ejecutar este y en equipos con UAC desactivado funciona muy bien sin ningún ajuste adicional. Sin embargo en equipos con UAC activado (por encima de cualquier nivel 'nunca notificar' en Windows 7) que se colgará. Necesito que funcione en todos los equipos.

Hasta ahora me acaba de comprobar manualmente la casilla de verificación "Ejecutar este programa como administrador" y todo estaría bien. Sin embargo, ahora hemos decidido que vamos a permitir que los clientes instalar este software por su cuenta, y tiene que ejecutar "fuera de la caja".

Tengo un proyecto de implementación en Visual Studio 2008 que se instala todo y escribe los datos necesarios de puesta en marcha en el registro. Lo que tengo que hacer ahora es establecer el indicador de "Ejecutar este programa como administrador". Estoy adivinando esto no es tan simple como me gustaría que fuera.

Así que ¿Cuál es la forma correcta de hacer esto? Este programa se inició el arranque, y sería irritante para nuestros clientes si UAC debería salir hacia afuera (y posiblemente oscurecer la pantalla) cada vez que reinicie su ordenador.

Gracias por su ayuda.

EDIT: Gracias por sus respuestas. Soy consciente de que trabajar cerca de UAC sería mal visto, y puedo ver que Microsoft no soporta "listas blancas" por lo que pedir permiso sólo una vez. Eso está bien puedo respetar eso, sin embargo tengo algunas preguntas de seguimiento:

  • ¿Me puede proporcionar un enlace que me muestran cómo elevar correctamente el programa para corregir estado elevado? ¿Hay alguna literatura sobre cuáles son las opciones, etc ... Básicamente me gustaría una guía UAC 101.

  • ¿Hay una manera de elevar el estado de seguridad cuando necesito los privilegios adicionales (y sólo entonces se pedirá con el UAC). Básicamente, esta aplicación se ejecuta en segundo plano, haciendo sobre todo nada durante la mayor parte del tiempo. De vez en cuando se comprobará algunos archivos (en este punto que se requieren para poder escribir en el disco y leer el registro (sólo lectura está muy bien en este punto), sin embargo, ya que es una carpeta temporal que no importaría donde 'd ponerlo. Si hay un lugar donde la aplicación se puede escribir sin ningún privilegio que sería perfecto.)

    Sin embargo, en algún momento voy a necesitar para preformas todo el resto de las tareas (las necesidades del usuario que confirme esta acción de todos modos) así que si UAC provocaría en este punto que no sería un problema. ¿Hay una manera de elevar sólo en este punto, y luego devolverlo a permisos predeterminados?

  • Será adecuada la solución de este tipo con las versiones anteriores de Windows, incluido Vista y XP (y tal vez mayores?) ¿Qué haría falta para que funcione?

¿Fue útil?

Solución

La forma correcta es elevar al iniciar el programa, con el mensaje de UAC (que se puede establecer a través del manifiesto del programa) -. Tratar de ser inteligentes y de derivación que está mal visto

Piense en esto - si se puede instalar algo lo que elevaría automáticamente sin que el mensaje de UAC ... lo que sería el punto de UAC

Para añadir un manifiesto UAC para un programa sólo tiene que añadir el manifiesto en un proyecto y editarlo. Un manifiesto de muestra para UAC es aquí . Si desea elevar en el último momento posible, entonces se necesita un proceso separado desove - no se puede elevar a un proceso existente. Así que separar poco fuera y vuelva a iniciarlo utilizando

Process.StartInfo.UseShellExecute = true;
Process.StartInfo.Verb = "runas";

Otros consejos

Es necesario volver a pensar cómo funciona su aplicación. Tienes toda la razón en que sería molesto para mostrar un mensaje de elevación de inicio de sesión. Así que no lo haga. Por otro lado, es posible que también tienen tareas que usted necesita para llevar a cabo usando el acceso administrativo.

Así que tienes dos opciones:

  • Cambiar sus tareas de modo que ya no requieren la elevación administrativa (por ejemplo, escribir sus archivos en otro lugar).
  • Divida su aplicación en un componente de servicio de Windows y un componente de interfaz de usuario. El componente de servicio se puede ejecutar bajo una cuenta elevada (esperemos que el menos cuenta -elevated necesaria para llevar a cabo las tareas que hay que hacer). El componente de interfaz de usuario puede hablar con el servicio (a través de canalizaciones con nombre o similares) cuando sea necesario.

Se puede dividir el programa en dos componentes:

  • una aplicación de usuario que ejecuta sin elevación
  • un servicio de Windows que se encarga de las tareas que requieren la elevación

Dado que está utilizando .NET, la comunicación entre los componentes es probablemente más fácil de hacer usando WCF.

Y como nota al margen: la modificación de archivos mediante programación en C: \ Archivos de programa no se considera una buena práctica y podría conducir a una serie de otros problemas. Windows ha dedicado lugares para almacenar los ajustes de configuración y otros datos del programa.

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