Определить, было ли приложение Java запущено от имени администратора Windows - PullRequest
19 голосов
/ 04 декабря 2010

У меня есть приложение на Java.Могу ли я в любом случае сказать, был ли процесс запущен с правами администратора, в Windows 7.

Ответы [ 8 ]

30 голосов
/ 08 мая 2014

Я нашел другое решение, которое кажется независимым от платформы. Он пытается написать системные настройки. Если это не удастся, пользователь может не быть администратором.

Как и 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);
            }
        }
    }
}
21 голосов
/ 04 декабря 2010

Я нашел этот фрагмент кода в Интернете, который, я думаю, сработает за вас.

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.

Вотссылка для более подробной информации о том, как это работает.

5 голосов
/ 04 декабря 2010

В Java Runtime Environment такой возможности нет, но она может быть в зависимой от платформы собственной подпрограмме.Обратите внимание, что обычно лучший способ убедиться в этом - попытаться это сделать и посмотреть, не получится ли это.

3 голосов
/ 04 декабря 2010

Только путем попытки выполнить операцию, требующую такого доступа (например, связать порт с небольшим номером или открыть файл, который должен быть защищен).

2 голосов
/ 07 марта 2012

Метод из ответа, помеченного как лучший, работал хорошо для меня до того момента, когда мне пришлось создавать код в Jenkins на компьютере с Linux.com.sun.security.auth.module.NTSystem () там недоступен, и использование пакетов sun обычно считается плохой практикой: ссылка

0 голосов
/ 14 февраля 2019

Ниже сработал код для меня

Командная строка команды

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");
}
0 голосов
/ 24 августа 2018

Вот решение для Windows 10, я думаю, что оно работает правильно и на других ОС Windows.

public static boolean isAdmin() {
    try {
        ProcessBuilder processBuilder = new ProcessBuilder("cmd.exe");
        Process process = processBuilder.start();
        PrintStream printStream = new PrintStream(process.getOutputStream(), true);
        Scanner scanner = new Scanner(process.getInputStream());
        printStream.println("@echo off");
        printStream.println(">nul 2>&1 \"%SYSTEMROOT%\\system32\\cacls.exe\" \"%SYSTEMROOT%\\system32\\config\\system\"");
        printStream.println("echo %errorlevel%");

        boolean printedErrorlevel = false;
        while (true) {
            String nextLine = scanner.nextLine();
            if (printedErrorlevel) {
                int errorlevel = Integer.parseInt(nextLine);
                return errorlevel == 0;
            } else if (nextLine.equals("echo %errorlevel%")) {
                printedErrorlevel = true;
            }
        }
    } catch (IOException e) {
        return false;
    }
}
0 голосов
/ 04 декабря 2010

Или вы можете сделать это:

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

И посмотрите, какой пользователь запустил процесс.

Когда я запускаю его как я, я получаю "goran", когда я запускаю его с sudo, я получаю "root" Работает на Linux. Вероятно, то, что было нужно.

...