【问题标题】:How to check for administrator privileges in OS X?如何在 OS X 中检查管理员权限?
【发布时间】:2015-09-11 10:09:57
【问题描述】:

我是跨平台 Java 应用程序的开发人员。我对 OS X 几乎一无所知。我们有一个通用方法 isAdmin() 用于确定当前进程是否具有管理员/root 权限。然后,此信息将在应用程序的其他各个地方使用,以确定要为特权操作提供哪些选项或采取哪些操作。

我们有工作方法来检查 Windows 和 Linux,但到目前为止,这只是为 OS X 返回“true”。这在大多数情况下都有效,因为在 OS X 中创建的第一个用户自动具有管理员权限,我猜测大多数 OS X 使用场景实际上是单用户。然而,这不是一个合适的解决方案,我想解决这个问题。

我认为没有纯 Java 方法可以做到这一点,因此运行外部进程并解析结果是可以接受的。我们存储结果,因此每个会话只执行一次查询。

我的理解是,管理员权限与 OS X 底层 BSD 基础中的 root 权限不同,而是 Apple 在其上构建的。我不太清楚有什么区别,但似乎管理员帐户具有 sudo 权限,因此确定 sudo 权限可能是一种方法。

如何判断当前进程是否有管理员权限?我不知道该进程当前是否已提升,但它运行的用户是否有可能提升。

【问题讨论】:

标签: java macos privileges


【解决方案1】:

根据 mattinbits 的建议,我最终得到了以下 Java 代码:

public boolean isAdmin() {
    if (Platform.isMac()) {
        try {
            Process p = Runtime.getRuntime().exec("id -Gn");
            InputStream is = p.getInputStream();
            InputStreamReader isr = new InputStreamReader(is, StandardCharsets.US_ASCII);
            BufferedReader br = new BufferedReader(isr);
            p.waitFor();
            int exitValue = p.exitValue();
            String exitLine = br.readLine();
            if (exitValue != 0 || exitLine == null || exitLine.isEmpty()) {
                HandleError..
                return false;
            }
            if (exitLine.matches(".*\\badmin\\b.*")) {
                return true;
            }
            return false;
        } catch (IOException | InterruptedException e) {
            HandleError..
        }
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-11-25
    • 2017-10-08
    • 1970-01-01
    • 2015-04-02
    • 2015-07-05
    • 1970-01-01
    • 2012-06-03
    相关资源
    最近更新 更多