¿Cómo elevo mis permisos de UAC de Java?

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.

De acuerdo con la respuesta aceptada a esta pregunta SO , no puede cambiar los permisos de UAC de un proceso en ejecución.

Según las respuestas a esta pregunta SO , las posibles formas de iniciar un proceso con permisos elevados son:

  • crear un contenedor para iniciar la JVM (con los argumentos apropiados) con un manifiesto de Windows que solicita privilegios elevados, o
  • utilice la aplicación vinculada a la segunda respuesta para ejecutar la JVM con privilegios elevados.

Además del manifiesto Usar JNI para llamar a ShellExecute con verb = runas también hará esto, 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, te animo a pensar mucho sobre por qué necesitas acceder a la raíz del sistema: ¿es para almacenar la configuración de 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 los que vale. 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 misma experimentaba este dolor, el siguiente artículo de MSDN me pareció bastante útil para comprender la intención del diseño de Microsoft con UAC:

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

Espero que esto ayude…

Puede usar la biblioteca run-as-root: 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.")); 

PD: soy el autor.