From cc175505dbc2c6e0e2fd484e6a38cbccfecc4acd Mon Sep 17 00:00:00 2001 From: ShulkerSakura <2531493755@qq.com> Date: Thu, 4 Sep 2025 19:25:08 +0800 Subject: [PATCH] Add Admin Checker --- .../java/org/jackhuang/hmcl/Launcher.java | 6 +-- .../org/jackhuang/hmcl/util/AdminChecker.java | 43 +++++++++++++++++++ 2 files changed, 45 insertions(+), 4 deletions(-) create mode 100755 HMCL/src/main/java/org/jackhuang/hmcl/util/AdminChecker.java diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/Launcher.java b/HMCL/src/main/java/org/jackhuang/hmcl/Launcher.java index efa971ced..b060de4b6 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/Launcher.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/Launcher.java @@ -29,15 +29,12 @@ import javafx.stage.Stage; import org.jackhuang.hmcl.setting.ConfigHolder; import org.jackhuang.hmcl.setting.SambaException; import org.jackhuang.hmcl.ui.FXUtils; -import org.jackhuang.hmcl.util.FileSaver; +import org.jackhuang.hmcl.util.*; import org.jackhuang.hmcl.task.AsyncTaskExecutor; import org.jackhuang.hmcl.task.Schedulers; import org.jackhuang.hmcl.ui.Controllers; import org.jackhuang.hmcl.upgrade.UpdateChecker; import org.jackhuang.hmcl.upgrade.UpdateHandler; -import org.jackhuang.hmcl.util.CrashReporter; -import org.jackhuang.hmcl.util.Lang; -import org.jackhuang.hmcl.util.StringUtils; import org.jackhuang.hmcl.util.io.JarUtils; import org.jackhuang.hmcl.util.platform.Architecture; import org.jackhuang.hmcl.util.platform.CommandBuilder; @@ -254,6 +251,7 @@ public final class Launcher extends Application { LOG.info("Java Version: " + System.getProperty("java.version") + ", " + System.getProperty("java.vendor")); LOG.info("Java VM Version: " + System.getProperty("java.vm.name") + " (" + System.getProperty("java.vm.info") + "), " + System.getProperty("java.vm.vendor")); LOG.info("Java Home: " + System.getProperty("java.home")); + LOG.info("User Privilege: " + AdminChecker.isAdmin()); LOG.info("Current Directory: " + Metadata.CURRENT_DIRECTORY); LOG.info("HMCL Global Directory: " + Metadata.HMCL_GLOBAL_DIRECTORY); LOG.info("HMCL Current Directory: " + Metadata.HMCL_CURRENT_DIRECTORY); diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/util/AdminChecker.java b/HMCL/src/main/java/org/jackhuang/hmcl/util/AdminChecker.java new file mode 100755 index 000000000..b3fcb95e7 --- /dev/null +++ b/HMCL/src/main/java/org/jackhuang/hmcl/util/AdminChecker.java @@ -0,0 +1,43 @@ +package org.jackhuang.hmcl.util; + +import org.jackhuang.hmcl.util.platform.OperatingSystem; +import org.jackhuang.hmcl.util.platform.windows.WinReg; + +public class AdminChecker { + + public static boolean isAdmin() { + if (OperatingSystem.CURRENT_OS == OperatingSystem.WINDOWS) { + return isWindowsAdmin(); + } else if (OperatingSystem.CURRENT_OS.isLinuxOrBSD() && OperatingSystem.CURRENT_OS == OperatingSystem.MACOS) { + return isUnixRoot(); + } else { + // 未知系统,保守返回 false + System.err.println("Unknown OS: " + OperatingSystem.CURRENT_OS); + return false; + } + } + + private static boolean isWindowsAdmin() { + WinReg reg = WinReg.INSTANCE; + try { + return reg.exists(WinReg.HKEY.HKEY_USERS, "S-1-5-19"); + } catch (Throwable t) { + // 捕获 AccessException、JNA 错误等 + return false; + } + } + + private static boolean isUnixRoot() { + try { + ProcessBuilder pb = new ProcessBuilder("id", "-u"); + Process process = pb.start(); + java.util.Scanner scanner = new java.util.Scanner(process.getInputStream()); + String uid = scanner.hasNext() ? scanner.next() : ""; + scanner.close(); + process.waitFor(); + return "0".equals(uid.trim()); + } catch (Exception e) { + return false; + } + } +} \ No newline at end of file