如何以管理员身份将打包的 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)等...
我希望 MyApp.app 只能由管理员用户执行。这意味着如果用户尝试启动 MyApp.app 没有管理员权限,他 OS 会提示输入凭据,否则 os 将不允许应用程序启动。
我的解决方法是使用 sudo 但他们我需要提示用户输入密码.. 这对我来说是一个安全问题(提示不是本地的)和 2/我这个方法是较弱,可能会在附加到进程时 ose 密码
这是 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 添加预安装脚本解决。该脚本将 运行 在部署时作为根用户让我控制在 运行 时间准备应用程序需要的任何东西。
我正在尝试使用 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)等...
我希望 MyApp.app 只能由管理员用户执行。这意味着如果用户尝试启动 MyApp.app 没有管理员权限,他 OS 会提示输入凭据,否则 os 将不允许应用程序启动。
我的解决方法是使用 sudo 但他们我需要提示用户输入密码.. 这对我来说是一个安全问题(提示不是本地的)和 2/我这个方法是较弱,可能会在附加到进程时 ose 密码
这是 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 添加预安装脚本解决。该脚本将 运行 在部署时作为根用户让我控制在 运行 时间准备应用程序需要的任何东西。