Rileva se l’applicazione Java è stata eseguita come amministratore di Windows

Ho un’applicazione Java. C’è comunque che posso dire se il processo è stato eseguito con privilegi di amministratore, su Windows 7.

Ho trovato questo snippet di codice online, che penso che farà il lavoro per te.

public static boolean isAdmin() { String groups[] = (new com.sun.security.auth.module.NTSystem()).getGroupIDs(); for (String group : groups) { if (group.equals("S-1-5-32-544")) return true; } return false; } 

Funziona SOLO su Windows e viene integrato nel pacchetto Java di base. Ho appena testato questo codice e funziona. Mi ha sorpreso, ma lo fa.

Il SID S-1-5-32-544 è l’id del gruppo Administrator nel sistema operativo Windows.

Ecco il link per maggiori dettagli su come funziona.

Ho trovato una soluzione diversa che sembra essere indipendente dalla piattaforma. Prova a scrivere le preferenze di sistema. Se fallisce, l’utente potrebbe non essere un amministratore.

 public static boolean isAdmin(){ Preferences prefs = Preferences.systemRoot(); try{ prefs.put("foo", "bar"); // SecurityException on Windows prefs.remove("foo"); prefs.flush(); // BackingStoreException on Linux return true; }catch(Exception e){ return false; } } 

Come suggerito da Tomáš Zato , potresti voler sopprimere i messaggi di errore causati da questo metodo. Puoi farlo impostando System.err:

 public static boolean isAdmin(){ Preferences prefs = Preferences.systemRoot(); PrintStream systemErr = System.err; synchronized(systemErr){ // better synchroize to avoid problems with other threads that access System.err System.setErr(null); try{ prefs.put("foo", "bar"); // SecurityException on Windows prefs.remove("foo"); prefs.flush(); // BackingStoreException on Linux return true; }catch(Exception e){ return false; }finally{ System.setErr(systemErr); } } } 

Non esiste una tale funzione disponibile in Java Runtime Environment, ma potrebbe essere in una routine nativa dipendente dalla piattaforma. Nota che in genere il modo migliore per essere certi è provare effettivamente a farlo, e vedere se fallisce.

Solo tentando un’operazione che richiede tale accesso (come l’associazione di una porta con un numero basso o l’apertura di un file protetto).

Il metodo dalla risposta ha funzionato meglio per me fino al punto in cui ho dovuto creare il codice in Jenkins su una macchina Linux. com.sun.security.auth.module.NTSystem () non è disponibile lì e l’uso di pacchetti Sun è generalmente considerato una ctriggers pratica: link

O potresti fare questo:

System.getenv().get("USER")

E vedi quale utente ha avviato il processo.

Quando lo eseguo come me ottengo “goran”, quando lo eseguo con sudo ottengo “root”. Funziona su Linux. Probabilmente ciò che era necessario.

Ecco una soluzione su Windows 10, suppongo che venga eseguita correttamente anche su altri SO Windows.

 public static boolean isAdmin() { try { ProcessBuilder processBuilder = new ProcessBuilder("cmd.exe"); Process process = processBuilder.start(); PrintStream printStream = new PrintStream(process.getOutputStream(), true); Scanner scanner = new Scanner(process.getInputStream()); printStream.println("@echo off"); printStream.println(">nul 2>&1 \"%SYSTEMROOT%\\system32\\cacls.exe\" \"%SYSTEMROOT%\\system32\\config\\system\""); printStream.println("echo %errorlevel%"); boolean printedErrorlevel = false; while (true) { String nextLine = scanner.nextLine(); if (printedErrorlevel) { int errorlevel = Integer.parseInt(nextLine); return errorlevel == 0; } else if (nextLine.equals("echo %errorlevel%")) { printedErrorlevel = true; } } } catch (IOException e) { return false; } }