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

时间:2010-12-03 22:19:14

标签: java windows admin privileges

我有一个Java应用程序。无论如何,我可以判断该进程是否在Windows 7上以管理员权限运行。

8 个答案:

答案 0 :(得分:30)

我找到了一个似乎与平台无关的不同解决方案。它试图编写系统偏好。如果失败,则用户可能不是管理员。

建议Tomáš Zato,您可能希望禁止此方法导致的错误消息。您可以通过设置System.err

来完成此操作
import java.io.OutputStream;
import java.io.PrintStream;
import java.util.prefs.Preferences;

import static java.lang.System.setErr;
import static java.util.prefs.Preferences.systemRoot;

public class AdministratorChecker
{
    public static final boolean IS_RUNNING_AS_ADMINISTRATOR;

    static
    {
        IS_RUNNING_AS_ADMINISTRATOR = isRunningAsAdministrator();
    }

    private static boolean isRunningAsAdministrator()
    {
        Preferences preferences = systemRoot();

        synchronized (System.err)
        {
            setErr(new PrintStream(new OutputStream()
            {
                @Override
                public void write(int b)
                {
                }
            }));

            try
            {
                preferences.put("foo", "bar"); // SecurityException on Windows
                preferences.remove("foo");
                preferences.flush(); // BackingStoreException on Linux
                return true;
            } catch (Exception exception)
            {
                return false;
            } finally
            {
                setErr(System.err);
            }
        }
    }
}

答案 1 :(得分:21)

我在网上找到了这段代码片段,我认为它会为你完成这项工作。

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包中。我刚刚测试了这段代码,它确实有效。它让我感到惊讶,但确实如此。

SID S-1-5-32-544是Windows操作系统中Administrator组的ID。

Here is the link了解其工作原理的详细信息。

答案 2 :(得分:5)

Java Runtime Environment中没有这样的工具,但可能是依赖于平台的本机例程。请注意,通常最好的方法是确实尝试这样做,看看它是否失败。

答案 3 :(得分:3)

仅通过尝试需要此类访问的操作(例如绑定低编号端口或打开已知的受保护文件)。

答案 4 :(得分:2)

标记为最佳的答案中的方法对我来说很有效,直到我必须在Linux机器上的Jenkins中构建代码。 com.sun.security.auth.module.NTSystem()在那里不可用,并且使用sun包通常被认为是一种不好的做法: link

答案 5 :(得分:0)

或者你可以这样做:

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

查看哪个用户启动了该过程。

当我像我一样运行它时,我得到了“goran”,当我用sudo运行它时,我得到了“root”。适用于Linux。 可能需要什么。

答案 6 :(得分:0)

这是Windows 10上的解决方案,我想它也可以在其他Windows操作系统上正常运行。

PasteSpecial(xlPasteValues).PasteSpecial(xlPasteFormats)

答案 7 :(得分:0)

以下代码为我完成了

命令提示符命令

net user

Java代码

public static  boolean isAdmin() {
        StringBuilder outputbuilder = new StringBuilder();
    try {
        ProcessBuilder builder = new ProcessBuilder(
                "cmd.exe","/c" ,"net user");
        builder.redirectErrorStream(true);
        Process p = builder.start();
        BufferedReader r = new BufferedReader(new InputStreamReader(p.getInputStream()));
        String line;
        while (true) {
            line = r.readLine();
            if (line == null) { break; }
            outputbuilder.append(line);
        }
    } catch (IOException e) {
        e.printStackTrace();
        return false;
    }
    System.out.println(outputbuilder.toString());
    return outputbuilder.toString().contains("Administrator");
}