Как заставить упакованное Java-приложение запускаться от имени администратора - PullRequest
0 голосов
/ 27 января 2019

Я пытаюсь упаковать java-приложение с помощью инструмента java packager (я новичок в этом инструменте), само приложение должно сделать несколько внутренних вызовов (используя api-процесс java)

Это прекрасно работаетесли приложение Java запускается с правами администратора.например, если я запускаю мое jar-приложение как sudo java -jar application.jar, то все подпроцессы также становятся администраторами.

В целях распространения У меня нет контроля над тем, как пользователи будут запускать приложение. , таким образом, пытаюсь использовать инструмент java packager, но мне нужно обеспечить, чтобы приложение запускалось с правами администратора.(нормально, приложение остановится, если у пользователя нет sudo, например)

Другой обходной путь, которого я очень хочу избежать, - попросить пользователя ввести пароль admin / sudo при запуске внутренних процессов...

--- EDIT --- Я думаю, мне нужно было добавить больше фона после комментариев и ответа, который я получил.хотя проблема заключается в обнаружении администратора или нет .. это не та проблема, с которой я сталкиваюсь.

class MyApp...
main(...){
   System.exec("start format.app")
}

format.app требует администратора для работы.

Я использую javapackagerинструмент для распространения MyApp.app (для Mac) MyApp.exe (для Windows) и т.д ...

  • Я хочу, чтобы MyApp.app был исполняемым только для пользователя с правами администратора.если пользователь пытается запустить MyApp.app не имеет прав администратора, ОС запросит ввод учетных данных, иначе ОС не позволит запустить приложение.

  • мой обходной путь используетsudo но их мне нужно предложить пользователю ввести пароль .. что для меня является проблемой безопасности (приглашение не является Native) и 2 / I этот подход слабее и может раскрыть пароль при подключении к процессу

Ответы [ 2 ]

0 голосов
/ 07 февраля 2019

решено путем добавления предустановленного скрипта в javapackager.Сценарий будет запускаться с правами root во время развертывания, что дает мне контроль над подготовкой всего, что нужно приложению во время выполнения.

0 голосов
/ 27 января 2019

Это пример реализации Определите, было ли приложение Java запущено от имени администратора Windows , с небольшим дополнительным указанием, как я представляю, как оно может работать.

MainClass

Это «лаунчер», если хотите.Это «основной» метод проверки прав администратора.если они присутствуют, класс Real вызывается с предоставленными аргументами.Программа будет работать с точностью до jvm.

Если нет, пользователю будет выдано сообщение «Для запуска этого приложения требуются права администратора»

package com.so.test.admindemo;

import java.io.IOException;
import java.io.PrintStream;
import java.util.prefs.Preferences;

public class MainClass {

    public static boolean isAdmin() {
        Preferences prefs = Preferences.systemRoot();
        PrintStream systemErr = System.err;
        synchronized (systemErr) {    // better synchronize to avoid problems with other threads that access System.err
            System.setErr(null);
            try {
                prefs.put("foo", "bar"); // SecurityException on Windows
                prefs.remove("foo");
                prefs.flush(); // BackingStoreException on Linux
                return true;
            } catch (Exception e) {
                return false;
            } finally {
                System.setErr(systemErr);
            }
        }
    }

    public static void main(String[] args) throws IOException {
        if (isAdmin()) {
            AdminOnlyClass.main(args);
        } else {
            //Check for environment and escalate privelegs
            System.out.println("Administrator Privileges required. Please rerun with appropriate permissions.");
            System.exit(1);
        }
    }

}

AdminOnlyClass

Это класс, требующий прав администратора.

package com.so.test.admindemo;

public class AdminOnlyClass {
    public static void main(String[] args) {
        System.out.println("Got admin!");
    }
}
...