2014-10-30 24 views
5

Piszę instalator w języku Java, który będzie wymagał podwyższonych uprawnień dostępu do katalogu Program Files. Na podstawie informacji, że już znaleźć w internecie, pisałem implementację następująco:Uruchamianie aplikacji Java jako administrator w systemie 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 
    } 
} 

Test że używam do sprawdzenia uprawnień jest lekko modyfikowany odpowiedź znaleźć here i wygląda następująco:

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; 
} 

Po uruchomieniu, nie przejdzie testu uprawnień - zgodnie z oczekiwaniami - i wykona wywołanie exec. Sprawdzenie, czy połączenie zadziałało, patrząc na p.isAlive() pokazuje, że proces jest w rzeczywistości żywy; jednak nie widzę żadnych dowodów na nowy proces, a system Windows nie zachęca mnie do przyznania uprawnień.

Nie jestem zaznajomiony z używaniem exec() w Javie, więc jest całkiem możliwe, że jakoś źle zinterpretowałem jego użycie. Jeśli o to chodzi, czy to, co próbuję tutaj zrobić, jest możliwe? Jeśli nie, czy istnieje prosta alternatywa, która dostarczy mi wyniki, których szukam?

+1

W Windows 8 (prawdopodobnie także w innych), użycie 'runas' nie wywołuje popupów UAC, ale zamiast tego monituje o podanie hasła przez stdin. Spróbuj uruchomić 'runas/profile/user: Administrator notepad' w oknie wiersza polecenia; to może wyjaśnić twój problem. – Pokechu22

+1

Rzeczywiście tak jest w tym przypadku. Przypuszczam, że prowadzi to do następującego pytania: jak mogę wyświetlić wyskakujące okienko UAC w Javie? Alternatywnie moją platformą docelową jest Windows 7 (mimo że rozwijam się na platformie Windows 8). Czy ten kod zrobi to, co zamierzam na tej platformie? – bionicOnion

+1

Jednym z rozwiązań byłoby napisanie prostej aplikacji w C, aby ponownie uruchomić program Java dla ciebie. Możesz przekazać aplikacji manifest aplikacji informujący system Windows, że wymagane jest podniesienie. Jednak może istnieć sposób, aby zrobić to bezpośrednio w Javie i jest to interesujące pytanie. +1. –

Odpowiedz

1

OK, w końcu udało mi się znaleźć rozwiązanie tego problemu, z którego jestem zadowolony; To trochę brzydka strona, ale działa to, co robię.

Pożyczyłem kod od odpowiedzi this, aby wykonać rzeczywistą elewację przywileju; od tego czasu chodziło o to, aby takie rozwiązanie działało z Javą. Kod na który kończy się wyglądać jak ten:

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 
    } 

Sposób checkPrivileges pozostaje niezmieniona od góry i klasa Elevator jest praktycznie identyczny z tym, który pojawia się w połączonym roztworze (ja po prostu wyjął niepotrzebne main metody) . To rozwiązanie zakłada, że ​​proces, który ma zostać podniesiony, jest słojem; nie powinno to być zbyt trudne, aby zmienić to w zależności od indywidualnych potrzeb.

0

Uważam, że najlepszym sposobem na osiągnięcie tego celu jest użycie narzędzi stworzonych przez Microsoft dla programistów, ponieważ nie można tego zrobić w prostej Java. W takim przypadku użyj pliku manifestu http://msdn.microsoft.com/en-us/library/aa375632(v=vs.85).aspx Po prostu skompiluj plik .exe, który prosi o te uprawnienia, a następnie spawnuje twój program java.