Java: запуск от имени администратора
Есть ли способ в Java попросить систему получить контроль над функциями администратора. Конечно, не делая: щелкните правой кнопкой мыши на exe -> запустить от имени администратора.
То, что я хочу, это то, что приходит кадр из UAC, как в Windows Vista или Windows 7.
Или я должен сделать некоторые настройки при создании exe из банки?
8 ответов
Вы должны создать файл манифеста, в котором указано, что вашему приложению необходимы разрешения администратора. Вы можете включить манифест в ваш exe-файл или сохранить его как отдельный файл (yourapp.exe.manifest)
Самый простой способ - использовать оболочку для запуска вашей JVM, а затем поднять оболочку. Я использую простой скрипт установщика NSIS с плагином UAC, чтобы сделать это:
; Java Launcher
;--------------
; You want to change the below lines
Name "my program"
Caption "my program Launcher"
Icon "iconfile.ico"
OutFile "java launcher.exe"
; param below can be user, admin
RequestExecutionLevel admin
!include UAC.nsh
SilentInstall silent
AutoCloseWindow true
ShowInstDetails show
Section ""
; command to execute
StrCpy $0 'javaw -jar myjarfile'
SetOutPath $EXEDIR
Exec $0
SectionEnd
Вы можете использовать программу Windows, чтобы повысить свои привилегии. Программа покажет приглашение UAC, а затем у вас будут права администратора.
http://jpassing.com/2007/12/08/launch-elevated-processes-from-the-command-line/
Затем вы можете запустить команду так:
Runtime.getRuntime().exec("Elevate.exe yourcommand");
ZippyV ответит хорошо, если вы намереваетесь запустить javaw.exe с правами системного администратора, который, если чистый java-код блокирует UAC (например, пытается записать файл в привилегированный каталог), то это то, что вы нужно будет сделать.
Однако, если вы пытаетесь запустить что-то внешнее, но только с повышением прав, вы можете связать исполняемый файл, который повышает команду. Вот один.
Я объясню, как вы получаете повышенное Java-приложение
import java.io.IOException;
public class RunAsAdminExample {
public static void main(String[] args) throws IOException {
Process myappProcess = Runtime.getRuntime().exec("powershell.exe Start-Process <program.exe> -verb RunAs");
}
}
Например, program.exe - просто вызов notepad.exe.
import java.io.IOException;
public class RunAsAdminExample {
public static void main(String[] args) throws IOException {
Process myappProcess = Runtime.getRuntime().exec("powershell.exe Start-Process notepad.exe -verb RunAs");
}
}
Чем у вас повышенная программа. Я рекомендую вам - вам нужно конвертировать в двоичную оболочку, такую как Launch4j или Parcle, чем вы можете нажать - если вы создаете пользовательский установщик (созданный Java Swing или Awt.)
Я надеюсь, у вас есть хорошее решение:) - Если вы используете Linux или Mac OS X, тогда вам нужно использовать двоичную оболочку Parcle или другую оболочку, если вы знаете...
// РЕДАКТИРОВАТЬ хорошую идею от Kaptkaos Чем ты пишешь просто:
import java.io.IOException;
public class RunAsAdminExample {
public static void main(String[] args) throws IOException {
Process myappProcess = Runtime.getRuntime().exec("powershell.exe Start-Process -FilePath java.exe -Argument '-jar runasadmin.jar' -verb RunAs");
}
}
Не забудьте использовать ''
а также ""
если -jar <filename>.jar
от - Аргумент Старт-Процесс. Примечание не забывайте - если вы используете рабочий каталог и файл jar должен быть в рабочем каталоге, пример
- .\ MyJar.jar
- Java .\RunAsAdminExample.class
Чем вы можете увидеть повышенную Java с аргументом:)
С наилучшими пожеланиями!
Если вы можете запустить все, что вам нужно, из пакетного файла Windows CMD. Вы можете создать пакетный файл (даже на лету) из вашего Java-приложения, которое делает то, что вы хотите, и запустить его. У меня это работает, так что моя Java-программа запускает это, и он открывает обычное приглашение Windows UAC для пользователя, а затем запускает команды, если они выбирают ДА.
String[] commands = {"cmd.exe", "/C" "mybatchfile.bat"};
ProcessBuilder pb = new ProcessBuilder(commands);
..
pb.start();
Вот поток, который имеет дело с запросом доступа UAC в пакетном файле Windows: Как запросить доступ администратора внутри пакетного файла
ПРИМЕЧАНИЕ: ProcessBuilder может быть немного сложнее иметь дело, использование StreamGobbler для обработки вывода работает для меня: обработка ввода с помощью StreamGobbler
Я использую командную строку в Windows для этой цели. В меню "Пуск" введите cmd в текстовое поле, и когда появится программа cmd.exe, щелкните ее правой кнопкой мыши и выберите "Запуск от имени администратора". Теперь, когда вы выполните java -jar, он запустится с правами администратора.
Доступ к java.exe и javaw.exe внутри папки установки. то есть - C:\Program Files\Java\jre7\bin или C:\Program Files\Java\jdk1.7.0_17\bin щелкните левой кнопкой мыши по ним и выберите свойства-> совместимость и там: установите флажок "запускать эту программу от имени администратора".