【问题标题】:How to enforce packaged java app to run as admin如何强制打包的 java 应用程序以管理员身份运行
【发布时间】:2019-01-26 22:25:44
【问题描述】:

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

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

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

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

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

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

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

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

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

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

【问题讨论】:

  • 绝对不是上述参考文献的重复。我想要求捆绑的应用程序只能以管理员身份运行。如果用户启动了应用程序,操作系统会立即要求以管理员身份运行应用程序
  • 如果问题不是关于检测管理员,而是需要管理员权限,我认为你需要从下往上重新考虑问题的措辞......

标签: java admin sudo javapackager


【解决方案1】:

这是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);
        }
    }

}

AdminOnlyClass

这是需要管理员权限的类。

package com.so.test.admindemo;

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 2012-08-08
      • 2013-06-17
      • 2011-02-18
      相关资源
      最近更新 更多