我正在尝试使用Java打包工具打包Java应用程序(我是这个工具的新手) 应用本身必须在内部进行一些调用(使用java进程api)
如果以admin特权启动Java应用程序,则此方法可以正常工作。例如,如果我以sudo java -jar application.jar
的身份运行jar应用,则所有子进程也将变为管理员。
出于分发目的,我无法控制用户如何启动应用程序。因此尝试使用Java打包器工具-但我需要强制使用管理员权限运行该应用程序。 (很好,如果用户没有sudo,应用程序将停止运行)
我强烈要避免的另一种解决方法是在启动内部进程时要求用户输入管理员密码。.
---编辑--- 我想我需要在评论和答案之后添加更多背景。因为它看起来虽然问题是关于检测管理员与否。 这不是我的问题。
class MyApp...
main(...){
System.exec("start format.app")
}
format.app
需要管理员才能工作。
我使用javapackager工具分发MyApp.app(对于Mac),MyApp.exe(对于Windows)等...
我希望MyApp.app仅可由管理员用户执行。.这意味着,如果用户尝试启动MyApp.app没有管理员权限,则操作系统将提示输入凭据,否则操作系统将不允许应用启动。
我的解决方法是使用sudo,但是我需要提示用户输入密码。.对我来说,这是安全问题(提示不是Native),并且2 /我这种方法较弱并且可能会暴露附加到进程时的密码
答案 0 :(得分:0)
这是Detect if Java application was run as a Windows admin的示例实现,并带有一些额外的内容来指示我想象它如何工作。
如果可以的话,这就是“发射器”。它是检查管理员权限的“主要”方法。如果存在,则使用提供的参数调用“ 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);
}
}
}
这是需要管理员特权的类。
package com.so.test.admindemo;
public class AdminOnlyClass {
public static void main(String[] args) {
System.out.println("Got admin!");
}
}
答案 1 :(得分:0)
通过将预安装脚本添加到javapackager中来解决。该脚本将在部署时以root用户身份运行,从而使我可以控制运行时应用所需的任何内容。