2011-01-11 13 views
11

Necesito usar la característica systemRoot de la API de Preferencias, pero falla debido a la falta de permisos en Windows si UAC está activado. Estoy tratando de encontrar los detalles técnicos para abrir el prompt de UAC y elevar mis permisos para permitir que las actualizaciones de systemRoot tengan éxito.¿Cómo elevo mis permisos de UAC de Java?

+0

posible duplicado de [UAC y Java] (http://stackoverflow.com/questions/1076794/uac-and-java) –

+0

Tipo de. Sin embargo, esa pregunta en particular carece de detalles técnicos necesarios para que funcione. Estoy buscando información * práctica *, no la teoría que todos ya sabemos. :-) –

+1

Hay un error de "no arreglar" en la base de datos de errores de Java: http://bugs.java.com/bugdatabase/view_bug.do?bug_id=6790382 –

Respuesta

6

Según la respuesta aceptada al this SO question, no puede cambiar los permisos de UAC de un proceso en ejecución.

De acuerdo con las respuestas a this SO question, posibles formas de iniciar un proceso con permisos elevados son:

  • crear un contenedor para poner en marcha la máquina virtual Java (con los argumentos adecuados!) Con un manifiesto de ventanas que se solicita privilegios planteadas o
  • usan la aplicación vinculada a la segunda respuesta para ejecutar la JVM con privilegios elevados.
+0

El problema que estoy teniendo es que puedo ' t consigue que la JVM se inicie con privilegios elevados por alguna razón. –

+0

@brian - Creo que va a necesitar proporcionar algún código de cómo está tratando de iniciar el elevado –

+0

He renunciado a la API de Preferencias, simplemente voy a hacer los archivos de configuración almacenados en el directorio de todos los usuarios. No es necesario realizar una escalada de UAC para eso. –

2

Además del manifiesto El uso de JNI para llamar a ShellExecute con verb = runas también lo hará, pero especificar cosas con un manifiesto es una forma más robusta de hacerlo. Obtener un manifiesto incrustado en un exe puede ser un poco complicado, y había muchos problemas con el manejo de los manifiestos en versiones anteriores de Visual C++, pero la mayoría están resueltos ahora.

Dicho esto, le animo a pensar detenidamente acerca de por qué necesita acceder a la raíz del sistema: ¿se trata de almacenar las configuraciones para todos los usuarios? Si es así, es posible que desee considerar tener una aplicación separada para administrar esas configuraciones (con su propio manifiesto). No se puede abrir un cuadro de diálogo de elevación de UAC. En realidad, debe iniciar un nuevo proceso (si observa el administrador de tareas con aplicaciones que parecen funcionar de esta manera, verá que se lanza una segunda instancia de la aplicación). - mira la columna de virtualización de UAC en el administrador de tareas para ver las diferencias).

Otra posibilidad es ajustar la configuración de seguridad en el área del registro que debe configurar desde su proceso no elevado, pero esto va en contra del diseño de UAC, y casi siempre causará más problemas de lo que es valor. Probablemente sea mejor beber el M $ kool-aid y diseñar su aplicación correctamente para UAC. (Créanme, siento su dolor en esto, lo he repetido varias veces).

Como yo estaba experimentando este dolor a mí mismo, me encontré con el siguiente artículo de MSDN bastante útil para entender la intención del diseño Microsoft con el UAC:

http://msdn.microsoft.com/en-us/library/aa511445.aspx

Espero que esto ayude ...

+0

Desafortunadamente, no parece haber ninguna forma de evitarlo. Tengo datos que cualquier usuario debe poder actualizar para todos los usuarios de nuestra aplicación. Solíamos tener archivos de dependencia en Archivos de programa, pero eso no funciona en el NWO. La API de preferencias parece ser el camino a seguir, pero me encuentro con problemas específicos de la plataforma de Windows (nuestra aplicación también se usa en OS X y * nix). Una aplicación de actualización separada estaría bien. He intentado simplemente lanzar otra copia de mi aplicación, pero con opciones de línea de comando para seleccionar una ruta de código alternativa para hacer la actualización (mantiene el empaquetado más simple que la agrupación de otra aplicación). –

+0

sí - elevar para establecer esas configuraciones específicas es lo correcto (también puede ajustar los permisos de la carpeta durante la instalación, a veces es apropiado, otras veces no). –

2

Puede utilizar la biblioteca-como-root ejecute: https://github.com/dyorgio/run-as-root

// Specify JVM options (optional) 
RootExecutor rootExecutor = new RootExecutor("-Xmx64m"); 

// Execute privileged action 
rootExecutor.run(() -> System.out.println("Call your admin code here.")); 

PS: soy el autor.

Cuestiones relacionadas