0

我正在尝试使用 java 打包器工具打包一个 java 应用程序(我是这个工具的新手),应用程序本身必须在内部进行一些调用(使用 java 进程 api)

如果 java 应用程序以管理员权限启动,这将正常工作。例如,如果我运行我的 jar 应用程序sudo java -jar application.jar,那么所有子进程也都成为管理员。

出于分发目的,我无法控制用户将如何启动应用程序。因此尝试使用 java packager 工具-但我需要强制应用程序以管理员权限运行。(例如,如果用户没有 sudo,应用程序将停止)

我强烈希望避免的另一种解决方法是在我启动内部进程时要求用户输入他们的管理员/sudo 密码。

---编辑--- 我认为我需要在得到评论和答案后添加更多背景。尽管问题似乎与是否检测管理员有关..这不是我的问题。

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

format.app需要管理员才能工作。

我使用 javapackager 工具来分发 MyApp.app (for mac) MyApp.exe (for windows) 等...

  • 我希望 MyApp.app 只能由管理员用户执行。这意味着如果用户尝试启动 MyApp.app 没有管理员权限,他的操作系统会提示输入凭据,否则操作系统将不允许应用程序启动.

  • 我的解决方法是使用 sudo 但他们我需要提示用户输入密码.. 这对我来说是一个安全问题(提示不是本机)和 2/我这种方法较弱并且可能会在附加到密码时暴露密码过程

4

2 回答 2

-1

这是一个检测 Java 应用程序是否以 Windows 管理员身份运行的示例实现,并带有一些额外的内容来表明我想象它可以如何工作。

主类

如果您愿意,这就是“启动器”。这是检查管理员权限的“主要”方法。如果它们存在,则使用提供的参数调用“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!");
    }
}
于 2019-01-27T18:36:49.880 回答
-1

通过将预安装脚本添加到 javapackager 来解决。该脚本将在部署时以 root 身份运行,让我可以控制在运行时准备应用程序所需的任何内容。

于 2019-02-06T23:34:15.570 回答