Я пишу инсталлятор в Java, который соответственно потребует повышенных привилегий для доступа к каталогу Program Files. На основании информации, которую я нашел в Интернете, я написал реализацию следующим образом:Запуск приложения Java как администратора в 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
}
}
тест, который я использую для проверки привилегий немного изменен от ответа нашел here и выглядит следующим образом:
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;
}
Когда я запустил это, он не прошел тест привилегий - как и ожидалось - и делает вызов exec. Проверка того, работал ли вызов по адресу p.isAlive()
, показывает, что процесс, по сути, жив; однако я не вижу никаких доказательств нового процесса, и Windows не запрашивает разрешения на предоставление разрешений.
Я не знаком с использованием exec()
в Java, поэтому вполне возможно, что я как-то неправильно понял его использование. В этом то, что я пытаюсь сделать здесь, даже возможно? Если нет, есть ли простая альтернатива, которая действительно даст мне результаты, которые я ищу?
В Windows 8 (возможно, и другие) использование 'runas' фактически не вызывает всплывающее окно UAC, но вместо этого оно запрашивает ввод пароля через stdin. Попробуйте запустить «runas/profile/user: Notepad» администратора в окне командной строки; что может объяснить вашу проблему. – Pokechu22
Это действительно так. Я полагаю, что это просто приводит к следующему вопросу: как я могу открыть всплывающее окно UAC на Java? В качестве альтернативы, моей целевой платформой является Windows 7 (хотя я разрабатываю платформу Windows 8). Будет ли этот код делать то, что я намереваюсь на этой платформе? – bionicOnion
Одним из решений было бы написать простое приложение на C, чтобы перезапустить вашу Java-программу для вас. Вы можете предоставить приложению манифест приложения, чтобы сообщить Windows, что требуется высота. Однако, возможно, есть способ сделать это прямо на Java, и это интересный вопрос. +1. –