如何以管理员身份将打包的 java 应用强制执行到 运行

How to enforce packaged java app to run as admin

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

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

对于分发 purpose,我无法控制用户启动应用程序的方式。 因此尝试使用 java 打包工具- 但我需要强制该应用 运行 具有管理员权限。 (例如,如果用户没有 sudo,应用程序将会停止)

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

---编辑--- 我想我需要在收到评论和答案后添加更多背景信息。看起来问题是关于检测管理员与否.. 这不是我的问题。

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

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

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

这是 Detect if Java application was run as a Windows admin 的一个示例实现,有一点额外说明我想象它的工作原理。

主类

如果您愿意,这就是 "launcher"。这是检查管理员权限的“主要”方法。如果它们存在,则使用提供的参数调用 "Real" class。该程序将 运行 在确切的 jvm 中。

如果没有,系统会提示用户 "this application needs admin privileges to run" 消息

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

这是 class 需要管理员权限。

package com.so.test.admindemo;

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

已通过向 javapackager 添加预安装脚本解决。该脚本将 运行 在部署时作为根用户让我控制在 运行 时间准备应用程序需要的任何东西。