Java текущее имя машины и вошедший в систему пользователь?

153

Можно ли получить имя вошедшего в систему пользователя (Windows / Unix) и имя хоста машины?

Я предполагаю, что это просто свойство некоторого статического класса среды.

Я нашел это для имени пользователя

com.sun.security.auth.module.NTSystem NTSystem = new
        com.sun.security.auth.module.NTSystem();
System.out.println(NTSystem.getName());

и это для машинного имени:

import java.net.InetAddress;
...
String computerName;
...
try {
    computerName = InetAddress.getLocalHost().getHostName();
}

catch(Exception ex) {
    ...
}

Первый только для Windows?

И что будет делать второй, если у вас не установлено имя хоста?

Омар Кохеджи
источник
NTSystemКласс существует только на Windowsраспределениях JDK
BullyWiiPlaza

Ответы:

256

Чтобы получить зарегистрированного пользователя:

System.getProperty("user.name"); //platform independent 

и имя хоста машины:

java.net.InetAddress localMachine = java.net.InetAddress.getLocalHost();
System.out.println("Hostname of local machine: " + localMachine.getHostName());
cordellcp3
источник
1
Работает ли System.getProperty("user.name"); на Windows и Linux?
сом
5
Однако это user.nameзначение может быть подделано , поэтому его не следует использовать для аутентификации.
Raedwald
14
System.getProperty ("user.name") в данный момент НЕ вошел в систему как пользователь, это пользователь, в контексте безопасности которого работает JVM.
rkosegi
1
Что касается того, что OP называет «имя компьютера» или «имя компьютера», этот ответ неверен. У Java нет способа получить «имя компьютера», то есть имя, назначенное компьютеру на раннем этапе процесса загрузки и не имеющее отношения к сети. Все ОС имеют эту концепцию, но, к сожалению, это значение не раскрывается в Java. Однако часто - но не всегда - вышеупомянутый метод действительно возвращает имя компьютера. См. Stackoverflow.com/a/40702767/1504556 для объяснения.
Петер
91

Чтобы получить зарегистрированного пользователя:

System.getProperty("user.name");

Чтобы получить имя хоста машины:

InetAddress.getLocalHost().getHostName();

Чтобы ответить на последнюю часть вашего вопроса, Java API говорит, что getHostName () вернет

имя хоста для этого IP-адреса или, если операция не разрешена проверкой безопасности, текстовое представление IP-адреса.

Билл Ящерица
источник
Upvote за четкие и лаконичные ответы на все оригинальные вопросы ОП. Конечно, это должен быть принятый ответ
Энди
1
Согласитесь с @Andy - проголосуйте за четкий и краткий ответ на все вопросы.
Пол Иден
9

Использование user.nameнебезопасно, поскольку переменные окружения могут быть сфальсифицированы. Метод, который вы использовали, хорош, есть аналогичные методы и для ОС на основе Unix

Феникс
источник
Так что это просто для окон? Есть ли независимый от платформы способ сделать это?
Стюарт Р. Джефферис
7
Системные свойства не являются переменными среды. Используйте System.getenv ("USER") для переменных среды. System.properties все еще может быть установлен пользователем на Java с командной строки Java -Duser.name = someoneelse так до сих пор не безопасно
дан извозчика
«Существуют похожие методы и для ОС на основе Unix»: спасибо, что я искал. Так каков метод для этих ОС? мое исследование, в настоящее время проводится мной ... здесь :) с помощью "whoami"?
pdem
Извините за спам, я пришел сюда, чтобы дать своего рода решение в C:: stackoverflow.com/questions/1451825/… Поэтому в основном мы должны использовать либо whoami, либо JNI с кодом C "getpwuid (getuid ())" , Класса UnixSystem больше нет.
pdem
1

Чтобы получить текущий зарегистрированный путь пользователя:

System.getProperty("user.home");
Swapnil1156035
источник