Подтвердить что ты не робот

Обнаружение, если приложение Java было запущено как администратор Windows

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

4b9b3361

Ответ 1

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

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;
}

Он ТОЛЬКО работает над окнами и встроен в основной пакет Java. Я просто проверил этот код, и он работает. Это меня удивило, но это так.

SID S-1-5-32-544 является идентификатором группы "Администратор" в операционной системе Windows.

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

Ответ 2

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

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áš Zato, вы можете захотеть подавить сообщения об ошибках, вызванные этим методом. Вы можете сделать это, установив 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);
        }
    }
}

Ответ 3

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

Ответ 4

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

Ответ 5

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

Ответ 6

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

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

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

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