Как я могу получить имя пользователя / имя для входа в Java?
Это код, который я пробовал ...
try{
LoginContext lc = new LoginContext(appName,new TextCallbackHandler());
lc.login();
Subject subject = lc.getSubject();
Principal principals[] = (Principal[])subject.getPrincipals().toArray(new Principal[0]);
for (int i=0; i<principals.length; i++) {
if (principals[i] instanceof NTUserPrincipal || principals[i] instanceof UnixPrincipal) {
String loggedInUserName = principals[i].getName();
}
}
}
catch(SecurityException se){
System.out.println("SecurityException: " + se.getMessage());
}
Я получаю, SecurityException
когда пытаюсь запустить этот код. Не мог бы кто-нибудь сказать мне, иду ли я в правильном направлении, и помочь мне разобраться в проблеме.
Ответы:
System.getProperty("user.name")
источник
user.name
свойства?в Unix:
new com.sun.security.auth.module.UnixSystem().getUsername()
в Windows:
new com.sun.security.auth.module.NTSystem().getName()
в Solaris:
new com.sun.security.auth.module.SolarisSystem().getUsername()
источник
user.name
свойство должно иметь значение null. Я согласен с @JinKim, не пишите вещи, зависящие от ОС.вдохновленный ответом @newacct , код, который можно скомпилировать на любой платформе:
String osName = System.getProperty( "os.name" ).toLowerCase(); String className = null; String methodName = "getUsername"; if( osName.contains( "windows" ) ){ className = "com.sun.security.auth.module.NTSystem"; methodName = "getName"; } else if( osName.contains( "linux" ) ){ className = "com.sun.security.auth.module.UnixSystem"; } else if( osName.contains( "solaris" ) || osName.contains( "sunos" ) ){ className = "com.sun.security.auth.module.SolarisSystem"; } if( className != null ){ Class<?> c = Class.forName( className ); Method method = c.getDeclaredMethod( methodName ); Object o = c.newInstance(); System.out.println( method.invoke( o ) ); }
источник
com.sun
классы не доступны по умолчанию в Java 9+. Это решение не подойдет.System.getProperty ("user.name") не является хорошим вариантом безопасности, поскольку эта переменная среды может быть подделана: C: \ set USERNAME = "Joe Doe" java ... // предоставит вам System.getProperty ("user. name ") Вам следует сделать:
com.sun.security.auth.module.NTSystem NTSystem = new com.sun.security.auth.module.NTSystem(); System.out.println(NTSystem.getName());
JDK 1.5 и выше.
Я использую его в апплете, и он должен быть подписан. источник информации
источник
com.sun.security.auth.module.NYSystem
более высокого уровня в пути к классам? Я не знаю, пытается ли среда выполнения Java предотвратить такие эксплойты, но я не думаю, что будет какой-либо ненадежный способ сделать его `` безопасным '', кроме запуска кода в поле, недоступном для потенциально вредоносного клиента. .Используя JNA, это просто:
https://github.com/java-native-access/jna
источник
«Установлено Имя пользователя =„Имя пользователя“» временная коррекция , которая существует только до тех пор , пока CMD окна все еще вверх, как только он убит, переменная теряет значение. Так что я думаю
по-прежнему короткий и точный код для использования.
источник
System.getenv().get("USERNAME");
- работает на окнах!В свойствах среды у вас есть необходимая информация о компьютере и хосте! Я еще раз говорю! Работает на WINDOWS!
источник
System.getenv("username")
? :)Ниже приведено решение ТОЛЬКО для WINDOWS
В случаях, когда приложение (например, Tomcat) запускается как служба Windows, System.getProperty ("user.name") или System.getenv (). Get ("USERNAME") возвращают пользователя, запустившего службу, а не имя текущего авторизованного пользователя.
Также в Java 9 классы NTSystem и т. Д. Не будут доступны
Итак, обходной путь для Windows: вы можете использовать wmic , поэтому вам нужно выполнить следующую команду
Если доступно, это вернет вывод формы:
Примечание: для окон вам нужно использовать cmd / c в качестве префикса, поэтому ниже в качестве примера представлена грубая программа:
Process exec = Runtime.getRuntime().exec("cmd /c wmic ComputerSystem get UserName".split(" ")); System.out.println(exec.waitFor()); try (BufferedReader bw = new BufferedReader(new InputStreamReader(exec.getInputStream()))) { System.out.println(bw.readLine() + "\n" + bw.readLine()+ "\n" + bw.readLine()); }
источник