如何检查 OS X 中的管理员权限?
How to check for administrator privileges in OS X?
我是跨平台 Java 应用程序的开发人员。我对 OS X 几乎一无所知。我们有一个通用方法 isAdmin() 用于确定当前进程是否具有 administrator/root 权限。然后,此信息将用于应用程序中的其他各个位置,以确定要为特权操作提供哪些选项或采取哪些操作。
我们有工作方法来检查 Windows 和 Linux,但直到现在这只是 returns "true" 用于 OS X。这行得通大多数情况下,因为在 OS X 中创建的第一个用户自动拥有管理员权限,我猜测大多数 OS X 使用场景实际上是单用户。然而,这不是一个合适的解决方案,我想解决这个问题。
我认为没有纯粹的 Java 方法可以做到这一点,因此 运行 外部进程和解析结果是可以接受的。我们存储结果,因此每个会话仅执行一次查询。
我的理解是,管理员权限与 OS X 的底层 BSD 基础中的 root 权限不同,而是 Apple 建立在其之上的东西。我不太清楚有什么区别,但管理员帐户似乎具有 sudo 权限,因此确定 sudo 权限可能是一种方式。
如何判断当前进程是否有管理员权限?我不知道该进程当前是否已提升,但它运行的用户是否有可能提升。
根据 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..
}
}
}
我是跨平台 Java 应用程序的开发人员。我对 OS X 几乎一无所知。我们有一个通用方法 isAdmin() 用于确定当前进程是否具有 administrator/root 权限。然后,此信息将用于应用程序中的其他各个位置,以确定要为特权操作提供哪些选项或采取哪些操作。
我们有工作方法来检查 Windows 和 Linux,但直到现在这只是 returns "true" 用于 OS X。这行得通大多数情况下,因为在 OS X 中创建的第一个用户自动拥有管理员权限,我猜测大多数 OS X 使用场景实际上是单用户。然而,这不是一个合适的解决方案,我想解决这个问题。
我认为没有纯粹的 Java 方法可以做到这一点,因此 运行 外部进程和解析结果是可以接受的。我们存储结果,因此每个会话仅执行一次查询。
我的理解是,管理员权限与 OS X 的底层 BSD 基础中的 root 权限不同,而是 Apple 建立在其之上的东西。我不太清楚有什么区别,但管理员帐户似乎具有 sudo 权限,因此确定 sudo 权限可能是一种方式。
如何判断当前进程是否有管理员权限?我不知道该进程当前是否已提升,但它运行的用户是否有可能提升。
根据 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..
}
}
}