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