2014-10-30 24 views
5

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?

+1

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

+1

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

+1

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. –

risposta

1

Ok, finalmente sono riuscito a ottenere una soluzione per questo problema di cui sono soddisfatto; è un po 'brutto, ma funziona per quello che sto facendo.

Ho preso in prestito il codice dalla risposta this per eseguire l'elevazione del privilegio effettivo; da lì, la domanda era quella di ottenere effettivamente quella soluzione per lavorare con Java. Il codice per che finisce per assomigliare a questo:

if (!checkPrivileges()) { 
     try { 
      String jarPath = DownloaderMain.class.getProtectionDomain().getCodeSource().getLocation().getPath(); 
      String decodedPath = URLDecoder.decode(jarPath, "UTF-8"); 
      decodedPath = decodedPath.substring(1, decodedPath.length()); 
      Elevator.executeAsAdministrator(System.getProperty("java.home") + "\\bin\\java", "-jar " + "\"" + decodedPath + "\""); 
     } catch (UnsupportedEncodingException e) { 
      e.printStackTrace(); 
     } 
    } else { 
     // Run with elevated privileges 
    } 

Il metodo checkPrivileges è invariato dall'alto e la classe Elevator è praticamente identico a quello che appare nella soluzione legata (ho appena tirato fuori il metodo non necessarie main) . Questa soluzione presuppone che il processo da elevare sia un vaso; non dovrebbe essere troppo difficile cambiarlo per soddisfare le tue esigenze individuali.

0

Penso che l'approccio migliore per ottenere questo risultato sia quello di utilizzare gli strumenti creati da Microsoft per gli sviluppatori poiché non è possibile farlo in Java semplice. In questo caso usa un file manifest http://msdn.microsoft.com/en-us/library/aa375632(v=vs.85).aspx Costruisci semplicemente il wrapper .exe che richiede questo privilegio e quindi genera il tuo programma java.

Problemi correlati