2014-10-30 4 views
5

Я пишу инсталлятор в 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, поэтому вполне возможно, что я как-то неправильно понял его использование. В этом то, что я пытаюсь сделать здесь, даже возможно? Если нет, есть ли простая альтернатива, которая действительно даст мне результаты, которые я ищу?

+1

В Windows 8 (возможно, и другие) использование 'runas' фактически не вызывает всплывающее окно UAC, но вместо этого оно запрашивает ввод пароля через stdin. Попробуйте запустить «runas/profile/user: Notepad» администратора в окне командной строки; что может объяснить вашу проблему. – Pokechu22

+1

Это действительно так. Я полагаю, что это просто приводит к следующему вопросу: как я могу открыть всплывающее окно UAC на Java? В качестве альтернативы, моей целевой платформой является Windows 7 (хотя я разрабатываю платформу Windows 8). Будет ли этот код делать то, что я намереваюсь на этой платформе? – bionicOnion

+1

Одним из решений было бы написать простое приложение на C, чтобы перезапустить вашу Java-программу для вас. Вы можете предоставить приложению манифест приложения, чтобы сообщить Windows, что требуется высота. Однако, возможно, есть способ сделать это прямо на Java, и это интересный вопрос. +1. –

ответ

1

Хорошо, мне наконец-то удалось найти решение этой проблемы, которой я доволен; это немного на уродливой стороне, но она работает на то, что я делаю.

Я взял взаймы код от this ответ, чтобы сделать фактическое повышение привилегий; оттуда вопрос заключался в том, чтобы получить это решение для работы с Java. Код, который заканчивает тем, как это:

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 
    } 

метод checkPrivileges неизменен сверху и Elevator класса практически идентичен тому, который появляется в связанном растворе (я просто взял ненужную main метода) , Это решение предполагает, что процесс, который должен быть повышен, представляет собой банку; это не должно быть слишком сложно изменить это, чтобы удовлетворить ваши индивидуальные потребности.

0

Я думаю, что наилучшим подходом к достижению этого является использование инструментов, которые microsoft построил для разработчиков, поскольку вы не можете сделать это в простой Java. В этом случае используйте файл манифеста http://msdn.microsoft.com/en-us/library/aa375632(v=vs.85).aspx Просто создайте обертку .exe, которая запрашивает эти привилегии, а затем запускает вашу Java-программу.