Обнаружение, если приложение Java было запущено как администратор Windows
У меня есть приложение Java. Есть ли в любом случае, я могу сказать, был ли процесс запущен с правами администратора, в Windows 7.
Ответы
Ответ 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.
Возможно, что было необходимо.