Sto scrivendo un programma di installazione in Java che richiederà di conseguenza privilegi elevati per accedere alla directory Programmi. Sulla base delle informazioni che ho trovato on-line, ho scritto un'implementazione come segue:Esegui l'applicazione Java come amministratore su Windows
public static void main(String args[]) {
if (!checkPrivileges()) { // spawn a copy w/ elevated privileges
Runtime runtime = Runtime.getRuntime();
try {
Process p = runtime.exec(
"runas /profile /user:Administrator \"java -cp . main.Main\"");
} catch (IOException e) { ... }
} else {
// Run with elevated privileges
}
}
Il test che sto usando per verificare la presenza di privilegi viene modificata leggermente da una risposta trovato here e si presenta così:
private static boolean checkPrivileges() {
File testPriv = new File("C:\\Program Files\\");
if (!testPriv.canWrite()) return false;
File fileTest = null;
try {
fileTest = File.createTempFile("test", ".dll", testPriv);
} catch (IOException e) {
return false;
} finally {
if (fileTest != null)
fileTest.delete();
}
return true;
}
Quando eseguo questo, non riesce il test dei privilegi - come previsto - e effettua la chiamata a exec. Controllare se la chiamata ha funzionato guardando p.isAlive()
indica che il processo è, in effetti, vivo; tuttavia, non vedo alcuna prova del nuovo processo e Windows non mi richiede di concedere le autorizzazioni.
Non ho familiarità con l'utilizzo di exec()
in Java, quindi è abbastanza probabile che io abbia frainteso il suo utilizzo in qualche modo. Del resto, è ciò che sto tentando di fare anche qui? In caso contrario, esiste un'alternativa semplice che mi consentirà di ottenere i risultati che sto cercando?
In Windows 8 (probabilmente anche altri), l'uso di 'runas' non fa apparire un popup UAC, ma richiede di inserire la password tramite stdin. Prova a eseguire 'runas/profilo/utente: Blocco note dell'amministratore' in una finestra del prompt dei comandi; questo potrebbe spiegare il tuo problema. – Pokechu22
Sembra proprio che sia così. Suppongo che questo porti solo a una domanda successiva: come posso far apparire un popup UAC in Java? In alternativa, la mia piattaforma di destinazione è Windows 7 (anche se sto sviluppando su una piattaforma Windows 8). Questo codice farà ciò che intendo su quella piattaforma? – bionicOnion
Una soluzione sarebbe scrivere una semplice applicazione in C per rilanciare il tuo programma Java per te. È possibile fornire all'applicazione un manifest dell'applicazione per comunicare a Windows che è richiesta l'elevazione. Tuttavia, potrebbe esserci un modo per farlo direttamente in Java, ed è una domanda interessante. +1. –