Ответ 1
System.getProperty("user.name")
Как я могу получить имя пользователя/логин в 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")
в 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()
System.getProperty( "user.name" ) не является хорошей защитой, так как эта переменная среды может быть фальшивой: C:\set USERNAME = "Joe Doe" Ява... // предоставит вам 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 и более.
Я использую его в апплете, и он должен быть подписан. источник информации
вдохновленный @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 ) );
}
Использование JNA - просто:
String username = Advapi32Util.getUserName();
System.out.println(username);
Advapi32Util.Account account = Advapi32Util.getAccountByName(username);
System.out.println(account.accountType);
System.out.println(account.domain);
System.out.println(account.fqn);
System.out.println(account.name);
System.out.println(account.sidString);
"Установленное имя пользователя =" Имя пользователя "- это временное переопределение, которое существует только в том случае, когда окна cmd все еще работают, после его уничтожения переменная теряет значение. Поэтому я думаю, что
System.getProperty( "user.name" );
- это короткий и точный код для использования.
System.getenv().get("USERNAME");
- работает над окнами!
В свойствах среды у вас есть информация, необходимая для компьютера и хоста! Я говорю снова! Работает на WINDOWS!
Ниже приведено решение ТОЛЬКО для WINDOWS
В случаях, когда приложение (например, Tomcat) запускается как служба Windows, System.getProperty("user.name") или System.getenv(). Get ("USERNAME") возвращают пользователя, который запустил службу, а не пользователя. текущий вошедший в систему имя пользователя.
Также в Java 9 классы NTSystem и т.д. Не будут доступны
Итак, обходной путь для Windows: вы можете использовать wmic, поэтому вам нужно выполнить следующую команду
wmic ComputerSystem get UserName
Если доступно, будет возвращен вывод формы:
UserName
{domain}\{logged-in-user-name}
Примечание. Для окон необходимо использовать 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());
}