如何在OS X中检查管理员权限?

时间:2015-09-11 10:09:57

标签: java macos privileges

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

我们有办法对Windows和Linux进行检查,但是到目前为止,它只是为OS X返回“true”。这大部分时间都是有效的,因为在OS X中创建的第一个用户自动具有管理员权限而我是猜测大多数OS X使用场景在实践中都是单用户。然而,这不是一个合适的解决方案,我想解决这个问题。

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

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

如何确定当前进程是否具有管理员权限?我不想知道这个过程目前是否有所提升,但是如果它运行的用户有可能提升。

1 个答案:

答案 0 :(得分:0)

根据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..
        }
    }
}