检测Java应用程序是否作为Windowspipe理员运行

我有一个Java应用程序。 是否有无论如何,我可以告诉如果进程在Windows 7上以pipe理员权限运行。

我在网上发现了这个代码片段,我认为它会为你做这个工作。

public static boolean isAdmin() { String groups[] = (new com.sun.security.auth.module.NTSystem()).getGroupIDs(); for (String group : groups) { if (group.equals("S-1-5-32-544")) return true; } return false; } 

它只能在Windows上工作,并且内置到核心Java包中。 我只是testing这个代码,它确实工作。 这令我感到惊讶,但它确实如此。

SID S-1-5-32-544是Windows操作系统中pipe理员组的标识。

这是链接的更多细节如何工作。

我发现了一个不同的解决scheme,似乎是平台无关的。 它试图编写系统首选项。 如果失败,用户可能不是pipe理员。

 public static boolean isAdmin(){ Preferences prefs = Preferences.systemRoot(); try{ prefs.put("foo", "bar"); // SecurityException on Windows prefs.remove("foo"); prefs.flush(); // BackingStoreException on Linux return true; }catch(Exception e){ return false; } } 

正如TomášZatobuild议的那样,您可能想要抑制由此方法引起的错误消息。 你可以通过设置System.err来做到这一点:

 public static boolean isAdmin(){ Preferences prefs = Preferences.systemRoot(); PrintStream systemErr = System.err; synchronized(systemErr){ // better synchroize 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); } } } 

在Java运行时环境中没有这样的工具,但可能在平台相关的本地例程中。 请注意,通常最好的方法是确实尝试去做,看看是否失败。

只有通过尝试进行需要这种访问的操作(例如绑定低编号的端口,或打开一个已知的受保护文件)。

从标记的答案中最好的方法对我来说很好,直到我不得不在Linux机器上的Jenkins中构build代码。 com.sun.security.auth.module.NTSystem()在那里不可用,使用sun软件包通常被认为是不好的做法: link

或者你可以这样做:

System.getenv().get("USER")

看看哪个用户开始了这个过程。

当我运行它作为我时,我得到“戈兰”,当我运行与sudo我得到“根”。 在Linux上运行。 可能是需要的。